2012-03-13 81 views
0

我建立了一个应用程序,它显示了一个与谷歌API的地图。使用用户输入地址,我查询指向目的地的API。该API返回给我一个XML响应,我将解析这些响应以构建我的路线对象并向用户显示信息。java xpath返回意外值

一切正常,但我的一些xpath.evaluate()使用如我所料不工作。例如这样的响应:

Google Maps Response

当我使用:

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

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

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

+0

对于给定的响应'// leg'和'// route/leg'是等价的。在所有可能的反应中,它们不一定相同。你尝试过'/ route/leg'吗? 'legList'中的节点是什么? – beerbajay 2012-03-13 13:52:02

+1

在我的JVM(孙JDK1.6.0_14),请求XPathConstants.NODE,返回类型:com.sun.org.apache.xerces.internal.dom.DeferredElementImpl - 这也实现了节点列表界面。所以我相信它报告的长度是它在Xml中找到的第一个元素的子节点数。 – 2012-03-13 14:43:07

回答

1

您需要使用

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

如果你想有一个节点列表使用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); 
+0

感谢您的解释。 – David 2012-03-13 14:12:57

+0

这个我不明白的是为什么count给我23,''标签是一个节点吧?我认为它会将它找到的每个腿节点添加到节点列表中。但相反,它看起来像添加了所有的孩子,对吧? – David 2012-03-13 14:17:51

+1

@David:看到我上面的评论。来自Xml的任何元素节点都可以将其自身表现为NodeList(这是一个接口),因为它可能有一个子节点列表。 (可能textNode类型不会实现NodeList,因为它不能有任何子节点。) – 2012-03-13 14:58:46

0

试试这个代码。

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

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