XStream:具有属性和文本节点的节点?

发布于 2024-08-11 09:06:09 字数 197 浏览 8 评论 0原文

我想使用 XStream 将对象序列化为这种形式的 XML。

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

节点的值 (text) 是序列化对象上的一个字段,以及 att 属性。如果不为此对象编写转换器,这可能吗?

谢谢!

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!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

兮子 2024-08-18 09:06:09

您可以使用预定义的转换器。

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

XStream Annotations Tutorial 还指出了 att 属性:

请注意,不需要 XStreamAsAttribute 注释。这
转换器隐式假定它。

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.

巷雨优美回忆 2024-08-18 09:06:09

编写一个转换器,它应该类似于代码片段

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

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());
掐死时间 2024-08-18 09:06:09

这在 JAXB 中要容易得多

@XmlRootElement
public class Node {

    @XmlAttribute
    String att;

    @XmlValue
    String value;    

}

This is much easier in JAXB

@XmlRootElement
public class Node {

    @XmlAttribute
    String att;

    @XmlValue
    String value;    

}
傲世九天 2024-08-18 09:06:09

只是另一种方法:

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

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

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");
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文