【问题标题】:Always get null when querying XML with XPath使用 XPath 查询 XML 时始终为 null
【发布时间】:2009-03-16 17:00:08
【问题描述】:

我正在使用以下代码使用从流中获取的 XPath 查询一些 XML。

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

我已经通过将流转换为字符串来检查流中的内容 - 它就在那里 - 所以它不像流中没有数据。

现在这让我很烦 - 因为我尝试了各种不同的代码,但我仍然在“System.out.println”行打印'null' - 我在这里错过了什么?

注意:我想查看元素内的文本。

【问题讨论】:

  • 你的意思是System.out.println(nodes.item(i).getNodeValue());打印“null”或者你得到一个 NullPointerException?
  • 现在对其进行了编辑以使其更清晰 - Eddie 欢呼。

标签: java xml xpath


【解决方案1】:

除了 Brabster 的建议之外,您可能还想尝试一下

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

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

取决于您要显示的内容。

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

【讨论】:

  • 您的代码示例有效!我从来没有想过我错误地查询了节点 - 抱歉有点废话 - 但欢呼 Eddie。
  • 注意 getTextContent() - 它会返回您选择的节点的文本内容以及任何子节点。可能不是你想要的。
【解决方案2】:

不是 Java XPath impl tbh 方面的专家,但这可能会有所帮助。

javadocs 说,对于大多数类型的节点,getNodeValue() 的结果将为空。

您希望在输出中看到什么并不完全清楚;元素名称、属性、文本?我会猜文字。在我使用过的任何 XPath impl 中,如果你想要节点的文本内容,你必须 XPath 来

//FOO_ELEMENT/text()

那么节点的值就是节点的文本内容。

getTextContent() 方法将根据 javadoc 返回您使用 XPath 选择的节点的文本内容,以及任何后代节点。上面的解决方案恰好选择了文档中任何节点 FOO_ELEMENT 的文本组件。

Java EE Docs for Node

【讨论】:

  • 一定是这样。另请查看 java.sun.com/javase/6/docs/api/org/w3c/dom/Node.html 以获取 JDK 6 JavaDoc。
  • 是的,抱歉应该检查一下版本哦!
  • “不工作”是什么意思?您正在选择一组元素,并清楚地获得该组,否则您将获得 NullPointerException。根据 Node 的文档,getNodeValue() 在元素上调用时返回 null。
  • 对不起,我的意思是“//FOO_ELEMENT/text()” - 对我不起作用。
  • “javadocs 说他的 getNodeValue() 结果对于大多数类型的节点将为空” - 多么奇怪 - 我想知道这个方法调用的确切用途是什么??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-16
  • 2019-01-12
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
相关资源
最近更新 更多