потоковый xml парсинг + dtd валидация

camka

не самка
потоковый 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>
xmldtd.php
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);
?>
php код находит только ошибки, связаные с well-formed xml. то есть, если где-то не закрыт тэг и т.д. а мне надо отлавливать ошибки расхождения с правилами, указаными в dtd.


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_parser_set_option() не обнаружилось. в списке констант тоже не видать ничего подходящего. ни уж то никак?




-----------------------


Порылся в поиске (согласен, что не особо своевременно) и, как оказалось, видимо xml_* функции не валидируют xml по dtd, однако, чтоб это было где-то официально заявлено - не обнаружил. Зато обнаружил вот такой класс - http://pear.php.net/package/XML_DTD Надеюсь кому-то поможет.
 
Сверху