Castor 技术指南.docx_第1页
Castor 技术指南.docx_第2页
Castor 技术指南.docx_第3页
Castor 技术指南.docx_第4页
Castor 技术指南.docx_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Castor 技术指南Castor可以完成Java和XML的相互转换前面有介绍过json-lib这个框架,在线博文:/hoojo/archive/2011/04/21/2023805.html以及Jackson这个框架,在线博文:/hoojo/archive/2011/04/22/2024628.html它们都可以完成Java对象到XML的转换,但是还不是那么的完善。还有XStream对JSON及XML的支持,它可以对JSON或XML的完美转换。在线博文:/hoojo/archive/2011/04/22/2025197.html这里将介绍Castor来完成Java对象到xml的相互转换。它是怎么样转换的?和前面不同的是castor可以用一个mapping.xml文件来描述转换后的Java对象的xml基本形态,类似于xStream的annotation,这点还是非常不错的。下面我们就来看看Castor是怎么样完成Java对象到XML之间的相互转换吧。一、 准备工作1、 官方资源本示例会运用到如下依赖包(jar包):资源及jar包下载:/download.htmljunit jar下载地址:/KentBeck/junit/downloads关于官方提供的mapping配置相关示例、文档:/xml-mapping.htmlibm提供的castor方面的文档资料:.hk/search?hl=zh-CN&newwindow=1&safe=strict&client=aff-cs-360se&hs=Gon&biw=1349&bih=603&q=castor+site%3A%2Fdeveloperworks%2Fcn%2Fxml%2F&aq=f&aqi=&aql=&oq=2、 程序测试运行代码package com.hoo.test;import java.io.IOException;import java.io.StringReader;import java.io.StringWriter;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import org.exolab.castor.mapping.Mapping;import org.exolab.castor.mapping.MappingException;import org.exolab.castor.xml.MarshalException;import org.exolab.castor.xml.Marshaller;import org.exolab.castor.xml.Unmarshaller;import org.exolab.castor.xml.ValidationException;import org.junit.After;import org.junit.Before;import org.junit.Test;import com.hoo.entity.Account;import com.hoo.entity.AccountArray;import com.hoo.entity.Birthday;import com.hoo.entity.ListBean;import com.hoo.entity.MapBean;/* * function:Castor完成Java对象到XML的相互转换 * 依赖jar: castor-1.3.jar * castor-1.3-core.jar * junit-4.8.2.jar * log4j-1.2.16.jar * commons-logging.jar * author hoojo * createDate 2011-4-21 下午07:57:26 * file CastorTest.java * package com.hoo.test * project WebHttpUtils * blog /IBM_hoojo * email hoojo_126.com * version 1.0 */public class CastorTest private Account bean = null;private Mapping mapping = new Mapping();private StringWriter writer = null;private StringReader reader = null;Beforepublic void init() bean = new Account();bean.setAddress(北京);bean.setEmail(email);bean.setId(1);bean.setName(jack);Birthday day = new Birthday();day.setBirthday(2010-11-22);bean.setBirthday(day);try /* * 加载mapping.xml,此文件是对需要转换的Java对象的配置描述, * 即:转换后的Java对象的xml内容的转换规则 */mapping.loadMapping(System.getProperty(user.dir) + srcmapping.xml); catch (IOException e) e.printStackTrace(); catch (MappingException e) e.printStackTrace();Afterpublic void destory() bean = null;mapping = null;try if (writer != null) writer.flush();writer.close();if (reader != null) reader.close(); catch (IOException e) e.printStackTrace();System.gc();public void fail(Object o) System.out.println(o);public void failRed(Object o) System.err.println(o);Mapping对象可以完成Java对象到XML的编组和解组,它需要先设定一个mapping.xml,通过xml对JavaObject的描述。来完成JavaObject的编组、解组工作。3、 看看即将被转换的JavaEntity代码Accountpackage com.hoo.entity;public class Account private int id;private String name;private String email;private String address;private Birthday birthday;/setter、getterOverridepublic String toString() return this.id + # + + # + this.email + # + this.address + # + this.birthday;Birthdaypackage com.hoo.entity;public class Birthday private String birthday;public Birthday(String birthday) super();this.birthday = birthday; /getter、setterpublic Birthday() Overridepublic String toString() return this.birthday;AccountArraypackage com.hoo.entity;public class AccountArray private Account accounts;private int size;public int getSize() size = accounts.length;return size;public void setSize(int size) this.size = size;public Account getAccounts() return accounts;public void setAccounts(Account accounts) this.accounts = accounts;ListBeanpackage com.hoo.entity;import java.util.List;public class ListBean private String name;private List list;/setter、getterMapBeanpackage com.hoo.entity;import java.util.Map;public class MapBean private Map map;public Map getMap() return map;public void setMap(Map map) this.map = map;二、 编组JavaObject到XML1、 将JavaBean编组,转换成XML/* * function:将Javabean编组,转换成XML * author hoojo * createDate 2011-4-22 下午12:08:48 */Testpublic void writeBean2XML() writer = new StringWriter();try /编组Marshaller.marshal(bean, writer);fail(writer); catch (MarshalException e) e.printStackTrace(); catch (Exception e) e.printStackTrace();代码很简单,通过Marshaller的marshal方法来完成Java对象到XML的编组(序列化、转换)工作。运行后的结果如下:北京emailjack2010-11-222、 将List集合转换成XML/* * function:将List转换成xml * author hoojo * createDate 2011-4-22 下午12:11:00 */Testpublic void writeList2XML() writer = new StringWriter();List list = new ArrayList();list.add(bean);bean = new Account();bean.setName(tom);bean.setId(223);list.add(bean);try Marshaller.marshal(list, writer);fail(writer); catch (MarshalException e) e.printStackTrace(); catch (Exception e) e.printStackTrace();运行后,结果如下:北京emailjack2010-11-22tom怎么样,List存放的是2个Account吧。3、 将Array数组转换成XML/* * function:将Array数组转换成XML * author hoojo * createDate 2011-4-22 下午12:11:25 */Testpublic void writeArray2XML() writer = new StringWriter();Account acc = new Account2;acc0 = bean;bean = new Account();bean.setName(tom);bean.setId(223);acc1 = bean;try Marshaller.marshal(acc, writer);fail(writer); catch (MarshalException e) e.printStackTrace(); catch (Exception e) e.printStackTrace();结果如下:北京emailjack2010-11-22tom4、 转换其他Java类型/* * function:将Java常用类型编组成xml * author hoojo * createDate 2011-4-22 下午12:11:44 */Testpublic void writeObject2XML() writer = new StringWriter();try Marshaller.marshal(true, writer);Marshaller.marshal(9527, writer);Marshaller.marshal(2.2f, writer);Marshaller.marshal(1.11d, writer);Marshaller.marshal(lucy, writer);Marshaller.marshal(hello castor.getBytes(), writer);Marshaller.marshal(new char a, b, c , writer);Marshaller.marshal(new String hi, spring, castor , writer);fail(writer); catch (MarshalException e) e.printStackTrace(); catch (Exception e) e.printStackTrace();结果如下:true95272.21.11lucyaGVsbG8gY2FzdG9yabchispringcastor都是类型为节点名称,值为text。但是这里并没有出现Map,如果转换Map需要mapping进行配置。下面再慢慢道来-.-5、 将xml解组成JavaBean/* * function:将XML内容,解组成JavaBean * author hoojo * createDate 2011-4-22 下午12:12:14 */Testpublic void readXML2Bean() String xml = +北京 +jackemail +2010-11-22;reader = new StringReader(xml);try /解组Account account = (Account) Unmarshaller.unmarshal(Account.class, reader);fail(account); catch (MarshalException e) e.printStackTrace(); catch (ValidationException e) e.printStackTrace();结果如下:1#jack#email#北京#2010-11-22其他的类型,如:map、list、array都不能成功解组。因为这些类型里面有很多系统默认的xml描述。但是利用mapping和自定义JavaBean就可以成功编组和解组了。下面看看mapping是怎么玩转这些类型的。三、 利用mapping配置,编组JavaObject、解组XML最开始的init方法就提供了mapping,让我们对mapping这个配置有了大概的了解。下面我们将详细介绍mapping是个什么:1、 在此之前我们设置过mapping.xml。如果不设置,肯定是不能转换成我们想要的XML的。那么,mapping.xml配置文件是怎么配置Account这个对象的呢?mapping.xml配置如下: 首先,看看这个xml文档的根元素是mapping,在mapping中可以配置class。也就是我们要转换的JavaObject的配置描述了。class元素的name属性就是配置的JavaObject的classpath路径了。关于class元素的auto-complate属性,如果这个属性的值为ture。那么编组后的xml,castor会自动给没有在mapping配置文件进行配置的属性自动编组(转换)到xml中。如果为false,那么在mapping配置文件中出现的属性将在编组后不现在在编组后的xml中。map-to就是当前class编组后的xml文档的节点元素名称。field就是描述JavaObject中的属性,name是Java对象的属性名称,type是类型。关于配置的type类型也有规定,你可以参考:/xml-mapping.html的field配置讲解。而field还有其他的属性配置,如get-method应该是getter方法、set-method应该是setter的方法、has-mehtod应该是hashCode方法,有时候我们不一定要提高getter、setter方法,我们需要用自己的方法名称来代替setter、getter。如果当前field配置的是集合类型,那么你需要给field元素配置collection属性。bind-xml就是绑定(编组)成xml后的xml内容的描述,name就是编组后xml的节点元素名称,node有2个值,分别是attribute、element。attribute是属性,它会在节点元素的属性中显示,例如:而element则是单独的一个元素,例如:2就这个样子的。mapping.xml还可以有其他标签,如:导入外部xml文件,可以分多个配置。好了,先将这么多的mapping方面的内容。我们还是看看实际运行的示例吧,代码如下:/* * function:将XML内容解组成Java对象 * author hoojo * createDate 2011-4-22 下午12:13:28 */Testpublic void bean4Mapping2XML() writer = new StringWriter();try /编组Marshaller mar = new Marshaller(writer);mar.setMapping(mapping);mar.marshal(bean);fail(writer);/解组reader = new StringReader(writer.toString();Unmarshaller unmar = new Unmarshaller(Account.class);unmar.setMapping(mapping);Account account = (Account) unmar.unmarshal(reader);fail(account); catch (MarshalException e) e.printStackTrace(); catch (Exception e) e.printStackTrace();运行后结果如下:jackemail北京1#jack#email#北京#2010-11-22上面的xml的根节点是Account,这个功劳就来源于mapping配置中的map-to元素,而根节点的id属性是有field和bind-xml来完成的。当bind-xml的node值为attribute时,就会以属性的方式显示。当node为element时,就会像后面name、email一样,以元素名称显示。再看看上面的mapping文件中的Account的配置,有个auto-complate属性,如果把这个属性的值设置成false,会怎么样?那我们赶紧试试。没有发现上面异样,但是当我们删除下面配置的filed的时候,就发现有变化了。结果如下:jackemail北京0#jack#email#北京#2010-11-22发现id没有显示在xml中,那么我们再将auto-complate的属性设置true,会有什么惊喜?结果如下:jackemail北京1#jack#email#北京#2010-11-22发现id又回来了,但是Account的配置中并没有配置id的field。这是为什么,其实auto-comlate在上面已经讲过了。Castor在编组时会自动将int类型的属性,显示在父元素的属性中。并且JavaObject中有的属性没有在mapping配置文件中配置,castor也会自动将其编组在xml中。下面我们看看map-to配置的用法,map-to的主要属性是name,也就是我们把当前根元素重命名的名称。Map-to还有2个属性可以用,分别是ns-uri、ns-prefix。看名称就知道它大概的意识,一个是命名空间的uri另一个则是命名空间的前缀。我们给上面mapping加上这两个属性看看。结果如下:jackemail北京1#jack#email#北京#2010-11-22发现了什么?节点元素都带上了ns-prefix的值,而根元素则有了xml的ns。2、 将一段XML格式字符串转换成JavaBeanTestpublic void readBean4Mapping2XML() String xml = +jackemail北京;try reader = new StringReader(xml);Unmarshaller unmar = new Unmarshaller(Account.class);unmar.setMapping(mapping);Account account = (Account) unmar.unmarshal(reader);fail(account); catch (MarshalException e) e.printStackTrace(); catch (Exception e) e.printStackTrace();运行后结果如下:2241#jack#email#北京#2010-11-223、 将XML内容解组成Java的Array/* * function:将XML内容解组成Java的Array * author hoojo * createDate 2011-4-22 下午12:14:50 */Testpublic void array4Mapping2XML() writer = new StringWriter();Account acc = new Account2;acc0 = bean;bean = new Account();bean.setName(tom);bean.setId(223);acc1 = bean;AccountArray array = new AccountArray();array.setAccounts(acc);try Marshaller mar = new Marshaller(writer);mar.setMapping(mapping);mar.marshal(array);fail(writer);reader = new StringReader(writer.toString();Unmarshaller unmar = new Unmarshaller(AccountArray.class);unmar.setMapping(mapping);array = (AccountArray) unmar.unmarshal(reader);fail(array.getSize();fail(array.getAccounts()0);fail(array.getAccounts()1); catch (MarshalException e) e.printStackTrace(); catch (Exception e) e.printStackTrace();AccountArray的mapping配置如下: collection表示是数组,auto-maming有2中值,一种是类driverByClass,另一种则是driverByField是属性。运行后,结果如下:2jackemail北京tom21#jack#email#北京#2010-11-22223#tom#null#null#null4、 将Map编组、解组成JavaObject/* * function:xml转换成Java的Map * author hoojo * createDate 2011-4-22 下午12:15:18 */Testpublic void map4Mapping2XML() writer = new StringWriter();MapBean mapBean = new MapBean();Map map = new HashMap();map.put(No1, bean);bean = new Account();bean.setName(tom);bean.setId(223);map.put(No2, bean);mapBean.setMap(map);try Marshaller mar = new Marshaller(writer);mar.setMapping(mapping);mar.marshal(mapBean);fail(writer);reader = new StringReader(writer.toString();Unmarshaller unmar = new Unmarshaller(MapBean.class);unmar.setMapping(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论