XStream: узел с атрибутами и текстовый узел? - PullRequest
18 голосов
/ 13 ноября 2009

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

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

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

Спасибо!

Ответы [ 4 ]

17 голосов
/ 20 января 2012

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

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

Учебник по аннотациям XStream также говорит, что для att атрибут:

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

7 голосов
/ 13 ноября 2009

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

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 голосов
/ 30 июля 2017

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

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

   XStream xStream = new XStream();
   xStream.autodetectAnnotations(true);
   xStream.useAttributeFor(My.class, "field");
0 голосов
/ 20 августа 2010

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

@XmlRootElement
public class Node {

    @XmlAttribute
    String att;

    @XmlValue
    String value;    

}
...