在 XPath 查询中使用“../”和“parent”获取父节点的区别是什么?我原以为它们是同义词。
给定以下两个 XPath 查询,这两者之间真的有什么区别吗?
//Node/id[@type='image']/id[@attr1='myVal']/../../*
//Node/id[@type='image']/id[@attr1='myVal']/parent::*/parent::*
我正在开发一个 C#/ASP.net 应用程序,并使用第一个 XPath 查询实际上返回了 Node 元素之前的第一个同级元素。我正在寻找的是 Node 元素本身及其所有子元素。第二个 XPath 查询将给我预期的结果。
我想知道为什么这里会有差异。
最佳答案
快速回答;是的,../和 parent::* 是等价的,但您会得到不同的结果,因为您的 XPath 表达式不同。
更长的答案;
表达式 parent::node() 和 .. 是等价的,根据 W3C XPath Recommendation 后者是前者的缩写形式.
您将从 parent::* 获得类似的行为,因为 XML 形成了一棵树,因此任何子级最多只能有一个父级。
您会得到不同结果的原因是它们是不同的查询。第一个在末尾有一个额外的 * (../../*),它可能返回您节点的子项目序列。
第二个专门获取上下文节点父节点的父节点(缩写形式 ../..),这是您感兴趣的 Node 元素。
例子:
对于文档
<?xml version="1.0" encoding="UTF-8"?>
<root>
<Node>
<id type="image">
<id attr1="myVal"> </id>
</id>
</Node>
</root>
查询
//Node/id[@type='image']/id[@attr1='myVal']/../../*
和
//Node/id[@type='image']/id[@attr1='myVal']/parent::*/parent::*/*
返回节点id[@type='image']
鉴于查询
//Node/id[@type='image']/id[@attr1='myVal']/../..
和
//Node/id[@type='image']/id[@attr1='myVal']/parent::*/parent::*
返回节点Node。
关于c# - 在 XPath 查询中使用 "../"和 "parent"有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/972735/