【问题标题】:XStream : node with attributes and text node?XStream:具有属性和文本节点的节点?
【发布时间】:2023-09-22 02:45:01
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

    标签: java xml xstream


    【解决方案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;    
    
    }
    

    【讨论】:

    【解决方案4】:

    只是另一种方式:

       @XStreamAlias("My")
       private static class My {
          private String field;
       }
    
       XStream xStream = new XStream();
       xStream.autodetectAnnotations(true);
       xStream.useAttributeFor(My.class, "field");
    

    【讨论】: