camka
не самка
потоковый xml парсинг + dtd валидация
---------
Прошу удалить этот топик из Оффтопика (http://phpclub.ru/talk/showthread.php?s=&threadid=56067&rand=0). Я так и не разобрался, как это сделать и дублировал его тут.
---------
xml.xml
xmldtd.php
php код находит только ошибки, связаные с well-formed xml. то есть, если где-то не закрыт тэг и т.д. а мне надо отлавливать ошибки расхождения с правилами, указаными в dtd.
js код, который делает то что нужно
думаю, что и пэхэпэшный дом объект тоже так может. но как же быть с поточным парсингом? никаких опций в xml_parser_set_option() не обнаружилось. в списке констант тоже не видать ничего подходящего. ни уж то никак?
-----------------------
Порылся в поиске (согласен, что не особо своевременно) и, как оказалось, видимо xml_* функции не валидируют xml по dtd, однако, чтоб это было где-то официально заявлено - не обнаружил. Зато обнаружил вот такой класс - http://pear.php.net/package/XML_DTD Надеюсь кому-то поможет.
---------
Прошу удалить этот топик из Оффтопика (http://phpclub.ru/talk/showthread.php?s=&threadid=56067&rand=0). Я так и не разобрался, как это сделать и дублировал его тут.
---------
xml.xml
Код:
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Tove</to>
<fromm>Jani</fromm>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
<ps>I love you</ps>
</note>
PHP:
<?php
$xml_parser = xml_parser_create();
$fp = fopen('xml.xml', "r");
while ($data = fread($fp, 2))
{
if (!xml_parse($xml_parser, $data, feof($fp)))
{
echo xml_error_string(xml_get_error_code($xml_parser)),xml_get_current_line_number($xml_parser);
}
}
xml_parser_free($xml_parser);
?>
js код, который делает то что нужно
Код:
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.validateOnParse="false"
xmlDoc.load("note_dtd_error.xml")
document.write("<br>Error Code: ")
document.write(xmlDoc.parseError.errorCode)
document.write("<br>Error Reason: ")
document.write(xmlDoc.parseError.reason)
document.write("<br>Error Line: ")
document.write(xmlDoc.parseError.line)
-----------------------
Порылся в поиске (согласен, что не особо своевременно) и, как оказалось, видимо xml_* функции не валидируют xml по dtd, однако, чтоб это было где-то официально заявлено - не обнаружил. Зато обнаружил вот такой класс - http://pear.php.net/package/XML_DTD Надеюсь кому-то поможет.