【问题标题】:java xpath return unexpected valuesjava xpath 返回意外的值
【发布时间】:2012-03-13 13:32:58
【问题描述】:

我正在构建一个使用 google api 显示地图的应用程序。使用用户输入的地址,我查询 API 以获取到目的地的路线。 API 返回一个 XML 响应,我对其进行解析以构建路线对象并向用户显示信息。

一切正常,但我的一些 xpath.evaluate() 使用没有按我的预期工作。例如这个响应:

Google Maps Response

当我使用时:

NodeList legList = (NodeList) xpath.evaluate("//route/leg",
                    response, XPathConstants.NODE);

即使//leg也应该做正确的工作吗?

当我执行 legList.getLength() 时,它给了我 23,但响应中只有两条腿。你知道为什么会发生这种奇怪的行为吗?我读到了XML Namespace,但我仍然不知道该怎么做,即使答案不包含任何命名空间,我是否应该指定一个命名空间,如果是,我为什么要这样做?

【问题讨论】:

  • 对于给定的响应 //leg//route/leg 是等价的。它们不一定在所有可能的响应中都相同。你试过/route/leg吗? legList中的节点是什么?
  • 在我的 JVM (Sun JDK1.6.0_14) 上,请求 XPathConstants.NODE,返回类型:com.sun.org.apache.xerces.internal.dom.DeferredElementImpl - 它也实现了 NodeList 接口。所以我相信它将长度报告为它在 Xml 中找到的第一个 元素的子节点数。

标签: java xml xpath


【解决方案1】:

你需要使用

    NodeList legList = (NodeList) xpath.evaluate(expr,
            xml, XPathConstants.NODESET);

【讨论】:

    【解决方案2】:

    如果你想要一个 NodeList 使用XPathConstants.NODESET 而不是 XPathConstants.NODE(请在此处查看映射:http://docs.oracle.com/javase/6/docs/api/javax/xml/xpath/XPathConstants.html#NODESET),如下所示:

    NodeList legList = (NodeList) xpath.evaluate("//route/leg", response, XPathConstants.NODESET);
    

    【讨论】:

    • 我不明白的是为什么count给了我23,<leg>标签是一个节点,对吧?我认为它会将找到的每个支路节点添加到节点列表中。但看起来它添加了所有的孩子,对吗?
    • @David:见我上面的评论。 Xml 中的任何元素节点都可以将自身呈现为 NodeList(这是一个接口),因为它可能具有子节点列表。 (可能 textNode 类型不会实现 NodeList,因为它不能有任何子节点。)
    【解决方案3】:

    试试这个代码。

    NodeList legList = (NodeList) xpath.evaluate("/route/leg",
                    response, XPathConstants.NODESET);
    

    NODESET 返回 NodeList 而 XPathConstants.NODE 返回单个 Object。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2021-04-30
      • 1970-01-01
      • 2021-07-29
      • 2020-06-24
      • 2014-12-11
      • 1970-01-01
      相关资源
      最近更新 更多