日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

使用Castor工具完成Java對(duì)象與XML之間的相互轉(zhuǎn)換

系統(tǒng) 2014 0

這里將介紹Castor來(lái)完成Java對(duì)象到xml的相互轉(zhuǎn)換。它是怎么樣轉(zhuǎn)換的?和前面不同的是castor可以用一個(gè)mapping.xml文件來(lái)描述轉(zhuǎn)換后的Java對(duì)象的xml基本形態(tài),類(lèi)似于xStream的annotation,這點(diǎn)還是非常不錯(cuò)的。下面我們就來(lái)看看Castor是怎么樣完成Java對(duì)象到XML之間的相互轉(zhuǎn)換吧。

一、 準(zhǔn)備工作

1、 官方資源

本示例會(huì)運(yùn)用到如下依賴(lài)包(jar包):

使用Castor工具完成Java對(duì)象與XML之間的相互轉(zhuǎn)換

資源及jar包下載: http://www.castor.org/download.html

junit jar下載地址:

https://github.com/KentBeck/junit/downloads

關(guān)于官方提供的mapping配置相關(guān)示例、文檔:

http://www.castor.org/xml-mapping.html

ibm提供的castor方面的文檔資料:

http://www.google.com.hk/search?hl=zh-CN&newwindow=1&safe=strict&client=aff-cs-360se&hs=Gon&biw=1349&bih=603&q=castor+site%3Awww.ibm.com%2Fdeveloperworks%2Fcn%2Fxml%2F&aq=f&aqi=&aql=&oq=

2、 程序測(cè)試運(yùn)行代碼

    
      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;
 
/**
 * <b>function:</b>Castor完成Java對(duì)象到XML的相互轉(zhuǎn)換
 * 依賴(lài)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 http://blog.csdn.net/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;
    
    @Before
    public 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,此文件是對(duì)需要轉(zhuǎn)換的Java對(duì)象的配置描述,
             * 即:轉(zhuǎn)換后的Java對(duì)象的xml內(nèi)容的轉(zhuǎn)換規(guī)則
             */
            mapping.loadMapping(System.getProperty("user.dir") + "\\src\\mapping.xml");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (MappingException e) {
            e.printStackTrace();
        }
    }
    
    @After
    public 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對(duì)象可以完成Java對(duì)象到XML的編組和解組,它需要先設(shè)定一個(gè)mapping.xml,通過(guò)xml對(duì)JavaObject的描述。來(lái)完成JavaObject的編組、解組工作。

3、 看看即將被轉(zhuǎn)換的JavaEntity代碼

Account

    
      package com.hoo.entity;
 
public class Account {
    private int id;
    private String name;
    private String email;
    private String address;
    private Birthday birthday;
    
    //setter、getter
    @Override
    public String toString() {
        return this.id + "#" + this.name + "#" + this.email + "#" + this.address + "#" + this.birthday;
    }
}
    

Birthday

    package com.hoo.entity;
 
public class Birthday {
    private String birthday;
    
    public Birthday(String birthday) {
        super();
        this.birthday = birthday;
    }
    //getter、setter
    public Birthday() {}
    
    @Override
    public String toString() {
        return this.birthday;
    }
}
  

    package 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;
    }
}
  

  

ListBean

    package com.hoo.entity;
  
  
    import java.util.List;
  
  
    public class ListBean {
  
        private String name;
  
        private List list;
  
        //setter、getter
  
    }
  

MapBean

    package com.hoo.entity;
  
  
    import java.util.Map;
  
  
    public class MapBean {
  
        private Map<String, Object> map;
  
  
        public Map<String, Object> getMap() {
  
            return map;
  
        }
  
        public void setMap(Map<String, Object> map) {
  
            this.map = map;
  
        }
  
    }
  

二、 編組JavaObject到XML

1、 將JavaBean編組,轉(zhuǎn)換成XML

    /**
  
     * <b>function:</b>將Javabean編組,轉(zhuǎn)換成XML
  
     * @author hoojo
  
     * @createDate 2011-4-22 下午12:08:48
  
     */
  
    @Test
  
    public void writeBean2XML() {
  
        writer = new StringWriter();
  
        try {
  
            //編組
  
            Marshaller.marshal(bean, writer);
  
            fail(writer);
  
        } catch (MarshalException e) {
  
            e.printStackTrace();
  
        } catch (Exception e) {
  
            e.printStackTrace();
  
        }
  
    }
  

代碼很簡(jiǎn)單,通過(guò)Marshaller的marshal方法來(lái)完成Java對(duì)象到XML的編組(序列化、轉(zhuǎn)換)工作。

運(yùn)行后的結(jié)果如下:

    <?xml version="1.0" encoding="UTF-8"?>
  
    <account id="1"><address>北京</address><email>email</email><name>jack</name>
  
    <birthday><birthday>2010-11-22</birthday></birthday></account>
  

2、 將List集合轉(zhuǎn)換成XML

    /**
  
     * <b>function:</b>將List轉(zhuǎn)換成xml
  
     * @author hoojo
  
     * @createDate 2011-4-22 下午12:11:00
  
     */
  
    @Test
  
    public void writeList2XML() {
  
        writer = new StringWriter();
  
        List<Account> list = new ArrayList<Account>();
  
        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();
  
        }
  
    }
  

運(yùn)行后,結(jié)果如下:

    <?xml version="1.0" encoding="UTF-8"?>
  
    <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>
  
    <account xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:java="http://java.sun.com" id="223" xsi:type="java:com.hoo.entity.Account">
  
    <name>tom</name>
  
    </account>
  
    </array-list>
  

怎么樣,List存放的是2個(gè)Account吧。

3、 將Array數(shù)組轉(zhuǎn)換成XML

    /**
  
     * <b>function:</b>將Array數(shù)組轉(zhuǎn)換成XML
  
     * @author hoojo
  
     * @createDate 2011-4-22 下午12:11:25
  
     */
  
    @Test
  
    public void writeArray2XML() {
  
        writer = new StringWriter();
  
        Account[] acc = new Account[2];
  
        acc[0] = bean;
  
        bean = new Account();
  
        bean.setName("tom");
  
        bean.setId(223);
  
        acc[1] = bean;
  
  
        try {
  
            Marshaller.marshal(acc, writer);
  
            fail(writer);
  
        } catch (MarshalException e) {
  
            e.printStackTrace();
  
        } catch (Exception e) {
  
            e.printStackTrace();
  
        }
  
    }
  

結(jié)果如下:

    <?xml version="1.0" encoding="UTF-8"?>
  
    <array><account id="1"><address>北京</address><email>email</email><name>jack</name>
  
    <birthday><birthday>2010-11-22</birthday></birthday></account>
  
    <account id="223"><name>tom</name></account></array>
  

4、 轉(zhuǎn)換其他Java類(lèi)型

    /**
  
     * <b>function:</b>將Java常用類(lèi)型編組成xml
  
     * @author hoojo
  
     * @createDate 2011-4-22 下午12:11:44
  
     */
  
    @Test
  
    public 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();
  
        }
  
    }
  

結(jié)果如下:

    <?xml version="1.0" encoding="UTF-8"?>
  
    <boolean>true</boolean><?xml version="1.0" encoding="UTF-8"?>
  
    <integer>9527</integer><?xml version="1.0" encoding="UTF-8"?>
  
    <float>2.2</float><?xml version="1.0" encoding="UTF-8"?>
  
    <double>1.11</double><?xml version="1.0" encoding="UTF-8"?>
  
    <string>lucy</string><?xml version="1.0" encoding="UTF-8"?>
  
    <[-b>aGVsbG8gY2FzdG9y</[-b><?xml version="1.0" encoding="UTF-8"?>
  
    <array><character>a</character><character>b</character><character>c</character></array><?xml version="1.0" encoding="UTF-8"?>
  
    <array><string>hi</string><string>spring</string><string>castor</string></array>
  

都是類(lèi)型為節(jié)點(diǎn)名稱(chēng),值為text。但是這里并沒(méi)有出現(xiàn)Map,如果轉(zhuǎn)換Map需要mapping進(jìn)行配置。下面再慢慢道來(lái)-.-

5、 將xml解組成JavaBean

    /**
  
     * <b>function:</b>將XML內(nèi)容,解組成JavaBean
  
     * @author hoojo
  
     * @createDate 2011-4-22 下午12:12:14
  
     */
  
    @Test
  
    public 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);
  
  
        try {
  
            //解組
  
            Account account = (Account) Unmarshaller.unmarshal(Account.class, reader);
  
            fail(account);
  
        } catch (MarshalException e) {
  
            e.printStackTrace();
  
        } catch (ValidationException e) {
  
            e.printStackTrace();
  
        }
  
    }
  

結(jié)果如下:

    1#jack#email#北京#2010-11-22
  

其他的類(lèi)型,如:map、list、array都不能成功解組。因?yàn)檫@些類(lèi)型里面有很多系統(tǒng)默認(rèn)的xml描述。但是利用mapping和自定義JavaBean就可以成功編組和解組了。下面看看mapping是怎么玩轉(zhuǎn)這些類(lèi)型的。

三、 利用mapping配置,編組JavaObject、解組XML

最開(kāi)始的init方法就提供了mapping,讓我們對(duì)mapping這個(gè)配置有了大概的了解。下面我們將詳細(xì)介紹mapping是個(gè)什么:

1、 在此之前我們?cè)O(shè)置過(guò)mapping.xml。如果不設(shè)置,肯定是不能轉(zhuǎn)換成我們想要的XML的。那么,mapping.xml配置文件是怎么配置Account這個(gè)對(duì)象的呢?

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">
  
    <mapping>
  
        <class name="com.hoo.entity.Account" auto-complete="true">   
  
            <map-to xml="Account"/>
  
  
            <field name="id" type="integer">
  
                <bind-xml name="id" node="attribute" />
  
            </field>
  
  
            <field name="name" type="string">
  
                <bind-xml name="name" node="element" />
  
            </field>
  
  
            <field name="email" type="string">
  
                <bind-xml name="email" node="element" />
  
            </field>
  
  
            <field name="address" type="string">
  
                <bind-xml name="address" node="element" />
  
            </field>
  
  
            <field name="birthday" type="com.hoo.entity.Birthday">
  
                <bind-xml name="生日" node="element" />
  
            </field>
  
        </class>
  
  
        <class name="com.hoo.entity.Birthday">
  
            <map-to xml="birthday" />
  
  
            <field name="birthday" type="string">
  
                <bind-xml name="birthday" node="attribute" />
  
            </field>
  
        </class>
  
    </mapping>
  

首先,看看這個(gè)xml文檔的根元素是mapping,在mapping中可以配置class。也就是我們要轉(zhuǎn)換的JavaObject的配置描述了。

class元素的name屬性就是配置的JavaObject的classpath路徑了。

關(guān)于class元素的auto-complate屬性,如果這個(gè)屬性的值為ture。那么編組后的xml,castor會(huì)自動(dòng)給沒(méi)有在mapping配置文件進(jìn)行配置的屬性自動(dòng)編組(轉(zhuǎn)換)到xml中。如果為false,那么在mapping配置文件中出現(xiàn)的屬性將在編組后不現(xiàn)在在編組后的xml中。

map-to就是當(dāng)前class編組后的xml文檔的節(jié)點(diǎn)元素名稱(chēng)。

field就是描述JavaObject中的屬性,name是Java對(duì)象的屬性名稱(chēng),type是類(lèi)型。關(guān)于配置的type類(lèi)型也有規(guī)定,你可以參考:http://www.castor.org/xml-mapping.html的field配置講解。

而field還有其他的屬性配置,如get-method應(yīng)該是getter方法、set-method應(yīng)該是setter的方法、has-mehtod應(yīng)該是hashCode方法,有時(shí)候我們不一定要提高getter、setter方法,我們需要用自己的方法名稱(chēng)來(lái)代替setter、getter。如果當(dāng)前field配置的是集合類(lèi)型,那么你需要給field元素配置collection屬性。

bind-xml就是綁定(編組)成xml后的xml內(nèi)容的描述,name就是編組后xml的節(jié)點(diǎn)元素名稱(chēng),node有2個(gè)值,分別是attribute、element。attribute是屬性,它會(huì)在節(jié)點(diǎn)元素的屬性中顯示,例如:<account id=”2”></account>

而element則是單獨(dú)的一個(gè)元素,例如:<account><id>2</id></account>

就這個(gè)樣子的。

mapping.xml還可以有其他標(biāo)簽,如:

<include href="other_mapping_file.xml"/>

導(dǎo)入外部xml文件,可以分多個(gè)配置。

好了,先將這么多的mapping方面的內(nèi)容。我們還是看看實(shí)際運(yùn)行的示例吧,代碼如下:

    /**
  
     * <b>function:</b>將XML內(nèi)容解組成Java對(duì)象
  
     * @author hoojo
  
     * @createDate 2011-4-22 下午12:13:28
  
     */
  
    @Test
  
    public 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();
  
        }
  
    }
  

運(yùn)行后結(jié)果如下:

    <?xml version="1.0" encoding="UTF-8"?>
  
    <Account id="1"><name>jack</name><email>email</email><address>北京</address><生日 birthday="2010-11-22"/></Account>
  
    1#jack#email#北京#2010-11-22
  

上面的xml的根節(jié)點(diǎn)是Account,這個(gè)功勞就來(lái)源于mapping配置中的map-to元素,而根節(jié)點(diǎn)的id屬性是有field和bind-xml來(lái)完成的。當(dāng)bind-xml的node值為attribute時(shí),就會(huì)以屬性的方式顯示。當(dāng)node為element時(shí),就會(huì)像后面name、email一樣,以元素名稱(chēng)顯示。

再看看上面的mapping文件中的Account的配置,有個(gè)auto-complate屬性,如果把這個(gè)屬性的值設(shè)置成false,會(huì)怎么樣?那我們趕緊試試。

沒(méi)有發(fā)現(xiàn)上面異樣,但是當(dāng)我們刪除下面配置的filed的時(shí)候,就發(fā)現(xiàn)有變化了。

結(jié)果如下:

    <?xml version="1.0" encoding="UTF-8"?>
  
    <Account><name>jack</name><email>email</email><address>北京</address><生日 birthday="2010-11-22"/></Account>
  
    0#jack#email#北京#2010-11-22
  

發(fā)現(xiàn)id沒(méi)有顯示在xml中,那么我們?cè)賹uto-complate的屬性設(shè)置true,會(huì)有什么驚喜?

結(jié)果如下:

    <?xml version="1.0" encoding="UTF-8"?>
  
    <Account id="1"><name>jack</name><email>email</email><address>北京</address><生日 birthday="2010-11-22"/></Account>
  
    1#jack#email#北京#2010-11-22
  

發(fā)現(xiàn)id又回來(lái)了,但是Account的配置中并沒(méi)有配置id的field。這是為什么,其實(shí)auto-comlate在上面已經(jīng)講過(guò)了。Castor在編組時(shí)會(huì)自動(dòng)將int類(lèi)型的屬性,顯示在父元素的屬性中。并且JavaObject中有的屬性沒(méi)有在mapping配置文件中配置,castor也會(huì)自動(dòng)將其編組在xml中。

下面我們看看map-to配置的用法,map-to的主要屬性是name,也就是我們把當(dāng)前根元素重命名的名稱(chēng)。Map-to還有2個(gè)屬性可以用,分別是ns-uri、ns-prefix??疵Q(chēng)就知道它大概的意識(shí),一個(gè)是命名空間的uri另一個(gè)則是命名空間的前綴。我們給上面mapping加上這兩個(gè)屬性看看。

<map-to xml="Account" ns-uri="http://hoojo.cnblogs.com" ns-prefix="castor"/>

結(jié)果如下:

    <?xml version="1.0" encoding="UTF-8"?>
  
    <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
  

發(fā)現(xiàn)了什么?節(jié)點(diǎn)元素都帶上了ns-prefix的值,而根元素則有了xml的ns。

2、 將一段XML格式字符串轉(zhuǎn)換成JavaBean

    @Test
  
    public void readBean4Mapping2XML() {
  
        String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
  
                    "<Account id=\"2241\"><name>jack</name><email>email</email><address>北京</address><生日 birthday=\"2010-11-22\"/></Account>";
  
        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();
  
        }
  
    }
  

運(yùn)行后結(jié)果如下:

    2241#jack#email#北京#2010-11-22
  

3、 將XML內(nèi)容解組成Java的Array

    /**
  
     * <b>function:</b>將XML內(nèi)容解組成Java的Array
  
     * @author hoojo
  
     * @createDate 2011-4-22 下午12:14:50
  
     */
  
    @Test
  
    public void array4Mapping2XML() {
  
        writer = new StringWriter();
  
        Account[] acc = new Account[2];
  
        acc[0] = bean;
  
        bean = new Account();
  
        bean.setName("tom");
  
        bean.setId(223);
  
        acc[1] = 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配置如下:

    <class name="com.hoo.entity.AccountArray">
  
        <map-to xml="account-array"/>
  
        <field name="size" type="int" />
  
        <field name="accounts" collection="array" type="com.hoo.entity.Account">
  
            <bind-xml name="accounts" auto-naming="deriveByClass"/>
  
        </field>
  
    </class>
  

collection表示是數(shù)組,auto-maming有2中值,一種是類(lèi)driverByClass,另一種則是driverByField是屬性。

運(yùn)行后,結(jié)果如下:

    <?xml version="1.0" encoding="UTF-8"?>
  
    <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轉(zhuǎn)換成Java的Map
  
     * @author hoojo
  
     * @createDate 2011-4-22 下午12:15:18
  
     */
  
    @Test
  
    public void map4Mapping2XML() {
  
        writer = new StringWriter();
  
        MapBean mapBean = new MapBean();
  
        Map<String, Object> map = new HashMap<String, Object>();
  
        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(mapping);
  
            mapBean = (MapBean) unmar.unmarshal(reader);
  
            fail(mapBean.getMap());
  
        } catch (MarshalException e) {
  
            e.printStackTrace();
  
        } catch (Exception e) {
  
            e.printStackTrace();
  
        }
  
    }
  

Mapping配置

    <class name="com.hoo.entity.MapBean">
  
        <field name="map" collection="map">
  
            <bind-xml name="map">
  
                <class name="org.exolab.castor.mapping.MapItem">
  
                    <field name="key" type="java.lang.String">
  
                        <bind-xml name="key" node="attribute" />
  
                    </field>
  
                    <field name="value" type="com.hoo.entity.Account">
  
                        <bind-xml name="value" auto-naming="deriveByClass"/>
  
                    </field>
  
                </class>
  
            </bind-xml>
  
        </field>
  
    </class>
  

上面的map配置必須這樣配置,利用org.exolab.castor.mapping.MapItem這個(gè)class,完成key、value的配置。

結(jié)果如下:

    <?xml version="1.0" encoding="UTF-8"?>
  
    <map-bean><map key="No2"><Account id="223"><name>tom</name></Account></map>
  
    <map key="No1"><Account id="1"><name>jack</name><email>email</email><address>北京</address>
  
    <生日 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的相互轉(zhuǎn)換
  
     * @author hoojo
  
     * @createDate 2011-4-22 下午12:16:04
  
     */
  
    @SuppressWarnings("unchecked")
  
    @Test
  
    public void listForMapping2XML() {
  
        writer = new StringWriter();
  
  
        List<Account> list = new ArrayList<Account>();
  
        list.add(bean);
  
        bean = new Account();
  
        bean.setName("tom");
  
        bean.setId(223);
  
        list.add(bean); 
  
  
        ListBean listBean = new ListBean();
  
        listBean.setList(list);
  
        try {
  
            Marshaller mar = new Marshaller(writer);
  
            mar.setMapping(mapping);
  
            mar.marshal(listBean);
  
            fail(writer);
  
  
            reader = new StringReader(writer.toString());
  
            Unmarshaller unmar = new Unmarshaller(ListBean.class);
  
            unmar.setMapping(mapping);
  
            listBean = (ListBean) unmar.unmarshal(reader);
  
            fail(listBean.getList().size());
  
            for (Account acc : (List<Account>)listBean.getList()) {
  
                fail(acc);
  
            }
  
        } catch (MarshalException e) {
  
            e.printStackTrace();
  
        } catch (Exception e) {
  
            e.printStackTrace();
  
        }
  
    }
  

Mapping配置

    <class name="com.hoo.entity.ListBean">
  
        <map-to xml="listBean"/>
  
        <field name="list" collection="arraylist" type="com.hoo.entity.Account">
  
            <bind-xml name="beans" auto-naming="deriveByClass"/>
  
        </field>
  
    </class>
  

結(jié)果:

    <?xml version="1.0" encoding="UTF-8"?>
  
    <listBean><Account id="1"><name>jack</name><email>email</email><address>北京</address>
  
    <生日 birthday="2010-11-22"/></Account><Account id="223"><name>tom</name></Account></listBean>
  
    2
  
    1#jack#email#北京#2010-11-22
  
    223#tom#null#null#null
  

使用Castor工具完成Java對(duì)象與XML之間的相互轉(zhuǎn)換


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!??!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 横峰县| 盐津县| 独山县| 阜新市| 登封市| 蒲城县| 南平市| 遂川县| 米易县| 乡城县| 青川县| 漳州市| 辉县市| 家居| 英吉沙县| 河津市| 德惠市| 陆良县| 万年县| 遵义市| 萨嘎县| 咸宁市| 卓尼县| 锦州市| 荥经县| 武强县| 临朐县| 江永县| 灵台县| 和静县| 苏州市| 龙岩市| 依兰县| 阜阳市| 友谊县| 双鸭山市| 朝阳县| 固原市| 阳朔县| 双峰县| 高雄市|