2016-04-28 19 views
2

Ich versuche einige Informationen aus XML mit XPath in Java (v 1.7) zu analysieren. Meine XML sieht wie folgt aus:XPath-Ausdruck konnte nicht gefunden werden

<soap:Fault xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <faultcode>code</faultcode> 
    <faultstring>string</faultstring> 
    <detail>detail</detail> 
</soap:Fault> 

Mein Code:

final InputSource inputSource = new InputSource(new StringReader(xmlContent)); 
final DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
final Document document = documentBuilder.parse(inputSource); 

final XPath xPath = XPathFactory.newInstance().newXPath(); 
final String faultCode = xPath.compile("/soap:Fault/faultcode/text()[1]").evaluate(document); 

ich den XPath-Ausdruck in einem Online-Checker mit der XML-Inhalte ausprobiert haben und es legt nahe, dass eine Übereinstimmung gefunden wird. Wenn ich es jedoch in einem kleinen eigenständigen Programm laufe, bekomme ich keinen Wert in "faultCode".

Dieses Problem ist wahrscheinlich etwas einfach, aber ich kann das Problem nicht identifizieren.

Vielen Dank für Ihre Hilfe.

+0

Ich denke einfach '/ Fehler/Fehlercode'. Versuch es !! – soufrk

Antwort

1

Zuerst müssen Sie einen Namespace bewusst Dokumenterstellungs Fabrik:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setNamespaceAware(true); 

Dann benötigen Sie einen Namespace Kontext:

NamespaceContext nsContext = new NamespaceContext() { 
    @Override 
    public Iterator getPrefixes(String namespaceURI) { 
     return null; 
    } 
    @Override 
    public String getPrefix(String namespaceURI) { 
     return "soap"; 
    } 
    @Override 
    public String getNamespaceURI(String prefix) { 
     return "http://schemas.xmlsoap.org/soap/envelope/"; 
    } 
}; 
xPath.setNamespaceContext(nsContext); 

Mit diesen Ergänzungen, sollte Ihr Code arbeiten.

In Bezug auf Namespace-Kontexte, empfehle ich Sie lesen http://www.ibm.com/developerworks/xml/library/x-nmspccontext/index.html.

+0

Großartig - das funktioniert jetzt. Mit Michaels früherer Antwort und der Hinzufügung des Namespaces für den Builder für Dokumenterstellung werden die Daten jetzt mit dem XPath-Ausdruck korrekt aus dem XML-Code analysiert. – GarlicBread

0

Es kann aufgrund des Namespaces-Effekts sein. Sie können mit der local-name-Namespace unabhängig Tags versuchen, die Syntax unter Angabe von übereinstimmt, gefunden an den URI

/*[local-name()='Fault' and namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/']/*[local-name()='faultcode']/text()[1] 
+0

Siehst du Änderungen ohne Namespaces? – randominstanceOfLivingThing

+0

Ja, das funktioniert - danke. Allerdings möchte ich Namespaces verwenden, wie die Antwort von Michael unten. – GarlicBread

+0

Ich habe den Code bearbeitet, um ihn mit Namespaces zu verwenden. – randominstanceOfLivingThing

2

Sie sollten den Namespacepräfix „Seife“ binden „http://schemas.xmlsoap.org/soap/envelope/“ mit der XPath.setNamespaceContext() Methode.

+0

Ich habe ein NamespaceContext-Objekt erstellt, getNamespaceURI(), getPrefix() und getPrefixes() überschrieben und es dem xPath-Objekt hinzugefügt, aber immer noch keine Übereinstimmung erhalten. Das Präfix ist "soap" und der URI ist "schemas.xmlsoap.org/soap/envelope/". – GarlicBread

+0

Dies funktioniert jetzt. Ebenso wie eine NamespaceContext-Klasse musste ich den DocumentBuilderFactory-Objektnamespace bewusst machen. – GarlicBread

Verwandte Themen