2009-03-16 8 views
4

Ich verwende den folgenden Code, um XML mit XPath abzufragen, das ich von einem Stream bekomme.NULL immer erhalten, wenn XML mit XPath abgefragt wird

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 
domFactory.setNamespaceAware(false); 
DocumentBuilder builder = domFactory.newDocumentBuilder(); 
Document doc = builder.parse(inputStream); 
inputStream.close(); 

XPathFactory factory = XPathFactory.newInstance(); 
XPath xpath = factory.newXPath(); 
XPathExpression expr = xpath.compile("//FOO_ELEMENT"); 

Object result = expr.evaluate(doc, XPathConstants.NODESET); 
NodeList nodes = (NodeList) result; 
for (int i = 0; i < nodes.getLength(); i++) { 
    System.out.println(nodes.item(i).getNodeValue()); 

Ich habe den Strom für den Inhalt überprüft, indem es in einen String konvertieren - und es ist alles da - so dass es nicht ist, als ob es keine Daten im Stream ist.

Das nervt mich jetzt gerade - da ich verschiedene Code-Teile ausprobiert habe und immer noch 'Null' in der Zeile "System.out.println" gedruckt werde - was fehlt mir hier?

HINWEIS: Ich möchte den Text innerhalb des Elements sehen.

+0

Meinen Sie, dass System.out.println (nodes.item (i) .getNodeValue()); Gibt "null" aus oder dass Sie eine NullPointerException erhalten? – Eddie

+0

editiert es jetzt klarer zu sein - Prost Eddie. – Vidar

Antwort

7

Zusätzlich zu dem, was Brabster vorgeschlagen, möchten Sie vielleicht

System.out.println(nodes.item(i).getTextContent()); 

oder

System.out.println(nodes.item(i).getNodeName()); 

je nachdem, was Sie beabsichtigen, angezeigt werden, um zu versuchen.

Siehe http://java.sun.com/javase/6/docs/api/org/w3c/dom/Node.html

+0

Ihre Codebeispiele funktionieren! Es ist mir nie aufgefallen, dass ich den Knoten falsch abgefragt habe - Entschuldigung, ein bisschen Mistfehler - aber Prost Eddie. – Vidar

+0

Achten Sie auf getTextContent() - es wird den Textinhalt des von Ihnen ausgewählten Knotens UND aller untergeordneten Knoten zurückgeben. Vielleicht nicht was du willst. – Brabster

4

Kein Experte in der Java XPath Impl tbh, aber das könnte helfen.

Die Javadocs sagen, dass das Ergebnis von getNodeValue() für die meisten Knotentypen null ist.

Es ist nicht ganz klar, was Sie erwarten, in der Ausgabe zu sehen; Elementname, Attribute, Text? Ich rate Text. In jedem XPath impl ich verwendet habe, wenn Sie den Textinhalt des Knotens wollen, müssen Sie XPath

//FOO_ELEMENT/text() 

Dann Wert des Knotens ist der Textinhalt des Knotens.

Die getTextContent() -Methode gibt den Textinhalt des Knotens zurück, den Sie mit dem XPath ausgewählt haben, und alle untergeordneten Knoten gemäß dem Javadoc. Die obige Lösung wählt genau die Textkomponente der beliebigen Knoten FOO_ELEMENT in dem Dokument aus.

Java EE Docs for Node < - alte Dokumente, siehe Kommentare für aktuelle Dokumente.

+0

Das muss es sein. Überprüfen Sie auch http://java.sun.com/javase/6/docs/api/org/w3c/dom/Node.html für das JDK 6 JavaDoc. – Eddie

+0

Yeah Entschuldigung sollte die Version von oh überprüft haben! – Brabster

+0

das funktioniert nicht wirklich. – Vidar