xml文档的语法:
<x name="GET-THIS">
<y>
<z>Z</z>
<z>Z__2</z>
<z>Z__3</z>
</y>
</x>
我可以使用以下方法获取所有z元素:
xpath("//z")
但在那之后我卡住了,我不知道下一步该做什么。我真的不明白..
父方法
那么,我如何获得元素父元素的属性?
答案 0 :(得分:3)
不是遍历回父母,而是找到合适的父母开头:
//x
将选择所有x
元素。//x[//z]
会选择所有x
个元素作为后代。{/ li>
z
将获得每个元素的//x[//z]/@name
属性。答案 1 :(得分:3)
你已经有了一个很好的接受答案,但这里有一些其他有用的表达方式:
//z/ancestor::x/@name
- 在任意位置查找<z>
个元素,然后找到所有祖先<x>
元素,然后找到它们的name="…"
属性。
//z/../../@name
- 找到<z>
元素,然后找到那些元素的父节点,然后找到那些节点的父节点,然后找到{{1}最终集的属性。
name
相同,其中//z/parent::*/parent::*/@name
表示“具有任何名称的元素”。 *
很有用,但效率很低。如果您知道层次结构为//
,则执行x/y/z
答案 2 :(得分:0)
我没有声誉,所以我无法在Blender的接受回答中添加评论。但他的回答一般不会奏效。 正确的版本是
//x[.//z]/@name
说明很简单 - 当您使用[//z]
之类的过滤器时,它会搜索&#39; z&#39;在全局上下文中,即如果xml在xml中的任何位置包含至少一个节点 z ,则返回 true 。例如,它将从下面的xml中选择两个名称:
<root>
<x name="NOT-THIS">
</x>
<x name="GET-THIS">
<y>
<z>Z</z>
<z>Z__2</z>
<z>Z__3</z>
</y>
</x>
</root>
过滤[.//z]
使用当前节点(。)的上下文,即x
并仅返回第二个名称。