I use XStream
to map Entities to xml String
@XStreamAlias("user")
public class User {
private String name;
private Integer age;
private String address;
private String gender;
...getter()/setter()...
}
The util method I use:
public static String getXmlFromEntity(Object obj, Class rootClazz, String rootAlias){
XStream magicApi = new XStream(new XppDriver(new NoNameCoder()));
magicApi.registerConverter(new MapEntryConverter());
magicApi.alias(rootAlias, rootClazz);
magicApi.autodetectAnnotations(Boolean.TRUE);
String xml = magicApi.toXML(obj);
return xml;
}
And the converter
public static class MapEntryConverter implements Converter {
public boolean canConvert(Class clazz) {
return AbstractMap.class.isAssignableFrom(clazz);
}
public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) {
AbstractMap map = (AbstractMap) value;
for (Object obj : map.entrySet()) {
Map.Entry entry = (Map.Entry) obj;
writer.startNode(entry.getKey().toString());
Object val = entry.getValue();
if ( null != val ) {
writer.setValue(val.toString());
}else {
writer.setValue("bbb");
}
writer.endNode();
}
}
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
Map<String, String> map = new HashMap<String, String>();
while(reader.hasMoreChildren()) {
reader.moveDown();
String key = reader.getNodeName(); // nodeName aka element's name
String value = reader.getValue();
map.put(key, value);
reader.moveUp();
}
return map;
}
}
I want to get a result that for example if the gender is not set, that Tag should also be included as a empty tag instead of omitting it in the result xml string:
<user>
<name>Tom</name>
<address>228 Park Ave S. New York, NY 10003</address>
</user>
I want the result to be:
<user>
<name>Tom</name>
<address>228 Park Ave S. New York, NY 10003</address>
<gender></gender>
<age></age>
</user>
How could I do that?