2010-12-07 6 views
3

Je crois que cela fonctionnait il y a quelque temps mais maintenant xpath renvoie null. Quelqu'un peut-il m'aider à trouver mon erreur stupide dans le code suivant?
Ou je devrai fournir NamespaceContext même après setNamespaceAware (faux)?XPath renvoie null pour xml avec defaultNamespace

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 
domFactory.setNamespaceAware(false); 
domFactory.setIgnoringComments(true); 
domFactory.setIgnoringElementContentWhitespace(true); 

try { 
Document doc = domFactory.newDocumentBuilder().parse(new File("E:/Temp/test.xml")); 
XPath xp = XPathFactory.newInstance().newXPath(); 
NodeList nl = (NodeList) xp.evaluate("//class", doc, XPathConstants.NODESET); 
System.out.println(nl.getLength()); 
}catch (Exception e){ 
e.printStackTrace(); 
} 

document XML est ici:

<?xml version="1.0" encoding="UTF-8"?> 
<root xmlns="http://www.example.com/schema"> 
<class /> 
<class /> 
</root> 
+0

Quand je lance ceci (avec Java 1.6) il imprime "2". –

+1

La variable ici est l'implémentation de l'analyseur par défaut sélectionnée par 'domFactory.newDocumentBuilder() .parse (fichier)'. –

+0

Oh mon Dieu, ça me rend fou. Je suis également en test sous Java 1.6 mais en obtenant 0. Pouvez-vous me donner une idée de ce que je devrais vérifier? – WSK

Répondre

5

Trois options sont évidentes. Afin de plus facile d'abord de mon point de vue:

  • changer votre XPath de "//class" à "//*[local-name() = 'class']". C'est un peu kludgy mais il va ignorer les espaces de noms. Si cela vous donne encore zéro, vous savez que le problème n'est pas des espaces de noms.
  • enregistrer un préfixe d'espace de noms pour « http://www.example.com/schema » dans votre code Java et l'utiliser dans l'expression XPath: "//foo:class"
  • figure ce que la mise en œuvre de l'analyseur que vous utilisez et pourquoi il est se comporter différemment de @ Rodney, ou changer pour un autre