2009-11-13 26 views
15

Me gustaría serializar un objeto a un XML de este formulario con XStream.XStream: nodo con atributos y nodo de texto?

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

El valor del nodo (texto) es un campo en el objeto en serie, así como la atributo att. ¿Es esto posible sin escribir un convertidor para este objeto?

Gracias!

Respuesta

7

escribir un convertidor, debe ser algo similar al fragmento de código

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

Y durante el uso de xstream, registrar el convertidor

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

sí, esto se parece a lo que he hecho, pero he añadido un writer.setValue (fieldDto.getText()) para establecer el nodo de texto. – subb

+0

sí Subb, se requiere establecer el valor del nodo, lo perdí en el fragmento – Kiru

1

Esto es mucho más fácil en JAXB

@XmlRootElement 
public class Node { 

    @XmlAttribute 
    String att; 

    @XmlValue 
    String value;  

} 
+0

Revise la publicación de mi blog comparando JAXB y XStream: http://bdoughan.blogspot.com/2010/10/how-does-jaxb-compare -to-xstream.html –

16

puede usar un convertidor predefinido.

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

XStream Annotations Tutorial dice también que para att atributo:

Nota, que no hay anotaciones XStreamAsAttribute eran necesarias. El convertidor lo asume implícitamente.

+3

Creo que esta debería ser la respuesta – sunil

+1

+1 Esto funcionó para mí, aunque esto es muy poco intuitivo. Debería haber una anotación '@ XStreamValue' similar a la anotación' @ XmlValue' de JAXB. – Asaph

0

Sólo otra manera de hacerlo:

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

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