2013-06-05 93 views
1

语法的XML文档:XPath的父属性

<x name="GET-THIS"> 
    <y> 
    <z>Z</z> 
    <z>Z__2</z> 
    <z>Z__3</z> 
    </y> 
</x> 

我能够用得到所有z元素:

xpath("//z") 

但在那之后我被困,我不确定接下来要做什么。我不太了解..父方法的语法

那么,如何获取元素的父级父元素的属性?

+1

尝试'xpath(“// x [// z]/@ name”)'。它将选择具有'z'元素作为后代的'x'元素,然后获取其'name'属性。 – Blender

+0

它的工作!非常感谢!添加它作为答案,我会接受它:) – Kush

回答

3

而是穿越回父的,只要找到合适的家长开始说起:

  • //x将选择所有x元素。
  • //x[//z]将选择所有具有z元素作为后代的所有x元素。
  • //x[//z]/@name将获得每个元素的name属性。
3

您已经有了一个良好的接受的答案,但这里有一些其他有用的表达式:

  • //z/ancestor::x/@name - 查找<z>元素的任何地方,然后发现所有的祖先<x>元素,然后的name="…"属性他们。

  • //z/../../@name - 寻找<z>元素,然后找到那些的父节点(一个或多个),然后将这些的父节点(一个或多个),然后最终集合的name属性(一个或多个)。

    • 这与//z/parent::*/parent::*/@name相同,其中*表示“具有任何名称的元素”。
  • //是有用的,但效率低下。如果您知道的层次是x/y/z,那么它是更有效地做类似//x[y/z]/@name

+0

非常有用,谢谢! – Kush

+0

对我来说,它是'*'帮助...我需要'parent :: */@ id'来工作...我尝试了'parent :: @ id'和'parent ::/@ id'和既没有工作。 – Nick

0

我没有的声誉,所以我不能用搅拌机添加注释,以接受的答案。但他的回答总体上不起作用。 正确的版本是

//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名()。