XPath使用defaultNamespace为xml返回null

时间:2010-12-07 18:06:32

标签: java xpath

我相信它在不久前工作但现在xpath返回null。有人可以帮我找到代码中的愚蠢错误吗? 或者我甚至必须在setNamespaceAware(false)之后提供NamespaceContext?

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

XML文档在这里:

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

1 个答案:

答案 0 :(得分:5)

显然有三种选择。从我的角度来看,最简单的顺序是:

  • 将您的XPath从"//class"更改为"//*[local-name() = 'class']"。它有点kludgy但它会忽略名称空间。如果这仍然给你零,你知道问题不是命名空间。
  • 在Java代码中为“http://www.example.com/schema”注册名称空间前缀,并在XPath表达式中使用它:"//foo:class"
  • 弄清楚你正在使用什么解析器实现以及为什么它与@ Rodney的行为不同,或者改为另一个