2012-03-13 12 views
0

私はGoogleのAPIを使用して地図を表示するアプリケーションビルドしています。ユーザー入力アドレスを使用して、APIにクエリを送信して目的地までの道順を問い合わせます。 APIは私にXMLレスポンスを返します。このXMLレスポンスは、私の方向オブジェクトを構築し、ユーザに情報を表示するために解析します。java xpathは予期しない値を返します

すべてが機能しますが、xpath.evaluate()の一部が期待通りに機能しません。たとえば、この応答:

Google Maps Response

私が使用:

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

はさえ//legは、右の仕事をすればよいですか?

legList.getLength()を実行すると、私には23が返されますが、レスポンスには2つの脚しかありません。なぜこの奇妙な行動が起こっているのか知っていますか?私はXML Namespaceについて読んでいますが、答えが何も含まれていなくても名前空間を明示すべきかどうかはまだ分かりません。このような:

+0

与えられた応答のために、「// leg」と「// route/leg」は同等です。すべての可能な回答で必ずしも同等であるとは限りません。 '/ route/leg'を試しましたか? 'legList'のノードは何ですか? – beerbajay

+1

私のJVM(Sun JDK1.6.0_14)で、XPathConstants.NODEを要求すると、com.sun.org.apache.xerces.internal.dom.DeferredElementImplというタイプが返されます。これもNodeListインターフェイスを実装しています。だから私はそれがXMLで見つけた最初の要素の子ノードの数として長さを報告していると思います。 –

答えて

1

あなたはこのコードを試してみてください

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

あなたは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); 
+0

ありがとうございました。 – David

+0

私が理解していないと思うのは、カウントが私に23を与えた理由です。「」タグはノード権利ですか?私はそれがノードリストに見つかるはずのすべてのレッグノードを追加すると思った。しかし、それはそれがすべての子供を追加したように見えます、そうですか? – David

+1

@David:上記のコメントを参照してください。 Xmlの任意の要素ノードは、潜在的に子ノードのリストを持つ可能性があるため、NodeList(インターフェイス)として自分自身を表すことができます。 (おそらくtextNode型は子を持つことができないので、NodeListを実装しないでしょう。) –

0

を使用する必要があります。

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

ノード集合はXPathConstants.NODEが単一のオブジェクトを返すている間のNodeListを返しています。

関連する問題