2011-01-14 25 views
0

查詢我有一個簡單的XML文檔在XMLObject組成使用XPath通過命名空間

<abc:MyForm xmlns:abc='http://myform.com'> 
    <abc:Forms> 
     <def:Form1 xmlns:def='http://decform.com'> 
      .... 
     </def:Form1> 
     <ghi:Form2 xmlns:ghi='http://ghiform.com'> 
      .... 
     </ghi:Form2> 
    </abc:Forms> 
</abc:MyForm> 

我使用XMLObjects Apache的,當我嘗試做以下XPath表達式它完美

object.selectPath("declare namespace abc='http://myform.com' 
        abc:Form/abc:Forms/*"); 

這給了我2個表單節點(def和ghi)。不過,我希望能夠通過指定命名空間來查詢,所以我們說我只想要Form2。我已經試過這和它失敗

object.selectPath("declare namespace abc='http://myform.com' 
        abc:Form/abc:Forms/* 
         [namespace-uri() = 'http://ghiform.com']"); 

的selectPath返回0節點。有誰知道發生了什麼事?

更新:

如果我做的2個步驟之後,然後我可以得到我想要的結果。

XmlObject forms = object.selectPath("declare namespace abc='http://myform.com' 
        abc:Form/abc:Forms")[0]; 
forms.selectPath("*[namespace-uri() = 'http://ghiform.com']"); 

這給了我ghi:Form節點就像它應該,我不明白爲什麼它不會作爲單個XPath表達式來做。 感謝

回答

0

簡單的答案是,你不能。命名空間前綴只是命名空間URI的縮寫,這是重要的。

對於名稱空間感知解析器,您的兩個標記是相同的。

如果你真的想用前綴來區分(儘管你真的不應該這樣做),你可以使用一個不支持名稱空間的解析器,並將前綴視爲它是元素名稱的一部分。

但理想情況下,您應該閱讀關於命名空間如何工作的教程,並嘗試使用它們,因爲它們被設計爲可以使用它們。

+0

我想你錯過了這個問題的要點。問題是我只想選擇屬於某個命名空間的元素。 – 2011-01-15 00:05:42