`
kjkhi
  • 浏览: 184807 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

XML 
阅读更多
在前面已经介绍使用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);

现在基本上就已经满足要求了,但是效率不高。
0
0
分享到:
评论

相关推荐

    xstream序列化与反序列化

    xstream中xml与javaBean的互转

    使用xstream实现对JavaBean与xml字符串的互转

    从XML字符串反序列化回JavaBean同样简单,使用`fromXML()`方法即可: ```java User deserializedUser = (User) xstream.fromXML(xml); ``` **自定义转换规则** 默认情况下,XStream会根据JavaBean的字段名生成XML...

    XStream在JavaBean与XML/JSON 之间相互转换

    XStream是一个开源库,它为Java对象提供了简单且直观的XML序列化和反序列化的解决方案。它不仅能够将Java对象转换成XML,反之亦然,还能支持JSON格式的转换。这个强大的工具在处理数据交换、持久化或配置文件时非常...

    xstream-1.3.1.jar javabean与xml之间的转化

    XStream 是一个强大的 Java 库,它允许程序员以一种简单直观的方式将 Java 对象序列化为 XML,同时也可以从 XML 文档反序列化回 Java 对象。在标题和描述中提到的 "xstream-1.3.1.jar" 是 XStream 的一个版本,这个 ...

    xstream 让javabean和xml互相转换

    在Java开发中,数据的序列化与反序列化是一个常见的需求,特别是在持久化存储、网络传输等场景。XStream是一个强大的库,它使得Java对象能够轻易地被转换为XML,反之亦然。这篇博客“xstream 让javabean和xml互相...

    Xstream操作Xml与Json(李志伟)WORD版最新版本

    Xstream是一种OXMapping 技术,是用来处理XML文件序列化的框架,在将JavaBean序列化,或将XML文件反序列化的时候,不需要其它辅助类和映射文件,使得XML序列化不再繁索。Xstream也可以将JavaBean序列化成Json或反序列...

    Xstream操作Xml与Json.doc

    Xstream 是一个 Java 库,用于处理 XML 文件的序列化和反序列化,同时也支持将 JavaBean 转换为 JSON 格式。它的核心理念是通过简单的 API 设计,使得 XML 序列化过程变得简洁,无需额外的映射文件或辅助类。 ### 1...

    javaBean生成xml

    5. XML反序列化回JavaBean:如果需要从XML恢复JavaBean,可以使用`fromXML()`方法。 ```java Person deserializedPerson = (Person) xstream.fromXML(xml); ``` 这将创建一个新的`Person`对象,其属性与原始对象相同...

    xml与javabean之间的相互转换,很方便,导入即可使用

    // 序列化JavaBean为XML String xml = xstream.toXML(user); System.out.println(xml); // 反序列化XML为JavaBean User deserializedUser = (User) xstream.fromXML(xml); System.out.println("Name: " + ...

    XML操作类库XStream.zip

    Xstream是一种OXMapping 技术,是用来处理XML文件序列化的框架,在将javaBean序列化,或将XML文件反序列化的时候,不需要其它辅助类和映射文件,使得XML序列化不再繁琐。XStream使用起来非常简单,不需要预先生成相关...

    Xstream使用说明

    与传统的XML序列化方式相比,Xstream的优势在于它无需编写额外的辅助类或映射文件,简化了XML序列化的流程。 #### 二、Xstream基本使用 Xstream的使用非常简单直观,下面通过一个简单的示例来展示如何使用Xstream...

    将对象(java bean)转换为xml字符串

    XStream不仅能够将Java对象转换为XML,还可以反向将XML转换回Java对象,极大地简化了对象与XML之间的序列化和反序列化过程。 XStream库是由Johannes Lehtinen创建的一个开源项目,它是基于Java的,可以处理复杂的...

    xstream实现实体类序列化转xml

    xstream-1.4.2.jar,xpp3_min-1.1.4.jar,xmlpull-1.1.3.1.jar 包括 //XML --&gt; JavaBean, //XML --&gt; JavaBean //JavaBean --&gt; JSON,//JSON--&gt; JavaBean

    XStream所需jar包

    Xstream是一种OXMapping 技术,是用来处理XML文件序列化的框架,在将JavaBean序列化,或将XML文件反序列化的时候,不需要其它辅助类和映射文件,使得XML序列化不再繁索。Xstream也可以将JavaBean序列化成Json或反序列...

    xstream-1.3.1.jar.zip

    XStream由Johannes Brodbeck开发,它的设计目标是提供一个易于使用且高效的XML序列化框架。它通过简单的API,使得XML和Java对象之间可以进行透明的转换。XStream不仅支持基本数据类型,还能够处理复杂的对象结构,...

    xStream解析工具包

    Xstream是一种OXMapping 技术,是用来处理XML文件序列化的框架,在将JavaBean序列化,或将XML文件反序列化的时候,不需要其它辅助类和映射文件,使得XML序列化不再繁索。Xstream也可以将JavaBean序列化成Json或反序列...

    XStream_1.3.chm 带 实例

    XStream是一款强大的Java库,主要用于XML序列化和反序列化,它使得XML数据与Java对象之间的转换变得简单直观。在“XStream_1.3.chm”这个压缩包中,包含了一个详细的帮助文档(通常CHM是Microsoft的HTML Help格式,...

    Xstream使用介绍WORD版最新版本

    Xstream是一种OXMapping 技术,是用来处理XML文件序列化的框架,在将JavaBean序列化,或将XML文件反序列化的时候,不需要其它辅助类和映射文件,使得XML序列化不再繁索。Xstream也可以将JavaBean序列化成Json或反序列...

    Xml与javaBean互转.zip

    通过JAXB,你可以很容易地将JavaBean对象转换为XML,并将XML反序列化回JavaBean。使用JAXB,你需要定义一个XML绑定(@XmlRootElement和@XmlAccessorType等注解)来指定JavaBean的字段如何映射到XML元素。 2. **DOM...

    xstream.rar

    XStream,作为一个强大的Java库,主要用于对象到XML以及XML到对象的序列化和反序列化。标题中的"xstream.rar"是一个压缩包,包含了XStream的核心组件——xstream-1.4.8.jar,以及其依赖的jar包,如xpp3-1.1.4c和...

Global site tag (gtag.js) - Google Analytics