2016-08-18 84 views
0

我們正在嘗試構建一個接收一些XML文件的服務。但是人們發送它,有時使用命名空間,有時不使用。例如:Java和XML:讀有或沒有命名空間的XML標記

<?xml version="1.0" encoding="UTF-8"?> 
<ds:EnvioDoc version="1.0" xmlns:ds="http://my.domain"> 
    <ds:Cabecera version="1.0"> 
    <ds:IdRec>215217190015</ds:IdRec> 
    <ds:IdEm>211003420017</ds:IdEm> 
    <ds:IdDoc>2995019</ds:IdDoc> 
    </ds:Cabecera> 
<Cuerpo> 
    <CorpDoc version="1.0" xmlns="http://my.domain"  xmlns:xd="http://www.w3.org/2000/09/xmldsig#"> 
    <body> 
    <Fecha>2016-08-12T00:11:50-03:00</Fecha> 
[..] 

或能來,如:

<?xml version="1.0" encoding="UTF-8"?> 
<EnvioDoc version="1.0" xmlns="http://my.domain"> 
    <Cabecera version="1.0"> 
    <IdRec>215217190015</IdRec> 
    <IdEm>211003420017</IdEm> 
    <IdDoc>2995019</IdDoc> 
    </Cabecera> 
    <Cuerpo> 
    <CorpDoc version="1.0" xmlns="http://my.domain" xmlns:xd="http://www.w3.org/2000/09/xmldsig#"> 
    <body> 
     <Fecha>2016-08-12T00:11:50-03:00</Fecha> 
[..] 

我們曾嘗試使用此代碼閱讀本文件:

 File edocFile = new File(fileName); 
     DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
     Document doc = dBuilder.parse(edocFile); 

     //recomendado http://stackoverflow.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work 
     doc.getDocumentElement().normalize(); 
    NodeList nlCabecera = doc.getElementsByTagNameNS("*","Cabecera"); 
    Node cabeceraNode = nlCabecera .item(0); 
    if (cabeceraNode.getNodeType() == Node.ELEMENT_NODE) { 

但要在如線NullPointerExsception。

有什麼建議嗎?

TIA

+1

如果你想使用命名空間,那麼我將開始設置'dbFactory.setNamespaceAware(true);'。 –

+1

還要注意,這兩個示例都使用相同的名稱空間,僅作爲第二個示例中的默認名稱空間,並且在第一個示例中使用了前綴。 –

+0

非常感謝!它正在工作! – user1748166

回答

0

一個你可以把它帶或不帶命名空間的工作方式如下。請注意,此解決方案使用XPATH,儘管這不能解決NPE問題,但解決方案將適用於帶或不帶名稱空間的情況。

public static void main(String[] args) throws Exception { 
    File fXmlFile = new File("C:\\DevelopmentTools\\3.CODE\\XMLWithNS.xml"); 
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
    Document doc = dBuilder.parse(fXmlFile); 
    doc.getDocumentElement().normalize(); 

    XPath xpath = XPathFactory.newInstance().newXPath(); 
    NodeList list = (NodeList) xpath.evaluate("//*[local-name()='Cabecera']", doc, XPathConstants.NODESET); 

    System.out.println("Size of the list is " + list.getLength()); 

} 
2

要使用名稱空間感知的DOM方法,如getElementsByTagNameNS你需要確保你通過你的工廠用於創建DOM解析器/ DocumentBuilder的設置dbFactory.setNamespaceAware(true);使用一個名稱空間感知的DOM。