2013-12-09 108 views
1

我正在查找XPath表達式以獲取節點的默認名稱空間。用於獲取默認名稱空間的XPath表達式

我的XML文檔可能看起來像這樣。

<aaa> 
    <bbb xmlns="ns1" xmlns:ggg="ns2" attribute="value" attribute2="value2"> 
     <ccc /> 
    </bbb> 
    <bbb xmlns="ns4" xmlns:ggg="ns5" attribute="value" attribute2="value2"> 
     <ddd /> 
    </bbb> 
</aaa> 

我想得到ns1。我用以下表達式嘗試過它,但沒有一個能夠工作(我在Java 1.7中進行編程(所以它是XPath 1.0),並使用http://chris.photobooks.com/xml/default.htm上的在線XPath可視化工具進行測試)。

/aaa/*[name()='bbb' and position()=1]/attribute::* 

該表達式只選擇attribute - 和attribute2 -nodes。

/aaa/*[name()='bbb' and position()=1]/namespace::* 

此表達式不會選擇任何內容。

如果有人給我提示,我將不勝感激。

回答

2

你表達

/aaa/*[name()='bbb' and position()=1]/namespace::* 

是正確的,返回三個命名空間節點。問題可能在於您在返回這些節點後處理這些節點。該表達式可以在XPath 1.0和XPath 2.0中運行,但我沒有使用內置於JDK的XPath引擎進行檢查。 (順便說一句,因爲您使用的是JDK 1.7,所以您使用的是XPath 1.0,這是一個完全不合適的概念,因爲Java用戶可以使用多個XPath 2.0引擎)。

只返回對應於默認命名空間URI,使用

/aaa/*[name()='bbb' and position()=1]/namespace::*[name()=''] 

或者的確,因爲這個查詢已經假定BBB元素在默認的命名空間,使用

namespace-uri(/aaa/*[name()='bbb' and position()=1]) 
+0

感謝您的回答。我很高興我沒有犯錯。它確實是在XPath引擎中構建的。現在我使用的是撒克遜圖書館,一切正常。 –

0

這個page解釋了xpath中的namespace-uri函數。

它看起來像你想是這樣的:

namespace-uri(/aaa/*[name()='bbb' and position()=1]) 

如果沒有指定命名空間,你會得到一個空字符串作爲結果。

編輯:我重讀你的問題,我不知道我的答案是你在找什麼。 namespace-uri函數用於查找像<ns1:bbb>這樣的節點的URI。它會返回ns1的uri。我不確定有沒有辦法使用x-path來查看名稱空間定義,而不是實際使用它們的時間。

+0

喜,你確實理解我是對的。這是一個很好的解決方案,雖然就像我的查詢一樣,它不能在XPath引擎中更方便地構建。對撒克遜圖書館的更改工作正常。謝謝! –

相關問題