Buenos Aires, Arg...">

XStream parses attributes and values ​​at the same time

I have the following XML

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

And city class

 public class City { private String id; private Integer type; private String name; // getters & setters... } 

I tried the following aliases for parsing XML

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

But I can’t figure out how to set the value of the β€œloc” tag, if I try to convert the City object to XML, I get

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

When do I really need to get this

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

Then, if I try to parse the XML into a City object, I get a "name" field with a null value.

Does anyone know how to set the correct aliases for this? Thanks in advance.

+6
xml xstream
source share
3 answers

Finally, I found a solution, the converter solves this, here is the 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); } } 

And in terms of setting aliases, I also installed CityConverter

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

And everything works fine :)

+8
source share

I am posting this in the hope that this can help others, because it took me a while to find it ... http://fahdshariff.blogspot.com/2011/12/using-xstream-to-map-single-element .html

The answer is to use @XStreamConverter - ToAttributedValueConverter

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

There are many interesting converters that provide all kinds of useful functions ... http://x-stream.imtqy.com/converters.html

+4
source share

XStream seems complicated, you can do the following in JAXB:

 public class City { @XmlAttribute private String id; @XmlAttribute private Integer type; @XmlValue private String name; // getters & setters... } 
+1
source share

All Articles