2010-03-28 4 views
6

Ich habe die folgende XML-XStream zugleich Attribute und Werte analysieren

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

eine Stadt Klasse

public class City { 

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

    // getters & setters... 
} 

habe ich versucht, die folgenden Aliase die XML

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

Aber ich kann nicht herausfinden, wie man den Wert des "loc" -Tags einstellt, wenn ich versuche, das City-Objekt in XML umzuwandeln, bekomme ich

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

Wenn ich diese bekommen müssen wirklich

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

Dann, wenn ich versuchen, die XML zu einem Stadt-Objekt zu analysieren ich das Feld „name“ mit einem Null-Wert zu erhalten.

Jeder weiß, wie man die richtigen Aliase dafür einstellen kann? Danke im Voraus.

Antwort

8

ich endlich die Lösung gefunden, ein Converter diese löst, hier ist der Code

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

} 

Und im Teil die Aliase der Einstellung ich auch die CityConverter

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

einrichten und alles funktioniert gut :)

1

XStream scheint irgendwie kompliziert, könnten Sie das folgende in JAXB tun:

public class City { 

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

    // getters & setters... 
} 
+2

Schauen Sie sich meinen Blogbeitrag an Vergleichen von JAXB & XStream: http://bdoughan.blogspot.com/2010/10/how-does-jaxb-compare-to-xstream.html –

4

ich dies in der Hoffnung bin Entsendung, dass es vielleicht anderen helfen, weil es dauerte einige Zeit, um es zu finden ... http://fahdshariff.blogspot.com/2011/12/using-xstream-to-map-single-element.html

Die Antwort ist @XStreamConverter zu verwenden - ToAttributedValueConverter

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

    String message; 

    ... 

Es gibt viele interessante Konverter, die alle möglichen nützlichen Funktionen bieten ... http://x-stream.github.io/converters.html

+0

Viel einfachere Lösung, sollte es die am meisten uplooted sein – maxivis