2

xml文档的语法:

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

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

xpath("//z")

但在那之后我被卡住了,我不知道下一步该怎么做。我不太了解..父方法的语法

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

4

3 回答 3

4

而不是遍历回到父级,只需找到正确的父级开始:

  • //x将选择所有x元素。
  • //x[//z]将选择所有xz元素为后代的元素。
  • //x[//z]/@name将获得name每个元素的属性。
于 2013-06-05T22:02:52.627 回答
3

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

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

  • //z/../../@name- 找到<z>元素,然后找到它们的父节点,然后找到它们的父节点,然后找到name最终集合的属性。

    • 这与: 相同//z/parent::*/parent::*/@name,其中*表示“具有任何名称的元素”。
  • //很有用,但效率低下。如果您知道层次结构是x/y/z,那么执行以下操作会更有效//x[y/z]/@name

于 2013-06-06T05:50:06.627 回答
0

我没有声誉,所以我无法对 Blender 接受的答案添加评论。但他的回答一般不会奏效。正确的版本是

//x[.//z]/@name

解释很简单 - 当您使用过滤器时[//z],它将在全局上下文中搜索“z”,即如果 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并且仅返回第二个名称。

于 2016-01-21T01:19:22.517 回答