2017-02-12 5 views
-2

Ich habe Schwierigkeiten beim Zugriff auf XML-Wert, Kann mir jemand sagen, was ich vermisse.Java XML Parse Problem

String xml = "<Standard p1:oid=\"00000000-0000-0000-0000-000000f674c1\"\n" + 
       "        xmlns:p1=\"com.iMelt.metaCore.DataObjects.Core\" xmlns=\"com.iMelt.Car.Model.Core\"\n" + 
       "        reasonCode=\"0\">\n" + 
       " <p1:__info p1:eid=\"00000000-0000-0000-0000-000000000000\">\n" + 
       "  <p1:creationDate>2016-05-28T20:33:45.337+00:00</p1:creationDate>\n" + 
       "  <p1:lastEditorRef>Administrator</p1:lastEditorRef>\n" + 
       "  <p1:version>5</p1:version>\n" + 
       " </p1:__info>\n" + 
       " <ChangeState>Approved</ChangeState></Standard>"; 

byte[] byteArray = xml.getBytes(); 
ByteArrayInputStream inputStream = new ByteArrayInputStream(byteArray); 
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
factory.setNamespaceAware(true); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
Document doc = builder.parse(inputStream); 
XPathFactory xpathfactory = XPathFactory.newInstance(); 
XPath xpath = xpathfactory.newXPath(); 
XPathExpression expr = xpath.compile("/Standard/ChangeState"); 
Object result = expr.evaluate(doc, XPathConstants.NODESET); 
+1

Welche Art von Schwierigkeiten stehen Ihnen bevor? Was ist das genaue Problem! –

+0

Ich habe auch versucht/ChangeState, nicht "Approved" Wert in Ergebnis – developer

+0

Bestückung Ihr XML fehlt die XML-Verzögerung '' –

Antwort

2

Das Problem ist, ist, dass Sie nicht über Knoten namens „Standard“ und „Change“, haben Sie Knoten, die Version von Standard- und Changenamensraum haben.

Sie müssen also die Methode XPath.setNamespace() verwenden, um ein Präfix einem Namespace zuzuordnen und dieses Präfix dann in Ihren xpath-Ausdrücken zu verwenden. Beachten Sie, da Sie nur die Standard-Namespace in Ihren Abfragen verwenden, das ist alles, was Sie angeben müssen, so etwas wie

String xml = "<Standard p1:oid=\"00000000-0000-0000-0000-000000f674c1\"\n" 
      + "        xmlns:p1=\"com.iMelt.metaCore.DataObjects.Core\" xmlns=\"com.iMelt.Car.Model.Core\"\n" 
      + "        reasonCode=\"0\">\n" + " <p1:__info p1:eid=\"00000000-0000-0000-0000-000000000000\">\n" 
      + "  <p1:creationDate>2016-05-28T20:33:45.337+00:00</p1:creationDate>\n" + "  <p1:lastEditorRef>Administrator</p1:lastEditorRef>\n" 
      + "  <p1:version>5</p1:version>\n" + " </p1:__info>\n" + " <ChangeState>Approved</ChangeState></Standard>"; 

    byte[] byteArray = xml.getBytes(); 
    ByteArrayInputStream inputStream = new ByteArrayInputStream(byteArray); 
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    factory.setNamespaceAware(true); 
    DocumentBuilder builder = factory.newDocumentBuilder(); 
    Document doc = builder.parse(inputStream); 
    XPathFactory xpathfactory = XPathFactory.newInstance(); 
    XPath xpath = xpathfactory.newXPath(); 
    xpath.setNamespaceContext(new NamespaceContext() { 

     @Override 
     public String getNamespaceURI(String prefix) { 
      return "com.iMelt.Car.Model.Core"; 
     } 

     @Override 
     public String getPrefix(String namespaceURI) { 

      return "x"; 
     } 

     @Override 
     public Iterator getPrefixes(String namespaceURI) { 
      return null; 
     } 

    }); 
    XPathExpression expr = xpath.compile("/x:Standard/x:ChangeState"); 
    NodeList result = (NodeList) expr.evaluate(doc, XPathConstants.NODESET); 

Die andere, weniger gültige Option ist die Aussage

factory.setNamespaceAware(true); 
+0

Ich habe versucht sowohl die Option xpath.setNamespaceContext und entfernen Sie factory.setNamespaceAware (true), auch, aber keine Hilfe – developer

+0

Sorry, aber das funktioniert so ist, haben Sie Ihre Xpath-Ausdruck ändern - Hinzufügen der Präfixe 'x'? – MeBigFatGuy

+0

Ja, es funktioniert, Vielen Dank. – developer

0

Der folgende Code Ausgänge zu entfernen "Genehmigt". Ich habe factory.setNamespaceAware(true); entfernt, so dass Sie den Standard-Namespace nicht angeben müssen und am Ende Code hinzugefügt werden müssen, um den Textwert auszugeben.

import java.util.*; 
import java.lang.*; 
import java.io.*; 
import javax.xml.parsers.*; 
import org.w3c.dom.*; 
import javax.xml.xpath.*; 

// ... 

String xml = "<Standard p1:oid=\"00000000-0000-0000-0000-000000f674c1\"\n" + 
       "        xmlns:p1=\"com.iMelt.metaCore.DataObjects.Core\" xmlns=\"com.iMelt.Car.Model.Core\"\n" + 
       "        reasonCode=\"0\">\n" + 
       " <p1:__info p1:eid=\"00000000-0000-0000-0000-000000000000\">\n" + 
       "  <p1:creationDate>2016-05-28T20:33:45.337+00:00</p1:creationDate>\n" + 
       "  <p1:lastEditorRef>Administrator</p1:lastEditorRef>\n" + 
       "  <p1:version>5</p1:version>\n" + 
       " </p1:__info>\n" + 
       " <ChangeState>Approved</ChangeState></Standard>"; 

byte[] byteArray = xml.getBytes(); 
ByteArrayInputStream inputStream = new ByteArrayInputStream(byteArray); 
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
Document doc = builder.parse(inputStream); 
XPathFactory xpathfactory = XPathFactory.newInstance(); 
XPath xpath = xpathfactory.newXPath(); 
XPathExpression expr = xpath.compile("/Standard/ChangeState"); 
NodeList result = (NodeList)expr.evaluate(doc, XPathConstants.NODESET); 
Node node = result.item(0); 
System.out.println(node.getTextContent()); 
+0

Ich habe oben versucht, seine geben null Zeiger Ausnahme – developer

+0

Sie können hier sehen, dass es ohne Fehler läuft und gibt "Genehmigt": https://ideone.com/JGMiag – NineBerry