【问题标题】:traverse XML tree to get attribute value遍历 XML 树获取属性值
【发布时间】:2013-07-05 21:17:44
【问题描述】:

这是我的 XML (sn-p):

<?xml version="1.0" encoding="utf-8"?>
<test>
    <body label_position="left">
    <page number="1">
        <itemset name="">
        <item name="" id="1" />
        <item name="" id="2" label_position="right" />  
    </itemset>
    </page>
    </body>
</test>

我想要完成的事情:
&lt;item id="1"&gt; 是否有 label_position 属性集?
(1) 如果是,请退回。
(2) 如果不是,请检查该节点的父节点的该属性。
(3) 如果父级有属性,则返回。
(4) 如果没有,转步骤(2)。 &lt;body&gt; 是要检查的“最旧”节点。

我的尝试:
我正在使用simplexmlxpath,我尝试选择&lt;item&gt; 及其所有祖先,然后向上遍历树并在第一次出现label_position 时停止。

$xml->xpath("//item[@id='1']::ancestors-or-self/@label_position");

产生了一个invalid expression

(1) 如何使这个表达式起作用?
(2) 这可以用“xpath-only”来完成吗 - 不遍历树并进行搜索?

编辑:多亏了 choroba 和 dirkk,我才得以将它们组合在一起:

$test = (string)array_reverse($xml->xpath("//item[@id='2']/ancestor-or-self::*/@label_position"))[0];

解释:如果&lt;item&gt;&lt;body&gt; 都具有该属性,xpath 将返回一个包含这两个值的数组,&lt;body&gt; 第一个。在这种情况下,我想先获得&lt;item&gt;,这就是为什么array_reverse()

看到它的工作:http://codepad.viper-7.com/jDPIde

【问题讨论】:

    标签: xml xpath simplexml php


    【解决方案1】:

    您的 XPath 无效。轴步长必须在元素名称之前,例如类似于axis::node,而不是相反。

    以下应该有效。你的逻辑已经是 xpath-only 并且遍历树完全没问题。

    (//item[@id='1']/ancestor-or-self::*/@label_position)[last()]
    

    【讨论】:

    • /data() 产生了一个“无效的表达式”,但没有它,它就像一个魅力。谢谢!
    • @michi 我更新了我的 XPath 以反映您编辑中的更改。您可以仅使用 XPath 完成此操作,无需使用 array_reverse
    • 真的不错!不过,确实需要额外的行来转换为字符串,请参阅codepad.viper-7.com/NflXLz
    【解决方案2】:

    您应该更加小心 XPath 语法。你表达的正确形式是

    //item[@id='1']/ancestor-or-self::*/@label_position
    

    您不能在谓词后使用::,而必须在轴后指定::

    【讨论】:

      猜你喜欢
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-03
      相关资源
      最近更新 更多