Question

J'utilise Java et XStream pour analyser une demande de géocodage de Google sur http. Mon idée est d'avoir une classe d'adresses avec tous les géocodage attr de (ie. Lat / long, ville, provice / état etc) mais je vais avoir des problèmes avec l'analyse du xml xstream.

La réponse de Google est similaire à ceci:

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

Cela ne montre pas très bien, mais la viande du code est dans la balise addressdetails.

Quoi qu'il en soit, je suis nouveau à Java et XStream donc la terminologie de l'API est un peu déroutant pour moi. Je dois juste être capable d'écrire une mappeur qui associe toutes ces balises (ie. CountryName) à un attribut dans mon objet Adresse, (ie. Address.country = bla) L'objet adresse sera assez simple, surtout juste des chaînes pour le pays etc nom et flotteurs pour lat / long.

Les documents et l'exemple montrent juste la cartographie droite où chaque balise xml correspond directement à l'attribut du même nom de l'objet. Dans mon cas, cependant, les balises sont nommés différentes que l'objet attr de. Un point rapide dans la bonne direction est tout ce que je suis à la recherche vraiment.

Était-ce utile?

La solution

Je l'ai utilisé XStream dans plusieurs projets. Malheureusement, votre problème est pas vraiment ce que XStream est conçu pour résoudre. Vous pourriez être en mesure d'utiliser son mécanisme de conversion pour atteindre votre objectif immédiat, mais vous tomberez dans les limites. En un mot, XStream ne vise pas à faire la conversion de l'arbre Structure A dans la structure B Arbre - son but est de convertir à partir d'un modèle de domaine Java dans un certain XML raisonnable. XStream est un excellent outil lorsque vous ne se soucient pas beaucoup sur les détails du produit XML. Si vous vous souciez plus sur le XML que les objets Java, regardez XMLBeans -. Java est laid, mais il est incroyablement schéma conforme

Pour votre projet, je courrais le schéma XML Google dans les haricots XML, générer des Java qui vous donnera une façon plus lire et écrire à la main codant pour un convertisseur. Vous pouvez utiliser un arbre DOM cru, mais vous auriez du code comme myAddress.setStreet (root.getFirstChild (). GetAttribute ( "addr1"))). Avec les haricots XML, vous dites des choses comme myAddress.setStreet (googleResult.getAddress () getStreetName ();.

J'ignore JAXB comme il est tentative d'interface distincte de la mise en œuvre ajoute une complexité inutile. Castor pourrait être un bon outil pour considérer aussi bien, mais je l'ai pas utilisé depuis des années.

En un mot, il n'y a pas beaucoup de bons convertisseurs objet-objet ou XML-objet qui gèrent bien la conversion de la structure. Parmi ceux que j'ai vu cette tentative des solutions déclaratives, tous semblaient beaucoup plus compliqué (et pas plus maintenable) que d'utiliser XStream / XmlBeans ainsi que des conversions de structure codées manuellement.

Autres conseils

Serait-il possible de définir une catégorie distincte spécifiquement pour traiter la cartographie de Xstream? Vous pouvez ensuite remplir simplement votre objet AddressDetails en interrogeant les valeurs de cet autre objet.

J'ai fini juste en utilisant XPath et de remplir mon propre objet adresse manuellement. Il semble fonctionner très bien.

Avez-vous essayé avec le format JSON? Il devrait être la même chose, mais vous aurez besoin de mettre un com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver comme pilote pour Xstream

Vous pouvez utiliser EclipseLink JAXB (Moxy) pour faire ceci:

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

}

et

@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 exemple complet est disponible ici:

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top