2

Java と XStream を使用して、http 経由で Google ジオコード リクエストを解析しています。私の考えは、すべてのジオコード属性 (つまり、緯度/経度、都市、州/州など) を持つ Address クラスを持つことですが、xstream で xml を解析する際に問題があります。

Google の応答は次のようになります。

<?xml version="1.0" encoding="UTF-8" ?>
<kml xmlns="http://earth.google.com/kml/2.0"><Response>
  <name>98 St. Patrick St, Toronto</name>
  <Status>
    <code>200</code>
    <request>geocode</request>
  </Status>
  <Placemark id="p1">
    <address>98 St Patrick St, Toronto, ON, Canada</address>
    <AddressDetails Accuracy="8" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"> <Country><CountryNameCode>CA</CountryNameCode><CountryName>Canada</CountryName><AdministrativeArea><AdministrativeAreaName>ON</AdministrativeAreaName><Locality><LocalityName>Toronto</LocalityName><Thoroughfare><ThoroughfareName>98 St Patrick St</ThoroughfareName></Thoroughfare><PostalCode><PostalCodeNumber>M5T</PostalCodeNumber></PostalCode></Locality></AdministrativeArea></Country></AddressDetails>
    <ExtendedData>
      <LatLonBox north="43.6560378" south="43.6497426" east="-79.3864912" west="-79.3927864" />
    </ExtendedData>
    <Point><coordinates>-79.3896388,43.6528902,0</coordinates></Point>
  </Placemark>
</Response></kml>

うまく表示されませんが、コードの要は AddressDetails タグにあります。

とにかく、私は Java と XStream に慣れていないので、API の用語は少しわかりにくいです。これらすべてのタグ (つまり、CountryName) を Address オブジェクト内の属性 (つまり、address.country = blah) にマップするマッパーを作成できるようにする必要があるだけです。住所オブジェクトは非常に単純で、主に国の文字列だけです。名前などと緯度/経度の浮動小数点数。

ドキュメントと例は、各 xml タグがオブジェクトの同じ名前の属性に直接マップされるストレート マッピングを示しています。ただし、私の場合、タグはオブジェクトの属性とは異なる名前が付けられています。正しい方向への素早いポイントは、私が本当に探しているすべてです。

4

5 に答える 5

0

json形式で試しましたか?同じはずですが、XStream のドライバーとして com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver を設定する必要があります。

于 2009-07-19T18:46:01.647 に答える
0

XStream のマッピングを処理するための別のクラスを定義することは可能でしょうか? AddressDetails次に、この他のオブジェクトから値をクエリすることで、オブジェクトを簡単に設定できます。

于 2009-05-25T14:39:32.240 に答える
0

xpathを使用して、自分のアドレスオブジェクトを手動で入力するだけになりました。うまくいくようです。

于 2009-06-29T16:00:14.590 に答える
0

これを行うには、EclipseLink JAXB (MOXy)を使用できます。

package com.example;

import javax.xml.bind.annotation.XmlRootElement;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement(name="kml")
public class Address {

    private String country;

    @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:CountryName/text()")
    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

}

@javax.xml.bind.annotation.XmlSchema( 
   namespace = "http://earth.google.com/kml/2.0",
   xmlns = { 
      @javax.xml.bind.annotation.XmlNs(
         prefix = "ns", namespaceURI ="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0")
   },
   elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) 
package com.example; 

完全な例はここにあります:

于 2010-07-21T19:06:26.803 に答える