张晨的个人博客

使用XStream转换Java对象和XML之间相互转换实战代码

张晨的个人博客2014-04-16Java技术 2661 0A+A-

    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格式



文章关键词
xStream
xml
Java
发表评论