加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

遍历XML树以获取属性值

发布时间:2020-12-16 22:56:41 所属栏目:百科 来源:网络整理
导读:这是我的 XML(代码段): ?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 我想要完成的事情: item
这是我的 XML(代码段):

<?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>

我想要完成的事情:
< item id =“1”>是否设置了label_position属性?
(1)如果是,请将其退回.
(2)如果不是,请检查节点的父节点是否有该属性.
(3)如果父项具有该属性,则返回该属性.
(4)如果不是,转到步骤(2). <身体GT;是要检查的“最老的”节点.

我尝试过的:
我使用的是simplexml和xpath,我尝试选择< item>及其所有祖先然后向上遍历树并在第一次出现label_position时停止.

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

产生了无效的表达.

(1)如何使这个表达式工作?
(2)这可以用“仅xpath”来完成 – 不经过树并进行搜索吗?

编辑:感谢choroba&德克,我能把它放在一起:

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

说明:如果两者都是< item>和< body>如果有属性,xpath将返回一个包含两个值的数组,< body>一个先.在这种情况下,我想得到< item>首先,这就是array_reverse()的原因.

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

解决方法

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

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

你不能在谓词之后使用::并且你必须在轴之后指定::.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读