在XPath查询中使用“../”和“parent”有什么区别?

时间:2009-06-09 22:03:38

标签: c# asp.net xpath

使用“../”和“parent”来获取XPath查询中的父节点有什么区别。我以为他们是同义词。

鉴于以下两个XPath查询,这两者之间是否存在任何差异?

//Node/id[@type='image']/id[@attr1='myVal']/../../*

//Node/id[@type='image']/id[@attr1='myVal']/parent::*/parent::*

我正在使用C#/ ASP.net应用程序,并使用第一个XPath查询实际上回到了Node元素之前的第一个兄弟。我正在寻找的是Node元素本身及其所有子元素。第二个XPath查询将给出我预期的结果。

我想知道为什么这里有区别。

2 个答案:

答案 0 :(得分:5)

快速回答;是的,.. /和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。

答案 1 :(得分:5)

您没有获得相同的结果集,因为 *您的表达式 彼此不等。*

考虑:

<强> 1。目标节点的孙子

//节点/ ID [@类型= '图像'] / ID [@ attR1位= '设为myVal']

<强> 2。目标节点的子节点(孙子节点的父节点)(等效的exprs)

//节点/ ID [@类型= '图像'] / ID [@ attR1位= '设为myVal'] / ..

//节点/ ID [@类型= '图像'] / ID [@ attR1位= '设为myVal'] /父:: *

第3。目标节点(孙子的祖父母)(等效的exprs)

//节点/ ID [@类型= '图像'] / ID [@ attR1位= '设为myVal'] /../ ..

//节点/ id [@type ='image'] / id [@ attr1 ='myVal'] / parent :: * / parent :: * &lt; - * * *你的2ND EXPR * * *

<强> 4。目标节点的所有子节点(等效的exprs)

//节点/ id [@type ='image'] / id [@ attr1 ='myVal'] /../../* &lt; - * * *你的1ST EXPR * * *

//节点/ ID [@类型= '图像'] / ID [@ attR1位= '设为myVal'] /父:: * /父:: * / *


在XPath测试平台上尝试相应的表达式(例如'//parent/child[@id="2"]/grandchild[@id="2.1"]/../../*')下面。它以红色突出显示哪些节点与您提供的各种XPath表达式相匹配。

http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm