Есть ли способ получить комментарии из файла XML? - PullRequest
2 голосов
/ 05 февраля 2009

Есть ли способ получить комментарии из файла XML?

У меня есть XML-файл с комментариями, и мне нужно создать пользовательский интерфейс на основе каждого узла в этом файле и связанных комментариев.

Я не могу найти способ получить эти комментарии. Я смог получить «некоторые» из них с помощью simpleXML, но он не работал для корневого узла и вел себя довольно странно ... некоторые комментарии были помещены в их собственный узел, некоторые оставлены как дочерние, и все комментарии были помещены в один и тот же узел ... Не уверен, что это имеет какой-то смысл :) Дело в том, что SimpleXML нарушил структуру комментариев, и это не помогло моим потребностям.

Ответы [ 3 ]

2 голосов
/ 05 февраля 2009

Вы можете использовать XMLReader для чтения всех узлов и получения комментариев. Я включил пример кода, чтобы вы начали, так как он просто вытягивает узлы и не учитывает , где комментарий находится внутри, ниже или выше любых узлов xml.

$comments = '';
$xml =<<<EOX
<xml>
    <!--data here -->
    <data>
        <!-- more here -->
        <more />
    </data>
</xml>
EOX;

$reader = new XMLReader();
$reader->XML($xml);

while ($reader->read()) {
  if ($reader->nodeType == XMLReader::COMMENT) {
      $comments .= "\n".$reader->value;
  }
}

$reader->close();

echo "all comments below:\n-------------------".$comments

Ожидаемый результат:

all comments below:
-------------------
 data here
 more here

Таким образом, будут взяты только значения комментариев (не <!-- -->), а также пробелы.

0 голосов
/ 09 февраля 2009

Это просто, если вы используете XPath. Функция comment() соответствует комментариям. Итак, шаблон

//comment()

находит все комментарии в документе.

В XSLT, для общего шаблона, где комментарий предшествует элементу, который вы трансформируете, например ::100100

<!-- This is the comment -->
<element>...

вы бы использовали шаблон как:

<xsl:template match="*[.::preceding-sibling()/comment()]">
   <xsl:variable name="comment" select=".::preceding-sibling()/comment()"/>
   <!-- xsl:value-of $comment will now give you the text of the comment -->
   ...
0 голосов
/ 05 февраля 2009

simpleXml хорош для быстрого захвата чего-либо, но у него есть ограничения. Вместо этого используйте парсер DOM. Или в этом случае, возможно, на основе событий (SAX или XmlReader).

...