【问题标题】:XStream Serialize a class to XML using an attribute field as attribute for XML tag of another fieldXStream 使用属性字段作为另一个字段的 XML 标记的属性将类序列化为 XML
【发布时间】:2018-10-25 07:45:03
【问题描述】:

我有这门课

public class EventXML{
    private String name;
    private String ip;
    private Date date;
    private String dateFormat;
    private String eventName;
}

使用此功能:

public String toXML(){
        String x;
        XStream xs = new XStream();
        x = xs.toXML(this);
        return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"+x;
    }

我得到了这个结果:

<?xml version="1.0" encoding="UTF-8"?>
    <EventXML>
      <name>SuperFarmer</name>
      <ip>IPPPPPPP</ip>
      <myData>2018-05-15 12:48:05.343 UTC</myData>
      <dateFormat>HH:mm:ss dd/MM/yyyy</dateFormat>
      <eventName>CLICCA</eventName>
    </EventXML>

但我想要这样的 XML:

<?xml version="1.0" encoding="UTF-8"?>
<EventXML>
  <name>SuperFarmer</name>
  <ip>IPPPPPPP</ip>
  <myData dateFormat="HH:mm:ss dd/MM/yyyy">12:48:05 15/05/2018</myData>
  <eventName>CLICCA</eventName>
</EventXML>

你能给我一些提示来实现我的目标吗?

【问题讨论】:

  • 所以问题出在属性或日期格式上?
  • 两者兼而有之,但最重要的是使用 dateFromat 作为 myData 的属性

标签: java xml xstream


【解决方案1】:

如果您使用 Xstream 1.14.x,请使用注释。

EventXML 对象应如下所示:

public class EventXML {
    public String name;
    public String ip;

    @XStreamAlias("myData")
    public MyData myData = new MyData();

    public String eventName;

    @XStreamConverter(value=ToAttributedValueConverter.class, strings={"date"})
    public static class MyData {

        public Date date;

        @XStreamAsAttribute
        public String dateFormat;
    }
}

Maven 依赖(如果你使用 maven):

<!-- https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream -->
<dependency>
    <groupId>com.thoughtworks.xstream</groupId>
    <artifactId>xstream</artifactId>
    <version>1.4.10</version>
</dependency>

您的 toXml 方法应该如下所示(使用 processAnnotations):

public String toXml() {
    XStream xstream = new XStream();
    // Note the processAnnotations:
    xstream.processAnnotations(EventXML.class);
    String x = xstream.toXML(this);
    return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + x;
}

【讨论】:

    【解决方案2】:

    通过对EventXML 类进行一些更改,我能够达到所需的 xml 输出。我创建了一个包含&lt;myData&gt;element 和属性的内部类:

    public class EventXML
    {
        public String name;
        public String ip;
        public MyData myData = new MyData();
        public String eventName;
    
        public static class MyData {
            public Date date;
            public String dateFormat;
        }
    }
    

    现在在序列化方法中,我们告诉xstream如何将MyData序列化为xml元素,同时告诉xstream如何转换日期字段:

    1. ToAttributedValueConverter 接受一个类(第一个参数)和字段名称(最后一个参数),命名字段将用作元素的值,该类的所有其他字段将用作属性

    2. DateConverter 被 xstream 用来转换 Date 类型的字段,我将它提供为 dateFormat 作为参数。

    这就是它的样子:

    public String toXML() {
        String x;
        XStream xs = new XStream();
    
        // the following tell XStream how to craete myData element:
        // the last arg is the field to be used as element value and all other fields are attributes
        xs.registerConverter(new ToAttributedValueConverter(MyData.class, xs.getMapper(), xs.getReflectionProvider(),
            xs.getConverterLookup(), "date"));
        // register date converter according to dateFormat field
        xs.registerConverter(new DateConverter(myData.dateFormat, new String[]{}));
    
        x = xs.toXML(this);
        return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"+x;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 2011-06-29
      • 1970-01-01
      相关资源
      最近更新 更多