2012-03-13 128 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。