2009-11-13 9 views
15

Chciałbym serializować obiekt do XML tego formularza z XStream.XStream: węzeł z atrybutami i węzłem tekstowym?

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

wartość węzła (tekstu) jest polem na odcinkach obiektu, jak również atrybut att. Czy jest to możliwe bez pisania konwertera dla tego obiektu?

Dzięki!

Odpowiedz

7

napisać konwerter, powinno być coś podobnego do fragmentu kodu

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

I podczas korzystania XStream, zarejestruj się konwerter

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

tak, to wygląda na to, co zrobiłem, ale dodałem writer.setValue (fieldDto.getText()), aby ustawić węzła tekst. – subb

+0

Tak Subb, wymagane jest ustawienie wartości węzła, pominięte w opisie. – Kiru

1

Jest to o wiele łatwiejsze w JAXB

@XmlRootElement 
public class Node { 

    @XmlAttribute 
    String att; 

    @XmlValue 
    String value;  

} 
+0

Zobacz mój wpis na blogu porównujący JAXB i XStream: http://bdoughan.blogspot.com/2010/10/how-does-jaxb-compare -to-xstream.html –

16

można użyć predefiniowanego konwertera.

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

XStream Annotations Tutorial mówi również, że dla atrybut att:

nocie, że żadne adnotacje XStreamAsAttribute były konieczne. Konwerter zakłada to niejawnie.

+3

Myślę, że to powinna być odpowiedź – sunil

+1

+1 To działało dla mnie, chociaż jest to wysoce niezrozumiałe. Powinna istnieć adnotacja '@ XStreamValue' podobna do adnotacji JAXB' @ XmlValue'. – Asaph

0

Kolejny sposób to zrobić:

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

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