【问题标题】:Is there any way to retrieve the comments from an XML file?有没有办法从 XML 文件中检索评论?
【发布时间】:2009-02-05 10:14:51
【问题描述】:

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

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

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

【问题讨论】:

    标签: php xml simplexml


    【解决方案1】:

    您可以使用 XMLReader 读取所有节点并提取 cmets。我已经包含了一些示例代码来帮助您入门,因为它只是拉出节点,并没有考虑到评论在 where 的内部、任何 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
    

    所以只有 cmets 的值(而不是 &lt;!-- --&gt;)以及空格会被采用。

    【讨论】:

    • 谢谢,我明天试一试,但看起来很简单:)
    【解决方案2】:

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

    【讨论】:

    【解决方案3】:

    如果您使用 XPath,这很简单。 comment() 函数匹配 cmets。所以模式

    //comment()
    

    查找文档中的所有 cmets。

    在 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 -->
       ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-05
      • 2016-06-07
      • 2020-06-16
      • 2015-12-11
      • 1970-01-01
      • 2016-01-10
      • 2015-10-28
      • 2014-04-10
      相关资源
      最近更新 更多