XPath使用defaultNamespace为xml返回null
我相信它在不久前工作但现在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文档在这里:
有三种选择。 从我的角度来看,最简单的顺序是:
- 将您的XPath从
"//class"
更改为"//*[local-name() = 'class']"
。 它有点kludgy但它会忽略名称空间。 如果这仍然给你零,你知道问题不是命名空间。 - 在Java代码中为“http://www.example.com/schema”注册名称空间前缀,并在XPath表达式中使用它:
"//foo:class"
- 弄清楚你正在使用什么解析器实现以及为什么它与@ Rodney的行为不同,或者改为另一个