2013-11-27 38 views
0

我需要查找具有非空數據的(只有一個)XML節點。這個怎麼做。用於查找非空節點元素數據的XPATH表達式

XML:

<root> 
<tuple > 
    <old> 
     <a> 
      <b></b> 
     </a> 
    </old> 
</tuple> 
<tuple > 
    <old> 
     <a> 
      <b>http://google.com</b> 
     </a> 
    </old> 
</tuple> 
<tuple > 
    <old> 
     <a> 
      <b>http://google.com</b> 
     </a> 
    </old> 
</tuple> 
</root> 

XPATH我用:

/root/tuple/old/a/b[text() and not(//a/b/text())] 

/root/tuple/old/a/b[string-length(text())>0]/text() 

但對於上述XPath表達式我得到所有這一切都是節點非空,什麼我做錯了。

+0

在這個例子中_all_除第一個'b'之外的元素都是非空的,因爲它們包含空白文本節點(新行和縮進)。 –

回答

3

您可以使用以下XPath

/root/tuple/old/a/b[normalize-space(.) = ''][1] 

我推測空格不是對你很重要(所以我用normalize-space()功能)。點表示實際元素(即<b>)。

正如你說的,你只需要只有一個元素所以情況有更適合的元素我只選擇第一個([1]

+1

你已經完成了測試 - 你找到空的'b'元素而不是非空元素。並且(當這是固定的時候),它仍然會給你兩個結果(第二個和第三個'b'元素),因爲它們在它們各自的父母中都是第一個非空的'b'。如果你只想得到一個結果,你需要括號'(/ root/tuple/old/a/b [normalize-space()])[1]' –

0

您可以使用以下XPath來檢查了值。如果該元素具有文本

取出布爾函數來獲得實際的文字,如下圖所示

boolean(/root/tuple[position()=2]/old/a/b[text() and string-length()>0]) 

上述路徑返回true。

/root/tuple[position()=2]/old/a/b[text() and string-length()>0] 

希望這會有所幫助。