使用xStream对xml进行反序列化转为JavaBean

在前面已经介绍使用xStream包处理null值的问题,现在我们一起讨论一下对于使用xStream进行反序列化的问题。
这里我们使用的xml模板为:
<ShippingOrder xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/DataExchange.Utility.BussinessObject">
  <totalCharge>679.08</totalCharge>
  <totalCount>567</totalCount>
  <totalWeight>851.21</totalWeight>
  <agencyPrice>agencyPrice2O305</agencyPrice>
  <billId>billId408KI</billId>
  <billingPersonName>billingPersonName2O305</billingPersonName>
  <branchName>branchName408KI</branchName>
  <chargeType>chargeType408KI</chargeType>
  <acceptTime>2011-03-07 09:18:43.0</acceptTime>
  <checkTime>2011-03-07 09:18:43.0</checkTime>
  <consigneeCardNO>consigneeCardNO2O305</consigneeCardNO>
  <consigneeInfomation>
    <addressTel>addressTel2O305</addressTel>
    <consigneeCode>consigneeCode2O305</consigneeCode>
    <consigneeUserID>consigneeUserID2O305</consigneeUserID>
    <consignmentStatus>consignmentStatus2O305</consignmentStatus>
    <gatheringAmount>gatheringAmount2O305</gatheringAmount>
    <gatheringType>gatheringType2O305</gatheringType>
    <goodsReceiptPlace>goodsReceiptPlace2O305</goodsReceiptPlace>
    <isReturn>false</isReturn>
    <linkManName>linkManName2O305</linkManName>
    <originalEnterprise>originalEnterprise2O305</originalEnterprise>
    <originalNumber>originalNumber2O305</originalNumber>
    <remark>remark2O305</remark>
    <requestedUnloadedDateTime>2011-03-07 09:18:43.0</requestedUnloadedDateTime>
    <telephoneNumber>telephoneNumber2O305</telephoneNumber>
  </consigneeInfomation>
  <consigneeName>consigneeName2O305</consigneeName>
  <consigneeSignName>consigneeSignName2O305</consigneeSignName>
  <consignorInfomation>
    <addressTel>addressTel2O305</addressTel>
    <consignorCode>consignorCode2O305</consignorCode>
    <linkManName>linkManName2O305</linkManName>
    <loadingPlace>loadingPlace2O305</loadingPlace>
    <telephoneNumber>telephoneNumber2O305</telephoneNumber>
  </consignorInfomation>
  <consignorName>consignorName2O305</consignorName>
  <endStationName>endStationName408KI</endStationName>
  <goodsInfomations>
    <GoodsInfomation>
      <chargeType>中文测试</chargeType>
      <excursionFreight>344.7</excursionFreight>
      <freight>911.83</freight>
      <goodsBar>goodsBar2O305</goodsBar>
      <goodsBatchNumber>goodsBatchNumber2O305</goodsBatchNumber>
      <goodsGuid>fd604f4f-163b-4290-93c3-a2256d4f8fe8</goodsGuid>
      <goodsName>goodsName2O305</goodsName>
      <goodsSpecification>goodsSpecification2O305</goodsSpecification>
      <goodsType>goodsType2O305</goodsType>
      <goodsTypeCode>goodsTypeCode2O305</goodsTypeCode>
      <grossWeightUnitCode>647.59</grossWeightUnitCode>
      <grossWeightValue>882.45</grossWeightValue>
      <insurancePrice>insurancePrice2O305</insurancePrice>
      <isInsurance>isInsurance2O305</isInsurance>
      <packageType>packageType2O305</packageType>
      <packageTypeCode>packageTypeCode2O305</packageTypeCode>
      <packagesNumber>576</packagesNumber>
      <remart>remart2O305</remart>
      <volumeUnitCode>volumeUnitCode2O305</volumeUnitCode>
      <volumeValue>383.46</volumeValue>
    </GoodsInfomation>
    <GoodsInfomation>
      <chargeType>chargeType2O305</chargeType>
      <excursionFreight>769.38</excursionFreight>
      <freight>928.05</freight>
      <goodsBar>goodsBar2O305</goodsBar>
      <goodsBatchNumber>goodsBatchNumber2O305</goodsBatchNumber>
      <goodsGuid>b22a30c3-6a8a-435a-a2f9-3c92ef3ccdf9</goodsGuid>
      <goodsName>goodsName2O305</goodsName>
      <goodsSpecification>goodsSpecification2O305</goodsSpecification>
      <goodsType>goodsType2O305</goodsType>
      <goodsTypeCode>goodsTypeCode2O305</goodsTypeCode>
      <grossWeightUnitCode>168.72</grossWeightUnitCode>
      <grossWeightValue>996.43</grossWeightValue>
      <insurancePrice>insurancePrice2O305</insurancePrice>
      <isInsurance>isInsurance2O305</isInsurance>
      <packageType>packageType2O305</packageType>
      <packageTypeCode>packageTypeCode2O305</packageTypeCode>
      <packagesNumber>738</packagesNumber>
      <remart>remart2O305</remart>
      <volumeUnitCode>volumeUnitCode2O305</volumeUnitCode>
      <volumeValue>119.99</volumeValue>
    </GoodsInfomation>
  </goodsInfomations>
  <isInsurance>false</isInsurance>
  <isRouteRecord>1</isRouteRecord>
  <labelId>labelId408KI</labelId>
  <limitTime>2011-03-07 09:18:43.0</limitTime>
  <packageBillId>packageBillId2O305</packageBillId>
  <prepayPrice>prepayPrice2O305</prepayPrice>
  <procedureCharge>procedureCharge2O305</procedureCharge>
  <remark>remark2O305</remark>
  <route>route2O305</route>
  <routePersonName>routePersonName2O305</routePersonName>
  <sendStationName>sendStationName408KI</sendStationName>
  <stationName>stationName408KI</stationName>
  
  <transferName>transferName408KI</transferName>
  <travelTime>2011-03-07 09:18:43.0</travelTime>
</ShippingOrder>

我们需要四个类,分别为SendXML、Consignee、Consignor和Goods,这里我给出SendXML的源码如下:
public class SendXML {

	private String billId;// 托运单号

	private String labelId;// 票签号
	
	private String isRouteRecord;//记录类型,0为线路员记录单,1为托运单

	private String branchName;// 营业网点名称

	private String stationName;// 受理站

	private String sendStationName;// 发送站点

	private String transferName;// 中转站编号

	private String endStationName;// 到达站点

	private String chargeType;// 收费模式
	
	private String procedureCharge;// 手续费

	private String packageBillId;// 打包托运单号

	private String agencyPrice;// 代收货款
	
	private String prepayPrice;// 代垫货款

	private String totalCharge;// 总金额
	
	private String totalCount;// 总数量
	
	private String totalWeight;// 总重量
	
	private String isInsurance;//是否保价

	private Consignee consignee;// 收获方信息

	private Consignor consignor;// 装货方信息
	
	private String consigneeCardNO;// 收获人身份证

	private String consigneeSignName;// 收获人签名

	private Date travelTime;// 运输时间

	private Date acceptTime;// 受理时间

	private Date checkTime;// 签发时间

	private Date limitTime;// 到货时限
	
	private String billingPersonName;//开单人姓名
	
	private String routePersonName;//线路员
	
	private String remark;//备注
	
	private String route;//终点站(使用)
	
	private String consigneeName;//收货人姓名
	
	private String consignorName;//发货人姓名
	
	private List<Goods> goodsInfomations;//货物信息
        
        //setter、getter

之前看了很多其他的介绍没有使用转换器的,但这里我必须需要写转换器实现,否则无法得到结果。
在这里我写了一个类实现Converter接口,如:
        //这个是反序列化是实现的方法
        @Override
	public Object unmarshal(HierarchicalStreamReader reader,
			UnmarshallingContext context) {
		
		SendXML sendXML = new SendXML();
		
		while(reader.hasMoreChildren()){
			reader.moveDown();
			String node = reader.getNodeName();
			if (node.indexOf("Time")!=-1) {
				SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.0");
				Date date = null;
				try {
					date = sdf.parse(reader.getValue());
				} catch (ParseException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				String temp = node.substring(0, 1).toUpperCase()+node.substring(1);
				Class[] classes = new Class[1];
				classes[0] = Date.class;
				try {
					Method m = SendXML.class.getMethod("set"+temp, classes);
					m.invoke(sendXML, date);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}else if ("consigneeInfomation".equals(node)) {
				Consignee cgee = new Consignee();
				while(reader.hasMoreChildren()){
					reader.moveDown();
					String node2 = reader.getNodeName();
					if ("requestedUnloadedDateTime".equals(reader.getNodeName())) {
						SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.0");
						Date date = null;
						try {
							date = sdf.parse(reader.getValue());
						} catch (ParseException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						cgee.setRequestedUnloadedDateTime(date);
					}else {
						String temp = node2.substring(0, 1).toUpperCase()+node2.substring(1);
						try {
							Class[] classes = new Class[1];
							classes[0] = String.class;
							Method method = Consignee.class.getMethod("set"+temp, classes);
							method.invoke(cgee, reader.getValue());
						} catch (Exception e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
					reader.moveUp();
				}
				
				sendXML.setConsignee(cgee);
			}else if("consignorInfomation".equals(node)){
				Consignor cgor = (Consignor)context.convertAnother(sendXML, Consignor.class);
				sendXML.setConsignor(cgor);
			}else if ("goodsInfomations".equals(node)) {
				List<Goods> list = new ArrayList<Goods>();
				while(reader.hasMoreChildren()){
					reader.moveDown();
					Goods goods = (Goods)context.convertAnother(sendXML, Goods.class);
					list.add(goods);
					reader.moveUp();
				}
				sendXML.setGoodsInfomations(list);
			}else {
				String temp = node.substring(0, 1).toUpperCase()+node.substring(1);
				try {
					Class[] classes = new Class[1];
					classes[0] = String.class;
					Method method = SendXML.class.getMethod("set"+temp, classes);
					method.invoke(sendXML, reader.getValue());
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			reader.moveUp();
		}
		return sendXML;
	}

在使用到XStream时,需要注册这个转换器,如:
File xmlModel = new java.io.File(filePath);
		
		FileInputStream in  = new FileInputStream(xmlModel);
		
		XStream xStream = new XStream(new DomDriver());
		xStream.alias("ShippingOrder", SendXML.class);
		
		xStream.registerConverter(new ShippingConverter());
		SendXML sendXML = (SendXML)xStream.fromXML(in);

现在基本上就已经满足要求了,但是效率不高。

你可能感兴趣的:(xml)