2009-02-17 31 views
15
<Document> 
    <A> 
    <B> 
     <C></C> 
    </B> 
    </A> 
    <E> 
    <F> 
    <C></C> 
    </F> 
    <G> 
    <C></C> 
    </G> 
</E> 
</Document> 

如果我使用XPath查詢上述XML加載到一個XmlDocument,做的SelectSingleNode上的一個// C的XPath的SelectNodes

 
XmlNode oNode = oDocument.SelectSingleNode("E"); 
XmlNodeList oNodeList = oNode.SelectNodes("//C"); 

爲什麼它在B時的返回節點是什麼我預計會發生只會返回節點從E

有意義嗎?

編輯:我將如何使它只從該節點向前返回?

回答

22

簡單地說:前導//表示在同一個文檔中的「任何級別」作爲選定的節點。

spec

  • // para選擇文檔根的所有的para子孫,因此選擇相同的文件作爲上下文節點中的所有para元素
  • .//para選擇的對上下文節點的元素後代
11

指定.//C將實現您想要的,否則,XPath將從文檔根而不是當前節點開始。

的混亂是在從XPath standard所述的//定義如下:

//是短期的 /後代或自身::節點()/。對於 示例,// para是 /descendant-or-self :: node()/ child :: para 的簡寫,所以將選擇 文檔中的任何para元素(即使是 是文檔元素的para元素將被選中爲 by // para,因爲文檔元素 節點是根節點的子節點); div // para是 div/descendant-or-self :: node()/ child :: para 的簡稱,所以會選擇所有的div子元素的子元素 。

因爲///descendant-or-self::node()/的簡稱,它始於文檔級別,除非您在開始時指定節點。

+0

不,規範說「//」是「文檔根目錄」,「.//」是上下文節點。實施是正確的。 – 2009-02-17 22:00:30

+0

重新W3學校ref:認真閱讀:「在當前節點的文檔中」 - 上下文節點僅用於(僅)獲取文檔;然後掃描整個文檔。 – 2009-02-17 22:01:27

6

//C是整個文檔中所有的C節點

/E//C將是下Ë是僅含有C節點

/C將只有根Ç節點

參見xpath syntax reference

3

XPATH Specification你會在2下找到。5以下聲明:

// para選擇所有文檔根的對 後代和 從而選擇 同一文檔中的所有para元素作爲上下文節點

即行爲你觀察是有效的。你應該做一些像「/ E // C」