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

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

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);
}

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

//comment()

Используйте 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-файле.

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

void XMLCALL
XML_SetCommentHandler(XML_Parser p,
                      XML_CommentHandler cmnt);
Другие вопросы по тегам