2

有没有办法从 XML 文件中检索评论?

我有一个 XML 文件,其中包含注释,我必须基于此文件中的每个节点以及相关的注释构建一个用户界面。

我似乎无法找到获得这些评论的方法。我能够使用simpleXML获得其中的“一些”,但它不适用于根节点,并且表现得很奇怪......一些评论被放在他们自己的节点中,其他一些被留下作为孩子,所有评论被放在同一个节点中......不确定这是否有意义:) 关键是 simpleXML 破坏了评论的结构,这对我的需求不利。

4

3 回答 3

2

您可以使用 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

因此,将仅采用注释的值(而不是<!-- -->)以及空格。

于 2009-02-05T16:14:00.547 回答
0

simpleXml 非常适合快速抓取某些东西,但它有局限性。请改用 DOM 解析器。或者在这种情况下,可能是基于事件的(SAX 或 XmlReader)。

于 2009-02-05T10:48:43.170 回答
0

如果您使用 XPath,这很简单。该comment()函数匹配注释。所以图案

//comment()

查找文档中的所有注释。

在 XSLT 中,对于注释位于要转换的元素之前的一般模式,例如:

<!-- 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 -->
   ...
于 2009-02-09T18:54:00.240 回答