2010-03-28 8 views
6

ho il seguente codice XMLXStream analizzare gli attributi ei valori allo stesso tempo

<search ver="3.0"> 
    <loc id="ARBA0009" type="1">Buenos Aires, Argentina</loc> 
    <loc id="BRXX1283" type="1">Buenos Aires, Brazil</loc> 
    <loc id="ARDF0127" type="1">Aeroparque Buenos Aires, Argentina</loc> 
    <loc id="MXJO0669" type="1">Concepcion De Buenos Aires, Mexico</loc> 
    <loc id="MXPA1785" type="1">San Nicolas De Buenos Aires, Mexico</loc> 
    <loc id="ARBA0005" type="1">Balcarce, Argentina</loc> 
    <loc id="ARBA0008" type="1">Bragado, Argentina</loc> 
    <loc id="ARBA0010" type="1">Campana, Argentina</loc> 
    <loc id="ARBA0016" type="1">Chascomus, Argentina</loc> 
    <loc id="ARBA0019" type="1">Chivilcoy, Argentina</loc> 
</search> 

E una città di livello

public class City { 

    private String id; 
    private Integer type; 
    private String name; 

    // getters & setters... 
} 

ho provato i seguenti alias per analizzare il codice XML

xStream.alias("search", List.class); 
xStream.alias("loc", City.class); 
xStream.useAttributeFor("id", String.class); 
xStream.useAttributeFor("type", Integer.class); 

Ma non riesco a capire come impostare il valore del tag "loc", se provo a trasformare l'oggetto City in XML ottengo

<search> 
    <loc id="ARBA0001" type="1"> 
     <name>Buenos Aires</name> 
    </loc> 
</search> 

Quando ho davvero bisogno di ottenere questo

<search> 
    <loc id="ARBA0001" type="1">Buenos Aires</loc> 
</search> 

Poi, se cerco di analizzare il codice XML in un oggetto di Città ottengo il campo "Nome" con un valore nullo.

Qualcuno sa come impostare gli alias corretti per farlo? Grazie in anticipo.

risposta

8

ho finalmente trovato la soluzione, un convertitore risolve questo, ecco il codice

public class CityConverter implements Converter { 

    public void marshal(Object value, HierarchicalStreamWriter writer, 
                   MarshallingContext context) { 
     City city = (City) value; 
     writer.addAttribute("id", city.getId()); 
     writer.addAttribute("type", city.getType().toString()); 
     writer.setValue(city.getName()); 
    } 

    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { 
     City city = new City(); 
     city.setName(reader.getValue()); 
     city.setId(reader.getAttribute("id")); 
     city.setType(reader.getAttribute("type")); 
     return city; 
    } 

    public boolean canConvert(Class clazz) { 
     return clazz.equals(City.class); 
    } 

} 

e nella parte di impostare alias Ho anche impostare il CityConverter

xStream.registerConverter(new CityConverter()); 
xStream.alias("search", List.class); 
xStream.alias("loc", City.class); 

E tutto funziona bene :)

1

XStream sembra un po 'complicato, si potrebbe fare quanto segue in JAXB:

public class City { 

    @XmlAttribute private String id; 
    @XmlAttribute private Integer type; 
    @XmlValue private String name; 

    // getters & setters... 
} 
+2

Controlla il mio post sul blog confrontando JAXB e XStream: http://bdoughan.blogspot.com/2010/10/how-does-jaxb-compare-to-xstream.html –

4

sto postando questo nella speranza che possa aiutare gli altri perchè ci ho messo un po 'di tempo per trovarlo ... http://fahdshariff.blogspot.com/2011/12/using-xstream-to-map-single-element.html

La risposta è di usare @XStreamConverter - ToAttributedValueConverter

@XStreamAlias("error") 
@XStreamConverter(value=ToAttributedValueConverter.class, strings={"message"}) 
public class Error { 

    String message; 

    ... 

Ci sono molti convertitori interessanti che forniscono tutti i tipi di funzionalità utili ... http://x-stream.github.io/converters.html

+0

Molto più semplice soluzione, dovrebbe essere il più upvoted – maxivis

Problemi correlati