Как получить комментарии из XML-документа в PHP

Я хочу извлечь все комментарии ниже определенного узла в XML-документе, используя PHP. Я пробовал методы SimpleXML и DOMDocument, но все равно получаю пустые выходные данные. Есть ли способ получить комментарии из документа, не прибегая к регулярному выражению?


person Olaseni    schedule 31.12.2009    source источник


Ответы (4)


SimpleXML не может обрабатывать комментарии, но расширение DOM может. Вот как вы можете извлечь все комментарии. Вам просто нужно адаптировать выражение XPath к нужному узлу.

$doc = new DOMDocument;
$doc->loadXML(
    '<doc>
        <node><!-- First node --></node>
        <node><!-- Second node --></node>
    </doc>'
);

$xpath = new DOMXPath($doc);

foreach ($xpath->query('//comment()') as $comment)
{
    var_dump($comment->textContent);
}
person Josh Davis    schedule 01.01.2010
comment
Это полностью сработало! Хитрость заключалась в свойстве ‹textContent›. Это было причиной того, что я получал пустые результаты. Спасибо, Джош. Ты жжешь - person Olaseni; 01.01.2010

У вас есть доступ к XPath API? XPath позволяет вам находить комментарии, используя (например)

//comment()
person Brian Agnew    schedule 31.12.2009

Используйте XMLReader. Комментарии можно легко обнаружить/найти, они представляют собой xml-элементы типа COMMENT. Подробности см. в документации PHP: класс XMLReader.

Пример кода:

$reader = new XMLReader();
$reader->open('filename.xml');
while ($reader->read()){
    if ($reader->nodeType == XMLReader::COMMENT) {
        $comments[] = $reader->readOuterXml();
    }
}

А в массиве $comments будут все комментарии, найденные в XML-файле.

person Petr Pánek    schedule 21.01.2018

Если вы используете синтаксический анализатор SAX, управляемый событиями, синтаксический анализатор должен иметь событие для комментариев. Например, при использовании Expat вы должны реализовать обработчик и установить его, используя:

void XMLCALL
XML_SetCommentHandler(XML_Parser p,
                      XML_CommentHandler cmnt);
person Community    schedule 31.12.2009
comment
Иногда это неочевидно. SAX DefaultHandler в Java не обеспечивает обратный вызов для комментариев. Вы должны реализовать дополнительный интерфейс под названием LiteralHandler. Таким образом, обратные вызовы для комментариев не происходят по умолчанию (я не знаю, работают ли так другие языки/наборы инструментов) - person Brian Agnew; 31.12.2009