2013-03-22 20 views
0

我試圖按照http://www.ibm.com/developerworks/xml/library/x-nmspccontext/index.htmlJava的DOM lookupNamespaceURI是無法找到命名空間URI

UniversalNamespaceResolver 

例如解決XPath計算的命名空間agains的XML。我遇到的問題是,下面lookupNamespaceURI調用返回的XML空,我如下:

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 

    DocumentBuilder builder = domFactory.newDocumentBuilder(); 
    Document dDoc = builder.parse(new InputSource(new StringReader(xml))); 

    String nsURI = dDoc.lookupNamespaceURI("h"); 

的XML:

<?xml version="1.0"?> 

<h:root xmlns:h="http://www.w3.org/TR/html4/"> 

    <h:table> 
    <h:tr> 
     <h:td>Apples</h:td> 
     <h:td>Bananas</h:td> 
    </h:tr> 
    </h:table>` 
</h:root> 

,而我希望它返回「http://www.w3.org/TR/html4/」。

回答

2

在配置的DocumentBuilder,你必須明確地讓(從XML的第一天,無聊的遺物時沒有命名空間)命名空間意識到:

domFactory.setNamespaceAware(true); 

作爲一個方面說明,在該意見文章不是很好。它從根本上錯過了你不關心的點命名空間前綴在實際文檔中的含義,它們是無關緊要的。您需要xpath名稱空間解析器來匹配您正在使用的xpath表達式,這就是全部。如果你按照他們的建議進行操作,那麼只要文檔的前綴發生變化就必須更改xpath代碼,這是一個可怕的想法。

請注意,他們在最後一個項目符號中放棄了這一點,但文章的其餘部分似乎錯過了這是使用xpath時的基本思想。

但是,如果您無法控制XML文件,並且某人可以向您發送任何他們希望的前綴,則可能更好地獨立於他們的選擇。您可以像例1(HardcodedNamespaceResolver)一樣編寫自己的名稱空間解析,並在您的XPath表達式中使用它們。

+0

謝謝jtahlborn! setNamespaceAware幫助!我沒有意識到這一點。 至於另一件事 - XPath和XML都可以。我不知道在那裏將使用哪些名稱空間。而且,我知道UniversalNamespaceResolver建議在處理具有相同或不同名稱空間的不同前綴時會失敗。但我不知道如何正確處理。 – user431529 2013-03-25 08:52:49

+0

@ user431529 - 我不明白,你如何爲xml文檔編寫xpath並且不知道正在使用哪些命名空間? – jtahlborn 2013-03-25 14:11:50

+0

好吧,原因並不那麼明顯:我們有一個接收xpath&xml的服務,並且希望將結果返回給舊系統。 – user431529 2013-03-26 09:21:02

相關問題