xml文档的语法:
<x name="GET-THIS">
<y>
<z>Z</z>
<z>Z__2</z>
<z>Z__3</z>
</y>
</x>
我可以使用以下方法获取所有 z 元素:
xpath("//z")
但在那之后我被卡住了,我不知道下一步该怎么做。我不太了解..
父方法的语法
那么,如何获取元素父级的父级属性呢?
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]
将选择所有x
以z
元素为后代的元素。//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 在 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
并且仅返回第二个名称。