Xstream是一种OXMapping 技术,是用来处理XML文件序列化的框架,在将javaBean序列化,或将XML文件反序列化的时候,不需要其它辅助类和映射文件,使得XML序列化不再繁索。
官网地址 http://xstream.codehaus.org/ 里面有很多详细的例子及jar包下载;
下载二进制开发包1.4.7版本:Binary distribution
jar包选用,目前选择这个三个就够用了:
xstream-1.4.7.jar
jettison-1.2.jar
xpp3_min-1.1.4c.jar
我使用的是1.3.1版本,jar包选用都一样,项目中需要使用在axis2中发送xml类型的字符串格式,我就用了XStream类转换处理xml和java实体类,以下是实战代码 :
特别注意:属性名与节点名称对应,区分大小写,如果写错会报 CannotResolveClassException 异常,转换时节点的名称没有在节点实体类属性中找到也会报这个错误!
节点实体类:
public class Root implements Serializable {
private TransData TransData; //根节点
//getter setter
}
public class TransData implements Serializable {
private TransHead TransHead; //报文头
private TransBody TransBody; //报文体
//getter setter
}
public class TransHead implements Serializable {
private String TransType; //交易码
private Date TransDate; //数据传送日期
private String TransTime; //时间传送时间
private Reserve Reserve; //保留域
//getter setter
}
public class Reserve implements Serializable{
private String Resv1; //保留域
private String Resv2;
private String Resv3;
private String Resv4;
private String Resv5;
//getter setter
}
public class TransBody implements Serializable{
private String AgentCode; //代理人代码 必须
private String AgentLicNo; //代理人协议号 必须
private String AgentGroup;//销售人员所属机构 非必须
private String Resv1; //以下是保留域
private String Resv2;
private String Resv3;
private String Resv4;
private String Resv5;
//getter setter
}
测试代码()
一、节点实体类转换xml格式
import java.sql.Date;
import com.newtouch.component.axis2.model.reqeust.Reserve;
import com.newtouch.component.axis2.model.reqeust.Root;
import com.newtouch.component.axis2.model.reqeust.TransBody;
import com.newtouch.component.axis2.model.reqeust.TransData;
import com.newtouch.component.axis2.model.reqeust.TransHead;
import com.thoughtworks.xstream.XStream;
public class Tests {
public static void main(String[] args) {
XStream xstream = new XStream();
/*
* 设置别名,如果不设置xml中父节点名称会类的路径名称,别名区分大小写
* 如Reserve节点会是com.newtouch.component.axis2.model.reqeust.Reserve
*/
xstream.alias("Reserve", Reserve.class);
xstream.alias("TransData", TransData.class);
xstream.alias("TransHead", TransHead.class);
xstream.alias("TransBody", TransBody.class);
xstream.alias("Root", Root.class);
//常见节点元素设置各种依赖关系
TransBody tb = new TransBody();
tb.setAgentCode("113313");
tb.setAgentLicNo("313");
tb.setAgentGroup("121");
tb.setResv1("");
tb.setResv2("");
tb.setResv3("");
tb.setResv4("");
tb.setResv5("");
Reserve r = new Reserve();
r.setResv1("");
r.setResv2("");
r.setResv3("");
r.setResv4("");
r.setResv5("");
TransHead th = new TransHead();
th.setTransDate(new Date(System.currentTimeMillis()));
th.setTransTime("18:20:00");
th.setTransType("211311311133");
th.setReserve(r);
TransData td = new TransData();
td.setTransBody(tb);
td.setTransHead(th);
Root rt = new Root();
rt.setTransData(td);
String xml = xstream.toXML(rt);
System.out.println(xml);
}
}
打印结果 :
<Root>
<TransData>
<TransHead>
<TransType>211311311133</TransType>
<TransDate>2014-04-18</TransDate>
<TransTime>18:20:00</TransTime>
<Reserve>
<Resv1></Resv1>
<Resv2></Resv2>
<Resv3></Resv3>
<Resv4></Resv4>
<Resv5></Resv5>
</Reserve>
</TransHead>
<TransBody>
<AgentCode>113313</AgentCode>
<AgentLicNo>313</AgentLicNo>
<AgentGroup>121</AgentGroup>
<Resv1></Resv1>
<Resv2></Resv2>
<Resv3></Resv3>
<Resv4></Resv4>
<Resv5></Resv5>
</TransBody>
</TransData>
</Root>
二 xml转换为节点实体类:
public class TEST {
public static void main(String[] args) throws Exception {
String xml = "<Root>"+
"<TransData>"+
"<TransHead>"+
"<TransType>211311311133</TransType>"+
"<TransDate>2014-04-16</TransDate>"+
"<TransTime>18:20:00</TransTime>"+
"<Reserve>"+
"<Resv1></Resv1>"+
"<Resv2></Resv2>"+
"<Resv3></Resv3>"+
"<Resv4></Resv4>"+
"<Resv5></Resv5>"+
"</Reserve>"+
"</TransHead>"+
"<TransBody>"+
"<AgentCode>113313</AgentCode>"+
"<AgentLicNo>313</AgentLicNo>"+
"<AgentGroup>机构</AgentGroup>"+
"<Resv1></Resv1>"+
"<Resv2></Resv2>"+
"<Resv3></Resv3>"+
"<Resv4></Resv4>"+
"<Resv5></Resv5>"+
"</TransBody>"+
"</TransData>"+
"</Root>";
//这里需要说明下如果不设置和节点名称对应的节点实体类,
//会报错转换错误CannotResolveClassException
XStream xstream = new XStream();
xstream.alias("Reserve", Reserve.class);
xstream.alias("TransData", TransData.class);
xstream.alias("TransHead", TransHead.class);
xstream.alias("TransBody", TransBody.class);
xstream.alias("Root", Root.class);
Root root = (Root)xstream.fromXML(xml);//设置各个别名然后直接转换Root就够了
System.out.println(root.getTransData().getTransHead().getTransTime());
}
}
输出结果:
18:20:00
这样Java实体类和xml格式相互转换就完成了,等有空了再写 axis2 部署webservice接口实战,用的就是例子中传入的xml格式