2009-11-13 2 views
15

Я хотел бы сериализовать объект в XML этой формы с помощью XStream.XStream: узел с атрибутами и текстовым узлом?

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

Значение узла (текста) является полем на сериализованном объекта, а также Att атрибут. Возможно ли это без написания конвертера для этого объекта?

Спасибо!

ответ

7

написать конвертер, это должно быть что-то похожее на фрагмент кода

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

И при использовании XStream, зарегистрировать преобразователь

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

да, это похоже на то, что я сделал, но я добавил writer.setValue (fieldDto.getText()) для установки узла текст. – subb

+0

yes Subb, требуется установить значение узла, пропустили его в фрагменте – Kiru

1

Это намного проще в JAXB

@XmlRootElement 
public class Node { 

    @XmlAttribute 
    String att; 

    @XmlValue 
    String value;  

} 
+0

Просмотрите мой пост в блоге, сравнивая JAXB & XStream: http://bdoughan.blogspot.com/2010/10/how-does-jaxb-compare -to-xstream.html –

16

вы можете использовать предопределенный конвертер.

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

XStream Annotations Tutorial также говорит, что для АТТ атрибута:

Обратите внимание, что не XStreamAsAttribute аннотаций не было необходимости. Преобразователь предполагает это неявно.

+3

Я думаю, что это должен быть ответ – sunil

+1

+1 Это сработало для меня, хотя это очень неинтуитивно. Должна быть аннотация '@ XStreamValue', подобная аннотации JAXB' @ XmlValue'. – Asaph

0

Еще один способ сделать это:

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

    XStream xStream = new XStream(); 
    xStream.autodetectAnnotations(true); 
    xStream.useAttributeFor(My.class, "field"); 
Смежные вопросы