使用"../"和"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查询将给出我预期的结果.
我想知道为什么这里有区别.
快速回答; 是的,.. /和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.
您没有获得相同的结果集,因为*您的表达式彼此不相同.*
考虑:
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
| 归档时间: |
|
| 查看次数: |
3378 次 |
| 最近记录: |