XStream是一个Java对象和XML相互转换的工具,很好很强大。提供了所有的基础类型、数组、集合等类型直接转换的支持。因此XML常用于数据交换、对象序列化(这种序列化和Java对象的序列化技术有着本质的区别)。
XStream对象相当Java对象和XML之间的转换器,转换过程是双向的。创建XSteam对象的方式很简单,只需要new XStream()即可。
Java到xml,用toXML()方法。
Xml到Java,用fromXML()方法。
别名配置包含三种情况:
1、类别名,用alias(String name, Class type)。
2、类成员别名,用aliasField(String alias, Class definedIn, String fieldName)(alias是别名,definedIn是类名,fieldName类中的变量名)
3、类成员作为属性别名,用 aliasAttribute(Class definedIn, String attributeName, String alias)(definedIn是类名,attributeName是类中的属性名,alias是设置后的别名);
单独命名没有意义,还要通过useAttributeFor(Class definedIn, String fieldName)(definedIn是类名,fieldName是要将类中fieldName属性作为属性) 应用到某个类上。
下面来个例子:
package com.entity;
import java.util.ArrayList;
import java.util.List;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
public class InputMessage {
private String FromUserName;
private String AgentType;
private String ItemCount;
private String PackageId;
private List<InputMessageItem> Item = new ArrayList<InputMessageItem>();
public String getFromUserName() {
return FromUserName;
}
public void setFromUserName(String fromUserName) {
FromUserName = fromUserName;
}
public String getAgentType() {
return AgentType;
}
public void setAgentType(String agentType) {
AgentType = agentType;
}
public String getItemCount() {
return ItemCount;
}
public void setItemCount(String itemCount) {
ItemCount = itemCount;
}
public String getPackageId() {
return PackageId;
}
public void setPackageId(String packageId) {
PackageId = packageId;
}
public List<InputMessageItem> getItem() {
return Item;
}
public void setItem(List<InputMessageItem> item) {
Item = item;
}
}
package com.entity;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
public class InputMessageItem {
private String FromUserName;
private Long CreateTime;
private String MsgType;
private String Event;
private InputMessageReceiver Receiver;
public String getFromUserName() {
return FromUserName;
}
public void setFromUserName(String fromUserName) {
FromUserName = fromUserName;
}
public Long getCreateTime() {
return CreateTime;
}
public void setCreateTime(Long createTime) {
CreateTime = createTime;
}
public String getMsgType() {
return MsgType;
}
public void setMsgType(String msgType) {
MsgType = msgType;
}
public String getEvent() {
return Event;
}
public void setEvent(String event) {
Event = event;
}
public InputMessageReceiver getReceiver() {
return Receiver;
}
public void setReceiver(InputMessageReceiver receiver) {
this.Receiver = receiver;
}
}
package com.entity;
public class InputMessageReceiver {
private String Type;
private String Id;
public String getType() {
return Type;
}
public void setType(String type) {
this.Type = type;
}
public String getId() {
return Id;
}
public void setId(String id) {
this.Id = id;
}
}
package com.seeyon.weixin.collaboration.controller;
import com.entity.InputMessage;
import com.entity.InputMessageItem;
import com.entity.InputMessageReceiver;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
public class TextXML {
public static void test(){
String xml = "<xml><ItemCount>1</ItemCount><PackageId>429496729768324897</PackageId><Item><FromUserName><![CDATA[zhangsan]]></FromUserName></Item><Item><FromUserName><![CDATA[lisi]]></FromUserName><Receiver><Type>single</Type><Id>wangwu</Id></Receiver></Item></xml>";
//将POST流转换为XStream对象
XStream xs = new XStream(new DomDriver());
//将指定节点下的xml节点数据映射为对象
xs.alias("xml", InputMessage.class);
xs.alias("Item", InputMessageItem.class);
xs.alias("Receiver", InputMessageReceiver.class);
//去掉集合类型生成xml的父节点
xs.addImplicitArray(InputMessage.class, "Item");
//将ItemCount别名设置为haha
xs.aliasField("haha", InputMessage.class, "ItemCount");
//将InputMessage类的ItemCount、PackageId设置为属性
xs.useAttributeFor(InputMessage.class, "PackageId");
/************* 设置属性的别名 ***************/
xs.aliasAttribute(InputMessage.class, "PackageId", "attribute");
//把xml转换为java对象
InputMessage inputMessage = (InputMessage) xs.fromXML(xml);
//把java对象转换为xml
String XML = xs.toXML(inputMessage);
System.out.println(xs.fromXML(xml).toString());
System.out.println(XML);
}
public static void main(String[] args) {
test();
}
}
原始xml:
<xml>
<ItemCount>1</ItemCount>
<PackageId>429496729768324897</PackageId>
<Item>
<FromUserName><![CDATA[zhangsan]]></FromUserName>
</Item>
<Item>
<FromUserName><![CDATA[lisi]]></FromUserName>
<Receiver>
<Type>single</Type>
<Id>wangwu</Id>
</Receiver>
</Item>
</xml>
输出结果:
<xml attribute="429496729768324897">
<haha>1</haha>
<Item>
<FromUserName>zhangsan</FromUserName>
</Item>
<Item>
<FromUserName>lisi</FromUserName>
<Receiver>
<Type>single</Type>
<Id>wangwu</Id>
</Receiver>
</Item>
</xml>