Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java XStream使用一个属性字段作为另一个字段的XML标记的属性,将一个类序列化为XML_Java_Xml_Xstream - Fatal编程技术网

Java XStream使用一个属性字段作为另一个字段的XML标记的属性,将一个类序列化为XML

Java XStream使用一个属性字段作为另一个字段的XML标记的属性,将一个类序列化为XML,java,xml,xstream,Java,Xml,Xstream,我有这门课 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();

我有这门课

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;
    }
公共字符串toXML(){
字符串x;
XStream xs=新的XStream();
x=xs.toXML(本);
返回“\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>

超级战士
IPPPPPP
2018-05-15 12:48:05.343 UTC
HH:mm:ss dd/mm/yyyy
克里卡
但我想要这样的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>
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;
    }
}

超级战士
IPPPPPP
12:48:05 15/05/2018
克里卡

你能给我一些技巧来实现我的目标吗?

通过对
EventXML
类的一些更改,我能够获得所需的xml输出。我创建了一个包含
元素和属性的内部类:

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如何转换日期字段:

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

  • xstream使用
    DateConverter
    转换
    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;
    }
    
    公共字符串toXML(){
    字符串x;
    XStream xs=新的XStream();
    //以下内容告诉XStream如何创建myData元素:
    //最后一个参数是用作元素值的字段,所有其他字段都是属性
    registerConverter(新的ToAttributedValueConverter(MyData.class、xs.getMapper()、xs.getReflectionProvider()、xs,
    getConverterLookup(),“date”);
    //根据dateFormat字段注册日期转换器
    registerConverter(新的日期转换器(myData.dateFormat,新字符串[]{});
    x=xs.toXML(本);
    返回“\n”+x;
    }
    
    如果使用Xstream 1.14.x,请使用注释

    EventXML对象应如下所示:

    <?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>
    
    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):

    
    com.thoughtworks.xstream
    xstream
    1.4.10
    
    您的toXml方法应该如下所示(带有processAnnotations):

    公共字符串toXml(){
    XStream XStream=新的XStream();
    //请注意processAnnotations:
    processAnnotations(EventXML.class);
    字符串x=xstream.toXML(this);
    返回“\n”+x;
    }
    
    所以问题出在属性或日期格式上?两者都有,但最重要的是使用dateFromat作为myData的属性