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

Posted

技术标签:

【中文标题】XStream:具有属性和文本节点的节点?【英文标题】:XStream : node with attributes and text node? 【发布时间】:2010-12-16 03:50:09 【问题描述】:

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

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

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

谢谢!

【问题讨论】:

【参考方案1】:

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

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

XStream Annotations Tutorial 也表示 att 属性:

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

【讨论】:

我认为这应该是答案 +1 这对我有用,尽管这非常不直观。应该有一个类似于 JAXB 的 @XmlValue 注释的 @XStreamValue 注释。【参考方案2】:

写一个转换器,应该是类似sn-p的代码

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

【讨论】:

是的,这看起来像我所做的,但我添加了 writer.setValue(fieldDto.getText()) 来设置节点的文本。 yes subb,需要设置节点值,sn -p中漏掉了 看看下面的@mantrid 答案。这是更简单的出路。【参考方案3】:

这在 JAXB 中要容易得多

@XmlRootElement
public class Node 

    @XmlAttribute
    String att;

    @XmlValue
    String value;    


【讨论】:

查看我的比较 JAXB 和 XStream 的博文:bdoughan.blogspot.com/2010/10/… 问题是关于 XStream,而不是 JAXB。【参考方案4】:

只是另一种方式:

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

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

【讨论】:

以上是关于XStream:具有属性和文本节点的节点?的主要内容,如果未能解决你的问题,请参考以下文章

xstream xml转化成java对象

xStream转换XMLJSON

xStream javaBean转为xml时,怎么保留空节点

JAVA bean与XML互转的利器---XStream

如何从 Document 或 Node 创建 InputStream

xStream转换xml同名节点到java对象问题