2009-11-13 16 views
15

Ich möchte ein Objekt zu einem XML dieses Formulars mit XStream serialisieren.XStream: Knoten mit Attributen und Textknoten?

<node att="value">text</node> 

Der Wert des Knotens (Text) ist ein Feld, auf dem serialisierten Objekt, sowie das att Attribut. Ist das möglich, ohne einen Konverter für dieses Objekt zu schreiben?

Danke!

Antwort

7

schreiben ein Konverter, sollte es etwas ähnlich dem Code-Schnipsel

class FieldDtoConvertor implements Converter { 
    @SuppressWarnings("unchecked") 
    public boolean canConvert(final Class clazz) { 
     return clazz.equals(FieldDto.class); 
    } 

    public void marshal(final Object value, 
      final HierarchicalStreamWriter writer, 
      final MarshallingContext context) { 
     final FieldDto fieldDto = (FieldDto) value; 
     writer.addAttribute(fieldDto.getAttributeName(), fieldDto.getAttributeValue());  
    } 
} 

Und während mit XStream, registrieren Sie den Konverter

final XStream stream = new XStream(new DomDriver()); 
stream.registerConverter(new FieldDtoConvertor()); 
+0

ja, das sieht aus wie, was ich getan habe, aber ich habe eine writer.setValue hinzugefügt (fieldDto.getText()) des Knotens zu setzen Text. – subb

+0

ja Subb, ist es erforderlich, den Knoten Wert zu setzen, verpasste es in das Snippet – Kiru

1

Das ist viel einfacher in JAXB

@XmlRootElement 
public class Node { 

    @XmlAttribute 
    String att; 

    @XmlValue 
    String value;  

} 
sein
+0

Überprüfen Sie meine Blog-Post vergleicht JAXB & XStream: http://bdoughan.blogspot.com/2010/10/how-does-jaxb-compare -to-xstream.html –

16

können Sie einen vordefinierten Konverter verwenden.

@XStreamAlias("node") 
@XStreamConverter(value=ToAttributedValueConverter.class, strings={"text"}) 
class Node { 
    private String att; 
    private String text; 
} 

XStream Annotations Tutorial sagt auch, dass für att Attribut:

Hinweis, dass keine XStreamAsAttribute Anmerkungen notwendig waren. Der Konverter übernimmt dies implizit.

+3

ich denke, das sollte die Antwort sein – sunil

+1

+1 Das funktionierte für mich, obwohl dies sehr unintuitiv ist. Es sollte eine '@ XStreamValue' Annotation ähnlich der JAXB' @ XmlValue' Annotation geben. – Asaph

0

Nur ein weiterer Weg, es zu tun:

@XStreamAlias("My") 
    private static class My { 
     private String field; 
    } 

    XStream xStream = new XStream(); 
    xStream.autodetectAnnotations(true); 
    xStream.useAttributeFor(My.class, "field"); 
Verwandte Themen