语法的XML文档:XPath的父属性
<x name="GET-THIS">
<y>
<z>Z</z>
<z>Z__2</z>
<z>Z__3</z>
</y>
</x>
我能够用得到所有z元素:
xpath("//z")
但在那之后我被困,我不确定接下来要做什么。我不太了解..
父方法的语法
那么,如何获取元素的父级父元素的属性?
语法的XML文档:XPath的父属性
<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
我没有的声誉,所以我不能用搅拌机添加注释,以接受的答案。但他的回答总体上不起作用。 正确的版本是
//x[.//z]/@name
解释很简单 - 当你使用过滤器像[//z]
将在全球范围内的“Z”搜索,即返回真如果XML包含至少一个节点ž在任何地方XML。例如,它会从下面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
仅返回第2名()。
尝试'xpath(“// x [// z]/@ name”)'。它将选择具有'z'元素作为后代的'x'元素,然后获取其'name'属性。 – Blender
它的工作!非常感谢!添加它作为答案,我会接受它:) – Kush