2015-11-03 49 views
2

我寫一個Java程序中,我解析XML輸入文件,它看起來像這樣:如何在不考慮Java中的名稱空間名稱的情況下從XML獲取節點?

... 
<ems:DeterminationRequest> 
    <ems:MessageInformation> 
     <ns17:MessageID xmlns:ns17="http://www.calheers.ca.gov/EHITSAWSInterfaceCommonSchema">1000225404</ns17:MessageID> 
     <ns17:MessageTimeStamp xmlns:ns17="http://www.calheers.ca.gov/EHITSAWSInterfaceCommonSchema">2015-07-28T01:17:04</ns17:MessageTimeStamp> 
     <ns17:SendingSystem xmlns:ns17="http://www.calheers.ca.gov/EHITSAWSInterfaceCommonSchema">CH</ns17:SendingSystem> 
     <ns17:ReceivingSystem xmlns:ns17="http://www.calheers.ca.gov/EHITSAWSInterfaceCommonSchema">LD</ns17:ReceivingSystem> 
     <ns17:ServicingFipsCountyCode xmlns:ns17="http://www.calheers.ca.gov/EHITSAWSInterfaceCommonSchema">037</ns17:ServicingFipsCountyCode> 
    </ems:MessageInformation> 
</ems:DeterminationRequest> 
... 

現在我試圖讓節點「EMS:MessageInformation」不考慮命名空間名稱「EMS」。所以我嘗試了以下幾行代碼:

Document doc = db.parse(new FileInputStream(new File("D:\\test.xml"))); 
Node element = doc.getDocumentElement().getElementsByTagNameNS("*","MessageInformation").item(0); 
System.out.println(element.getNodeName()); 

但是它給了空指針異常,因爲函數不是讀取所需的節點。我經歷了這個link作爲參考。有人能告訴我我在這裏做錯了嗎?

回答

2

這是

doc.getDocumentElement().getElementsByTagNameNS("*","MessageInformation")

返回在書房NodeList實施奇/錯誤行爲它允許您訪問item(0)返回一個空的對象。 (如果您正在使用當前的JDK,NodeList實現爲com.sun.org.apache.xerces.internal.dom.DeepNodeListImpl,它會延遲加載其項目並顯示此錯誤行爲)。


爲了防止NullPointerException你應該先檢查是否返回NodeList的長度> 0:

NodeList result = doc.getDocumentElement().getElementsByTagNameNS("*","MessageInformation"); 
if (result.getLength() > 0) { 
    Node element = (Element)result.item(0); 
    ... 
} 

然後,你需要找出原因getElementsByTagNameNS不返回元素。

一個可能的原因可能是您解析了文檔而沒有命名空間支持。結果是dom元素沒有名稱空間信息,並且getElementsByTagNameNS失敗。

要打開命名空間支持使用:

DocumentBuilderFactory.setNamespaceAware(true); 

或者沒有命名空間的支持,你可以搜索

NodeList nl = doc.getDocumentElement().getElementsByTagName("ems:MessageInformation"); 
+0

感謝您的答覆:)。 「DocumentBuilderFactory.setNamespaceAware(真)」;這個改變對我有效。 – Madhusudan

相關問題