2、 将List集合转换成XML
* <b>function:</b>将List转换成xml
- * @createDate 2011-4-22 下午12:11:00
- void writeList2XML() {
- List<Account> list = new ArrayList<Account>();
- list.add(bean);
- bean = bean.setName("tom");
- bean.setId(223);
- Marshaller.marshal(list,monospace; direction:ltr; font-size:10pt; overflow:visible; background-color:white"> fail(writer);
- } e.printStackTrace();
- 运行后,结果如下:
<array-list>
- <account xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:java="http://java.sun.com" id="1" xsi:type="java:com.hoo.entity.Account">
- <address>北京</address><email>email</email><name>jack</name><birthday><birthday>2010-11-22</birthday></birthday></account>
- "223" xsi:type=<name>tom</name>
- </account>
- </array-list>
怎么样,List存放的是2个Account吧。
3、 将Array数组转换成XML
* <b>function:</b>将Array数组转换成XML
- * @createDate 2011-4-22 下午12:11:25
- void writeArray2XML() {
- Account[] acc = new Account[2];
- acc[0] = bean;
- acc[1] = bean;
- Marshaller.marshal(acc,sans-serif; font-size:13.3333339691162px"> 结果如下:
<array><account id=<birthday><birthday>2010-11-22</birthday></birthday></account>
- "223"><name>tom</name></account></array>
4、 转换其他Java类型
* <b>function:</b>将Java常用类型编组成xml
- * @createDate 2011-4-22 下午12:11:44
- void writeObject2XML() {
- Marshaller.marshal(true,monospace; direction:ltr; font-size:10pt; overflow:visible; background-color:white"> Marshaller.marshal(9527,244)"> Marshaller.marshal(2.2f,monospace; direction:ltr; font-size:10pt; overflow:visible; background-color:white"> Marshaller.marshal(1.11d,244)"> Marshaller.marshal("lucy",monospace; direction:ltr; font-size:10pt; overflow:visible; background-color:white"> Marshaller.marshal("hello castor".getBytes(),255)">new char[] { 'a','b',128)">'c' },255)">new String[] { "hi",128)">"spring",128)">"castor" },244)"><boolean>true</boolean><?xml version=<integer>9527</integer><?xml version=float>2.2</float><?xml version=<double>1.11</double><?xml version=<string>lucy</string><?xml version=<[-b>aGVsbG8gY2FzdG9y</[-b><?xml version=<array><character>a</character><character>b</character><character>c</character></array><?xml version=<array><string>hi</string><string>spring</string><string>castor</string></array>
都是类型为节点名称,值为text。但是这里并没有出现Map,如果转换Map需要mapping进行配置。下面再慢慢道来-.-
5、 将xml解组成JavaBean
* <b>function:</b>将XML
内容,解组成JavaBean
- * @createDate 2011-4-22 下午12:12:14
- void readXML2Bean() {
- String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
- "<account id=\"1\"><address>北京</address>" +
- "<name>jack</name><email>email</email>" +
- "<birthday><birthday>2010-11-22</birthday></birthday></account>";
- reader = new StringReader(xml);
- //解组
- Account account = (Account) Unmarshaller.unmarshal(Account.class,reader);
- fail(account);
- catch (ValidationException e) {
- 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 version="1.0" encoding="UTF-8"?
>
- <!DOCTYPE mapping PUBLIC "-//EXOLAB/Castor Mapping DTD Version 1.0//EN" "http://castor.org/mapping.dtd"<mappingclass name="com.hoo.entity.Account" auto-complete="true">
- map-to xml="Account"/>
- field ="id" type="integer"bind-xml node="attribute" </field="name" ="string"="element" ="email" ="address" ="birthday" ="com.hoo.entity.Birthday"="生日" class
- ="birthday" >
首先,看看这个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类型也有规定,你可以参考:http://www.castor.org/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是属性,它会在节点元素的属性中显示,例如:<account id=”2”></account>
而element则是单独的一个元素,例如:<account><id>2</id></account>
就这个样子的。
mapping.xml还可以有其他标签,如:
<include href="other_mapping_file.xml"/>
导入外部xml文件,可以分多个配置。
好了,先将这么多的mapping方面的内容。我们还是看看实际运行的示例吧,代码如下:
* <b>function:</b>将XML
内容解组成Java对象
- * @createDate 2011-4-22 下午12:13:28
- void bean4Mapping2XML() {
- Marshaller mar = new Marshaller(writer);
- mar.setMapping(mapping);
- mar.marshal(bean);
-
- reader = new StringReader(writer.toString());
- Unmarshaller unmar = new Unmarshaller(Account.class);
- unmar.setMapping(mapping);
- Account account = (Account) unmar.unmarshal(reader);
- 运行后结果如下:
<Account id="1"><name>jack</name><email>email</email><address>北京</address><生日 birthday="2010-11-22"/></Account>
- 上面的xml的根节点是Account,这个功劳就来源于mapping配置中的map-to元素,而根节点的id属性是有field和bind-xml来完成的。当bind-xml的node值为attribute时,就会以属性的方式显示。当node为element时,就会像后面name、email一样,以元素名称显示。
再看看上面的mapping文件中的Account的配置,有个auto-complate属性,如果把这个属性的值设置成false,会怎么样?那我们赶紧试试。
没有发现上面异样,但是当我们删除下面配置的filed的时候,就发现有变化了。
<Account><name>jack</name><email>email</email><address>北京</address><生日 birthday=0#jack#email#北京#2010-11-22
发现id没有显示在xml中,那么我们再将auto-complate的属性设置true,会有什么惊喜?
发现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加上这两个属性看看。
<map-to xml="Account" ns-uri="http://hoojo.cnblogs.com" ns-prefix="castor"/>
<castor:Account xmlns:castor="http://hoojo.cnblogs.com" id="1"><castor:name>jack</castor:name><castor:email>email</castor:email>
- <castor:address>北京</castor:address><castor:生日 birthday="2010-11-22"/></castor:Account>
- 1#jack#email#北京#2010-11-22
发现了什么?节点元素都带上了ns-prefix的值,而根元素则有了xml的ns。
2、 将一段XML格式字符串转换成JavaBean
@Test
- void readBean4Mapping2XML() {
- "<Account id=\"2241\"><name>jack</name><email>email</email><address>北京</address><生日 birthday=\"2010-11-22\"/></Account>";
- reader = Unmarshaller unmar = unmar.setMapping(mapping);
- Account account = (Account) unmar.unmarshal(reader);
- fail(account);
- 2241#jack#email#北京#2010-11-22
3、 将XML内容解组成Java的Array
* <b>function:</b>将XML
内容解组成Java的Array
- * @createDate 2011-4-22 下午12:14:50
- void array4Mapping2XML() {
- AccountArray array = new AccountArray();
- array.setAccounts(acc);
- Marshaller mar = mar.setMapping(mapping);
- mar.marshal(array);
- new Unmarshaller(AccountArray. array = (AccountArray) unmar.unmarshal(reader);
- fail(array.getSize());
- fail(array.getAccounts()[0]);
- fail(array.getAccounts()[1]);
- AccountArray的mapping配置如下:
="com.hoo.entity.AccountArray"="account-array"="size" ="int" ="accounts" collection="array" ="com.hoo.entity.Account"auto-naming="deriveByClass" collection表示是数组,auto-maming有2中值,一种是类driverByClass,另一种则是driverByField是属性。 <account-array><size>2</size><Account id="1"><name>jack</name><email>email</email><address>北京</address>
- <生日 birthday="2010-11-22"/></Account><Account id="223"><name>tom</name></Account></account-array>
- 2
- 1#jack#email#北京#2010-11-22
- 223#tom#null#null#null
4、 将Map编组、解组成JavaObject
* <b>function:</b>xml转换成Java的Map
- * @createDate 2011-4-22 下午12:15:18
- void map4Mapping2XML() {
- MapBean mapBean = new MapBean();
- Map<String,Object> map = new HashMap<String,Object>();
- map.put("No1",bean);
- bean = bean.setName( bean.setId(223);
- "No2",244)"> mapBean.setMap(map);
- mar.marshal(mapBean);
- new Unmarshaller(MapBean. mapBean = (MapBean) unmar.unmarshal(reader);
- fail(mapBean.getMap());
- Mapping配置
="com.hoo.entity.MapBean"="map" ="map"="org.exolab.castor.mapping.MapItem" ="key" ="java.lang.String"="value" bind-xml 上面的map配置必须这样配置,利用org.exolab.castor.mapping.MapItem这个class,完成key、value的配置。 <map-bean><map key="No2"><Account id="223"><name>tom</name></Account></map>
- <map key="No1"><Account id=<生日 birthday="2010-11-22"/></Account></map></map-bean>
- {No2=223#tom#null#null#null,No1=1#jack#email#北京#2010-11-22}
5、 JavaList编组、解组XML
* <b>function:</b>List到XML的相互转换
- * @createDate 2011-4-22 下午12:16:04
- @SuppressWarnings("unchecked")
- void listForMapping2XML() {
- writer = list.add(bean);
- ListBean listBean = new ListBean();
- listBean.setList(list);
- mar.marshal(listBean);
- new Unmarshaller(ListBean. listBean = (ListBean) unmar.unmarshal(reader);
- fail(listBean.getList().size());
- for (Account acc : (List<Account>)listBean.getList()) {
- fail(acc);
- ="com.hoo.entity.ListBean"="listBean"="list" ="arraylist" ="beans" 结果:
<listBean><Account id="223"><name>tom</name></Account></listBean>
- 223#tom#null#null#null