xml文档语法:
<x name="GET-THIS">
<y>
<z>Z</z>
<z>Z__2</z>
<z>Z__3</z>
</y>
</x>
我能得到所有的z元素使用:
xpath("//z")
但是在那之后我就卡住了,我不知道下一步该做什么。我真的不明白..
父方法
那么,我如何获得元素的父元素的父元素的属性呢?
不需要遍历父元素,只需找到合适的父元素:
-
//x
将选择所有x
元素。 -
//x[//z]
将选择所有具有z
元素作为后代的x
元素。 -
//x[//z]/@name
将获得这些元素的name
属性。
你已经有了一个公认的好答案,但这里有一些其他有用的表达:
-
//z/ancestor::x/@name
-查找任意位置的<z>
元素,然后查找所有祖先<x>
元素,然后查找它们的name="…"
属性。 -
//z/../../@name
-查找<z>
元素,然后查找这些元素的父节点,然后查找这些元素的父节点,然后查找最终集合的name
属性。- 这与:
//z/parent::*/parent::*/@name
相同,其中*
表示"具有任何名称的元素"。
- 这与:
-
//
是有用的,但效率低下。如果您知道层次结构是x/y/z
,那么执行//x[y/z]/@name
这样的操作会更有效。
我没有声誉,所以我不能在Blender接受的答案中添加评论。但他的回答一般来说是行不通的。正确的版本是
//x[.//z]/@name
解释很简单-当你使用像[//z]
这样的过滤器时,它会在全局上下关系中搜索'z',即如果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>
Filter [.//z]
使用当前节点(.)的上下文,即x
,并且只返回第二个名称。