2016-08-18 21 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> 
[..] 

など来ることができる:例えば

 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を取得:

<?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> 
[..] 

私たちは、このファイルを読むためにこのコードを使用しようとしました。

いずれかをお勧めしますか?

TIA

+1

名前空間で作業する場合は、まず 'dbFactory.setNamespaceAware(true); 'を設定します。 –

+1

また、両方のサンプルが同じ名前空間を使用し、2番目のサンプルの既定の名前空間としてのみ使用され、最初のサンプルにはプレフィックスが付きます。 –

+0

ありがとう!それは今働いている! – user1748166

答えて

0

名前空間の有無にかかわらず動作する方法の1つは次のとおりです。このソリューションは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パーサ/ DocumentBuilderのを作成するために使用される、あなたの工場にdbFactory.setNamespaceAware(true);を設定することにより、空間認識DOMを使用していることを確認する必要がありgetElementsByTagNameNSのような名前空間を認識するDOMメソッドを使用します。

関連する問題