2009-06-09 49 views
4

使用「../」和「parent」在XPath查詢中獲取父節點之間有什麼區別。我曾認爲它們是同義詞。在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查詢會給我預期的結果。

我想知道爲什麼這裏有區別。

回答

5

快速回答;是的,../和parent :: *是等價的,但是你得到不同的結果,因爲你的XPath表達式是不同的。

較長的答案;

表達式parent :: node()和..是等價的,後者是根據W3C XPath Recommendation的前者的縮寫形式。

您將從parent :: *獲得類似的行爲,因爲XML構成一棵樹,所以任何孩子最多隻能有一個家長。

您將得到不同結果的原因是因爲它們是不同的查詢。第一個在結尾處有一個額外的*(../../*),這可能會返回Node的子項目序列。

第二個特別獲取上下文節點(縮寫爲../ ..)的父節點的父節點,它是您感興趣的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 [@類型= '圖像']

儘管查詢

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

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

返回節點的節點。

+0

咦?你的快速答案基本上不會說:是的,他們是一樣的,但不,他們是不同的? – 2009-06-10 01:20:16

+0

已更新,使其更清晰 – Brabster 2009-06-10 05:58:39

5

你沒有得到相同的結果集,因爲*你的表情是等同於對方*

考慮:

1。目標節點的孫子

//節點/ ID [@類型= '圖像']/ID [@ attR1位= '設爲myVal']

2.目標節點(孫子的親本)的子(相當於exprs)

//節點/ ID [@類型= '圖像']/ID [@ attR1位= '設爲myVal']/..

//節點/ ID [@類型='圖像']/id [@ attr1 ='myVal']/parent :: *

3.目標節點(grand孫子的親本)(相當於exprs)

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

//節點/ ID [@類型= '圖像']/ID [@ attR1位= '設爲myVal'] /父:: * /父:: * < - * * *你的第二EXPR * * *

4。目標節點的所有兒童(相當於exprs)

//Node/id[@type='image']/id[@attr1='myVal']/../../* < - * * * YOUR 1ST EXPR * * *

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


嘗試相當於您的表達式(例如'//parent/child[@id="2"]/grandchild[@id="2.1"]/../../*')在下面鏈接的XPath測試牀上。它以紅色突出顯示哪些節點與您提供的各種XPath表達式匹配。

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

相關問題