使用“../”和“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查询将给出我预期的结果。
我想知道为什么这里有区别。
答案 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