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
接受类(第一个参数)和字段名(最后一个参数)。命名字段将用作元素的值,类的所有其他字段将用作属性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的属性