2010-10-13 86 views
41

我相信這是可能的,但無法弄清楚語法。像這樣:如何使用XPath表達式選擇所有葉節點?

xmlNode.SelectNodes("//*[count(child::*) <= 1]") 

但這是不正確的。

+0

問得好,+1。請參閱我的答案,瞭解可能最短的XPath表達式,它可以精確選擇所有葉節點。 :) – 2010-10-13 18:18:19

回答

56

使用

//node()[not(node())] 

在情況下,只有元素葉節點想(這需要澄清 - 是有考慮的葉節點無子元素元素?),那麼下面的XPath表達式選擇其中:上述

//*[not(*)] 

兩個表達式都是可能是選擇所需的最短節點(任何節點或元素 - 葉節點)。

+0

你能解釋爲什麼這個工程?我查看了XPath語法和一些教程,但我不明白爲什麼這會起作用。 – rrs 2014-08-12 15:18:17

+0

@rrs:第一個表達式選擇XML文檔中沒有任何孩子的任何節點 - 這是葉節點是什麼 - 從定義。第二種做類似的事情,但它選擇任何沒有子元素的元素。 – 2014-08-12 16:21:08

+0

我明白它的作用,但不知道它是如何做到的。爲什麼/如何不(*)選擇葉節點/元素? – rrs 2014-08-12 16:34:36

1

爲什麼少或等於 1?

xmlNode.SelectNodes("//*[count(child::*) = 0]")

使測試等在這個網站http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm

非常有益的..

+0

非常感謝。這很好。所以,它更像VB風格。我認爲它應該是c樣式的,因爲功能是區分大小寫的。爲什麼<= 1?我被ChildNodes.Count這對於 X返回1困惑,但對於返回0。 – newman 2010-10-13 19:20:13

+0

和@miliu:不需要計數測試。檢查@kevpie的答案。 – 2010-10-13 19:33:01

+0

@Alejandro,的確.. – 2010-10-13 19:50:16

24

無子元素

//*[not(child::*)] 
+0

非常感謝。它也很棒。 – newman 2010-10-13 19:20:55

+2

+1正確答案。但它意味着:*任何沒有元素子元素的元素。因此,它將選擇具有文本節點子元素,空元素,具有混合內容元素(文本節點,PI,註釋)的元素 – 2010-10-13 19:30:57

+0

+1 @Ajjandro,澄清表示讚賞! – kevpie 2010-10-13 19:53:12

0

我加入這個XSLT的答案,因爲它的所有元素似乎谷歌的前場比賽缺少這樣的解決方案:

與提取CDATA作爲XML經過長期鬥爭,最終,這個表達式的工作最適合我:

<xsl:template match="*[not(child::*)]/text()"> 
相關問題