2009-03-16 3 views
4

J'utilise le code suivant pour interroger du code XML avec XPath que je reçois d'un flux.Toujours obtenir une valeur nulle lors de l'interrogation de XML avec XPath

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()); 

J'ai vérifié le flux de contenu en le convertissant en une chaîne - et il est tout ce qu'il ya - il est donc pas comme s'il n'y a pas de données dans le flux. Cela me gêne tout de suite - car j'ai essayé différents types de code et je continue d'imprimer 'null' sur la ligne "System.out.println" - qu'est-ce qui me manque ici?

REMARQUE: je souhaite voir le texte à l'intérieur de l'élément.

+0

Voulez-vous dire que System.out.println (nodes.item (i) .getNodeValue()); affiche "null" ou que vous obtenez une exception NullPointerException? – Eddie

+0

l'a édité maintenant pour être plus clair - acclame Eddie. – Vidar

Répondre

7

En plus de ce Brabster suggéré, vous pouvez essayer

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

ou

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

en fonction de ce que vous avez l'intention d'afficher.

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

+0

Vos exemples de code fonctionnent! Il ne m'est jamais arrivé que j'interroge incorrectement le nœud - désolé un peu d'erreur de merde - mais encourage Eddie. – Vidar

+0

Méfiez-vous getTextContent() - il retournera le contenu du texte du nœud que vous avez sélectionné et tout enfant noeuds aussi. Peut-être pas ce que tu veux. – Brabster

4

Pas un expert dans Java XPath impl tbh, mais cela pourrait aider. Les javadocs disent que le résultat de getNodeValue() sera nul pour la plupart des types de nœuds.

Il n'est pas totalement clair ce que vous attendez de la sortie; nom de l'élément, attributs, texte? Je vais deviner le texte. Dans tous les impl XPath j'ai utilisé, si vous voulez que le contenu du texte du nœud, vous devez XPath pour

//FOO_ELEMENT/text() 

alors la valeur du nœud est le contenu textuel du nœud.

La méthode getTextContent() renvoie le contenu textuel du noeud que vous avez sélectionné avec le XPath et les noeuds descendants, conformément au javadoc. La solution ci-dessus sélectionne exactement le composant de texte des noeuds FOO_ELEMENT dans le document.

Java EE Docs for Node < - documents anciens, voir les commentaires pour les documents en cours.

+0

Ça doit être ça. Consultez également http://java.sun.com/javase/6/docs/api/org/w3c/dom/Node.html pour le JDK 6 JavaDoc. – Eddie

+0

Ouais désolé shoulda vérifié la version d'oh! – Brabster

+0

ça ne marche pas vraiment. – Vidar

Questions connexes