选择的xpath父属性

时间:2013-06-05 21:57:42

标签: ruby-on-rails ruby xpath nokogiri

xml文档的语法:

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

我可以使用以下方法获取所有z元素:

xpath("//z")

但在那之后我卡住了,我不知道下一步该做什么。我真的不明白..父方法

的语法

那么,我如何获得元素父元素的属性?

3 个答案:

答案 0 :(得分:3)

不是遍历回父母,而是找到合适的父母开头:

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

答案 1 :(得分:3)

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

  • //z/ancestor::x/@name - 在任意位置查找<z>个元素,然后找到所有祖先<x>元素,然后找到它们的name="…"属性。

    < / LI>
  • //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并仅返回第二个名称。