XPath使用defaultNamespace为xml返回null

WSK*_*WSK 3 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();
}
Run Code Online (Sandbox Code Playgroud)

XML文档在这里:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="http://www.example.com/schema">
 <class />
 <class />
</root>
Run Code Online (Sandbox Code Playgroud)

Lar*_*rsH 5

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

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