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

Rob*_*gal 4 c# asp.net xpath

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

鉴于以下两个XPath查询,这两个之间真的有什么区别吗?

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

//Node/id[@type='image']/id[@attr1='myVal']/parent::*/parent::*
Run Code Online (Sandbox Code Playgroud)

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

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

bra*_*ter 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>
Run Code Online (Sandbox Code Playgroud)

查询

//Node/id[@type='image']/id[@attr1='myVal']/../../* 
Run Code Online (Sandbox Code Playgroud)

//Node/id[@type='image']/id[@attr1='myVal']/parent::*/parent::*/* 
Run Code Online (Sandbox Code Playgroud)

返回节点id [@ type ='image']

而查询

//Node/id[@type='image']/id[@attr1='myVal']/../..
Run Code Online (Sandbox Code Playgroud)

//Node/id[@type='image']/id[@attr1='myVal']/parent::*/parent::*
Run Code Online (Sandbox Code Playgroud)

返回节点Node.


Ber*_*t F 5

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

考虑:

1.目标节点的孙子

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

2.目标节点的子节点(孙子节点的父节点)(等效的exprs)

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

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

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

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

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

4.目标节点的所有子节点(等效exprs)

//Node/id[@type='image']/id[@attr1='myVal']/../../* < - ***您的第1个EXPR***

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


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

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