2013-02-25 116 views
17

我相信這應該能夠使用標準XPath而不參考實現來回答,但僅供參考我正在使用.Net中的XML DOM對象(System.Xml名稱空間) 。XPath來選擇具有指定名稱的所有元素

我有一個交給我的函數的節點,從XML文檔內部的某個地方,我想選擇具有特定名稱的此節點的所有後代元素,而不管這些節點的介入路徑如何。呼叫我在做這個樣子的:

node.SelectNodes("some XPath here"); 

我的工作節點看起來是這樣的:

... 
<food> 
    <tart> 
    <apple color="yellow"/> 
    </tart> 
    <pie> 
    <crust quality="flaky"/> 
    <filling> 
     <apple color="red"/> 
    </filling> 
    </pie> 
    <apple color="green"/> 
</food> 
... 

我要的是所有的「蘋果」的節點列表,即3個結果。 我試過了幾個不同的東西,但沒有一個能夠得到我想要的東西。

node.SelectNodes("apple"); 

這給了我一個結果,青蘋果。

node.SelectNodes("*/apple"); 

這給了我一個結果,黃色的蘋果。

node.SelectNodes("//apple"); 

這給了我幾百結果,看起來像文檔中的每個節點的蘋果,或者至少這也許就是文檔的根的直接子每個蘋果節點。

如何創建一個XPath,它可以爲我提供當前節點下的所有Apple節點,而不管當前節點下的節點有多深?具體來說,根據我上面的例子,我應該得到三個結果 - 紅色,綠色和黃色的蘋果。

回答

25

嘗試.//apple。這列出了當前節點的所有後代節點apple。爲了更好地理解此主題,您應該瞭解XPath軸的工作方式。例如,您也可以編寫descendant::apple

+0

完美,這正是我所期待的。我谷歌搜索了一個小時,找不到那個。只是爲了澄清,看到我正確理解語法 - 雙斜線給我所有的蘋果節點,無論深度如何(正如我在上面的問題中試過的),並且它們之前的點限制了選擇到當前節點的後代。那是對的嗎? – 2013-02-25 22:28:14

+0

是的,這是正確的。我還編輯了我的帖子,給你一些額外的指針。 – nwellnhof 2013-02-25 22:29:22

+0

你編輯你的答案,說我應該學習XPath軸的工作方式 - 我同意。你有什麼好建議我應該檢查一下嗎? – 2013-02-25 22:30:13

相關問題