Domanda

Sto usando Java e xstream per analizzare una richiesta geocode google su HTTP. La mia idea è quella di avere una classe di indirizzo con tutti (es. / Lungo, città, provice / stato lat ecc) del attr geocodifica ma sto avendo problemi di parsing XML con XStream.

La risposta di Google è simile a questo:

<?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>

che non mostra molto bene, ma la carne del codice è nel tag AddressDetails.

In ogni caso, io sono nuovo a Java e xstream così la terminologia API è un po 'di confusione per me. Ho solo bisogno di essere in grado di scrivere un po 'di mapping che mappa tutti questi tag (es. CountryName) per un attributo nel mio oggetto Indirizzo, (vale a dire. Address.country = bla) L'oggetto indirizzo sarà abbastanza semplice, principalmente solo stringhe per paese nome ecc e galleggianti per Lat Long /.

La documentazione e l'esempio appena mostrano mappatura rettilineo dove ciascun tag XML mappe direttamente all'attributo con lo stesso nome dell'oggetto. Nel mio caso, tuttavia, i tag sono chiamati diverso rispetto alle attr oggetto di. Un punto rapido nella direzione giusta è tutto quello che sto cercando davvero.

È stato utile?

Soluzione

Ho usato xstream in diversi progetti. Purtroppo, il problema non è davvero quello che xstream è progettato per risolvere. Potreste essere in grado di utilizzare il suo meccanismo convertitore per raggiungere il tuo obiettivo immediato, ma si incorrerà in limitazioni. In poche parole, XStream non è progettato per effettuare la conversione di struttura ad albero A nella struttura ad albero B - il suo scopo è quello di convertire da un modello di dominio Java in qualche XML ragionevole. XStream è un grande strumento quando non si cura molto circa i dettagli del XML prodotto. Se vi interessa di più su XML che gli oggetti Java, guarda XMLBeans -. Java è brutto, ma è incredibilmente schema-compatibile

Per il progetto, mi piacerebbe correre lo schema XML di Google attraverso i fagioli XML, generare una certa Java che vi darà un modo più letterato di codifica a mano un convertitore. Si potrebbe utilizzare un albero DOM crudo, ma avresti codice come myAddress.setStreet (root.getFirstChild (). GetAttribute ( "addr1"))). Con fagioli XML, dite le cose come myAddress.setStreet (googleResult.getAddress () getStreetName ();.

Mi piacerebbe ignoro JAXB come è tentativo di separare l'interfaccia dall'implementazione aggiunge complessità inutile. Castor potrebbe essere un buon strumento da considerare pure, ma io non l'ho usato in questi anni.

In poche parole, non ci sono un sacco di bene oggetto-to-Object o convertitori XML-to-Object che gestiscono bene la conversione della struttura. Di quelli che ho visto che le soluzioni dichiarative tentativo, tutti loro sembrava molto più complicato (e non più gestibile) rispetto all'utilizzo XStream / XmlBeans insieme a conversioni struttura codificati a mano.

Altri suggerimenti

Sarebbe possibile definire una classe separata appositamente per trattare con la mappatura di XStream? Si potrebbe quindi è sufficiente compilare l'oggetto AddressDetails interrogando valori fuori da questo altro oggetto.

Ho finito solo usando XPath e popolando il mio oggetto indirizzo manualmente. Sembra funzionare bene.

Hai provato con il formato JSON? Dovrebbe essere lo stesso, ma è necessario impostare un com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver come il driver per XStream

Si potrebbe utilizzare EclipseLink JAXB (Moxy) per fare questo:

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;
    }

}

e

@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; 

Un esempio completo è disponibile qui:

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top