XStream : node with attributes and text node?
Asked Answered
F

4

18

I would like to serialize an object to an XML of this form with XStream.

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

The value of the node (text) is a field on the serialized object, as well as the att attribute. Is this possible without writing a converter for this object?

Thanks!

Forte answered 13/11, 2009 at 3:2 Comment(0)
K
7

write a convertor, it should be something similar to the code snippet

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

And while using XStream,register the convertor

final XStream stream = new XStream(new DomDriver());
stream.registerConverter(new FieldDtoConvertor());
Kylander answered 13/11, 2009 at 6:36 Comment(3)
yes, this looks like what I've done, but I've added a writer.setValue(fieldDto.getText()) to set the node's text.Forte
yes Subb, it is required to set the node value, missed it in the snippetKylander
look at @Nanji answer below. Thats the simpler way out.Micropathology
N
20

you can use a predefined Converter.

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

XStream Annotations Tutorial also says that for att attribute:

Note, that no XStreamAsAttribute annotations were necessary. The converter assumes it implicitly.

Nanji answered 20/1, 2012 at 13:8 Comment(1)
+1 This worked for me, although this is highly unintuitive. There should be an @XStreamValue annotation similar to JAXB's @XmlValue annotation.Bilski
K
7

write a convertor, it should be something similar to the code snippet

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

And while using XStream,register the convertor

final XStream stream = new XStream(new DomDriver());
stream.registerConverter(new FieldDtoConvertor());
Kylander answered 13/11, 2009 at 6:36 Comment(3)
yes, this looks like what I've done, but I've added a writer.setValue(fieldDto.getText()) to set the node's text.Forte
yes Subb, it is required to set the node value, missed it in the snippetKylander
look at @Nanji answer below. Thats the simpler way out.Micropathology
G
0

This is much easier in JAXB

@XmlRootElement
public class Node {

    @XmlAttribute
    String att;

    @XmlValue
    String value;    

}
Gyratory answered 20/8, 2010 at 13:25 Comment(2)
Check out my blog post comparing JAXB & XStream: bdoughan.blogspot.com/2010/10/…Gyratory
The question is about XStream, not JAXB.Burkhalter
F
0

Just another way of doing it:

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

   XStream xStream = new XStream();
   xStream.autodetectAnnotations(true);
   xStream.useAttributeFor(My.class, "field");
Frustration answered 29/7, 2017 at 23:25 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.