解析XML文件(一)----使用XStream方式

51 篇文章 0 订阅
4 篇文章 0 订阅

在Java开发中经常会遇到使用XML文件传数据的情况,因此就要求我们必须学会如何解析XML文件,现在我们系统里经常使用的DOM4j和XStream两种方式进行解析XML文件的。现在就第二种方法,总结一下我的使用感受和经验。首先是需要两个操作XStream的jar包,我们用的是xpp3_min-1.1.3.4.O.jar和xstream-1.3.1.jar(我已经上传我的CSDN资源啦,欢迎免费下载) 现在就我遇到的这个功能做下总结:

查询成功后返回的XML文件格式如下:

 对于请求的参数的处理,首先我们需要在定义相关的JavaBean,然后将Bean转化成XML格式的字符串,然后写入流OutputStream,通过流的形式传给服务器,服务器响应之后又以XML的形式返回响应数据。

因此针对请求参数,需要定义一下实体类(get,set方法省略):

public class TongChengWangMessage  {	
	private Trasinf trasinf; 
	private Ucom ucom;
}
public class Trasinf {
	private String service; // 服务器名称
	private String act; // 分配给各分公司的账号
	
}
public class Ucom {
	private String startTime;	private String endTime; 	
	private String policyCode; 	private String isInsure;	
	
}

1.请求参数由JavaBean转化成XML形式,需要用到Stream的toXML()方法

   TongChengWangMessage message = new TongChengWangMessage();
   Trasinf trasif = new Trasinf();
   trasif.setAct("1111");
   trasif.setService("GetInsuranceInfo");
   Ucom ucom = new Ucom();
   ucom.setPolicyCode("tryyu");
   ucom.setIsInsure("1");
   ucom.setStartTime("20130529");
   ucom.setEndTime("20130530");
   message.setTrasinf(trasif);
   message.setUcom(ucom);
   String res = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
   XStream xx = new XStream();
   //不加下面这一句,会出现节点  com.cpic.ryx.bean.commpay.TongChengWangMessage
   xx.alias("reqinfo", TongChengWangMessage.class);
   System.out.println("send:\n"+res + xx.toXML(message));
输出为:

send:
<?xml version="1.0" encoding="UTF-8"?>
<reqinfo>
  <trasinf>
    <service>GetInsuranceInfo</service>
    <act>1111</act>
  </trasinf>
  <ucom>
    <startTime>20130529</startTime>
    <endTime>20130530</endTime>
    <policyCode>tryyu</policyCode>
    <isInsure>1</isInsure>
  </ucom>
</reqinfo>


注意为了让节点保持简洁,要对最外层节点加上别名 xx.alias("reqinfo", TongChengWangMessage.class);不加就会出现节点<reqinfo>
变成<com.cpic.ryx.bean.commpay.TongChengWangMessage>

2.响应返回的XML文件流,转化成JavaBean

通过上面的图片看到响应的XML文件格式,因此需要定义相应的实体类:

public class XmlResponseBeanToTongCheng {
	private String st;
	private TongchengInsuranceList insuranceList;
	
}
public class TongchengInsuranceList {
	private String Count; 
	private String TotalPremium;
	private ArrayList<TongChengInsurance> Details;
}
public class TongChengInsurance {
 private String tcSerialNo; 
 private String updated; 
 private String applicantName; 
 private String policyNum; 
 private String status; 
 private String planCode; 
 private String premium; 
    public TongChengInsurance(){
     super();
    }
.....
}

注意:对应循环出现的节点一般放到List中处理!

得到响应的返回结果后,需要用XStream的fromXML()方法解析得到JavaBean.

XStream xxq = new XStream();
//接受返回			
java.io.InputStream in = httpurlconnection.getInputStream();
//要加下面的,否则会报错 com.thoughtworks.xstream.mapper.CannotResolveClassException: rlt : rlt
//涉及自定义类的情况都需要alias
xxq.alias("rlt", XmlResponseBeanToTongCheng.class);
xxq.alias("Insurance", TongChengInsurance.class);
Reader reader=new BufferedReader(new InputStreamReader(in));
XmlResponseBeanToTongCheng message2=(XmlResponseBeanToTongCheng) xxq.fromXML(reader);
in.close();
reader.close();
System.out.println("返回结果:\n"+xxq.toXML(message2));

 得到的结果如下:

返回结果:
<rlt>
  <st>1</st>
  <insuranceList>
    <Count>25</Count>
    <TotalPremium>5041.0</TotalPremium>
    <Details>
      <Insurance>
        <tcSerialNo>流水号1</tcSerialNo>
        <updated>20130529</updated>
        <applicantName>姓名1</applicantName>
        <policyNum>190471316349818</policyNum>
        <status>10</status>
        <planCode>EA360114</planCode>
        <premium>53.0</premium>
      </Insurance>
      <Insurance>
        <tcSerialNo>流水号2</tcSerialNo>
        <updated>20130529</updated>
        <applicantName>姓名2</applicantName>
        <policyNum>190471316349830</policyNum>
        <status>10</status>
        <planCode>EA361101</planCode>
        <premium>612.0</premium>
      </Insurance>

    </Details>
  </insuranceList>
</rlt>

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值