`
Xuxiheng
  • 浏览: 8717 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

《用Castor 处理XML文档》学习笔记

 
阅读更多
——Castor可以完成Java和XML的相互转换

前面有介绍过json-lib这个框架,在线博文:
http://www.cnblogs.com/hoojo/archive/2011/04/21/2023805.html

以及Jackson这个框架,在线博文:http://www.cnblogs.com/hoojo/archive/2011/04/22/2024628.html

它们都可以完成Java对象到XML的转换,但是还不是那么的完善。还有XStream对JSON及XML的支持,它可以对JSON或XML的完美转换。在线博文:

http://www.cnblogs.com/hoojo/archive/2011/04/22/2025197.html

这里将介绍Castor来完成Java对象到xml的相互转换。它是怎么样转换的?和前面不同的是castor可以用一个mapping.xml文件来描述转换后的Java对象的xml基本形态,类似于xStream的annotation,这点还是非常不错的。下面我们就来看看Castor是怎么样完成Java对象到XML之间的相互转换吧。

原文地址
用Castor 处理XML文档
http://www.cnblogs.com/hoojo/archive/2011/04/25/2026819.html


以下是学习笔记:
1,改造成Maven工程后的pom.xml文件,这里要注意,castor-1.3.3.jar虽然可以在Maven仓库里面看到,但不能下载,我们需要的jar在床上castor-xml-1.3.3.jar里:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.coderdream</groupId>
    <artifactId>castor-demo</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>castor-demo Maven Webapp</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <plugin.compiler.version>3.1</plugin.compiler.version>
        <junit.version>4.11</junit.version>
        <log4j.version>1.2.12</log4j.version>
        <commons.io.version>1.3.2</commons.io.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.2</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>org.codehaus.castor</groupId>
            <artifactId>castor-xml-diff</artifactId>
            <version>1.3.3</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>castor-demo</finalName>
    </build>
</project>



2,完整的CastorTest.java文件:
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对象到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 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,此文件是对需要转换的Java对象的配置描述, 即:转换后的Java对象的xml内容的转换规则
             */
            mapping.loadMapping(System.getProperty("user.dir") + "\\src\\main\\java\\mapping.xml");

            // mapping.loadMapping("\\" + "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);
    }

    /**
     * <b>function:</b>将Javabean编组,转换成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();
        }
    }

    /**
     * <b>function:</b>将List转换成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);
        Account bean2 = new Account();
        bean2.setName("tom");
        bean2.setId(223);
        list.add(bean2);
        try {
            Marshaller.marshal(list, writer);
            fail(writer);
        } catch (MarshalException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * <b>function:</b>将Array数组转换成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();
        }
    }

    /**
     * <b>function:</b>将Java常用类型编组成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();
        }
    }

    /**
     * <b>function:</b>将XML内容,解组成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();
        }
    }

    /**
     * <b>function:</b>将XML内容解组成Java对象
     * 
     * @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();
        }
    }

    @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();
        }
    }

    /**
     * <b>function:</b>将XML内容解组成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();
        }
    }

    /**
     * <b>function:</b>xml转换成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();
        }
    }

    /**
     * <b>function:</b>List到XML的相互转换
     * 
     * @author hoojo
     * @createDate 2011-4-22 下午12:16:04
     */
    @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();
        }
    }
}

3,运行结果:
<?xml version="1.0" encoding="UTF-8"?>
<map-bean><map xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:java="http://java.sun.com" xsi:type="java:org.exolab.castor.mapping.MapItem"><key xsi:type="java:java.lang.String">No2</key><value id="223" xsi:type="Account"><name>tom</name></value></map><map xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:java="http://java.sun.com" xsi:type="java:org.exolab.castor.mapping.MapItem"><key xsi:type="java:java.lang.String">No1</key><value id="1" xsi:type="Account"><name>jack</name><email>email</email><address>北京</address><生日 birthday="2010-11-22"/></value></map></map-bean>
{No2=223#tom#null#null#null, No1=1#jack#email#北京#2010-11-22}
<?xml version="1.0" encoding="UTF-8"?>
<list-bean><list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="1" xsi:type="Account"><name>jack</name><email>email</email><address>北京</address><生日 birthday="2010-11-22"/></list><list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="223" xsi:type="Account"><name>tom</name></list></list-bean>
2
1#jack#email#北京#2010-11-22
223#tom#null#null#null
<?xml version="1.0" encoding="UTF-8"?>
<account-array size="2"><accounts id="1"><name>jack</name><email>email</email><address>北京</address><生日 birthday="2010-11-22"/></accounts><accounts id="223"><name>tom</name></accounts></account-array>
2
1#jack#email#北京#2010-11-22
223#tom#null#null#null
<?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>
<?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
2241#jack#email#北京#2010-11-22
<?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>
<?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>
1#jack#email#北京#2010-11-22
<?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>


4,git源代码地址:
[url]https://git.oschina.net/coderdream/castor-demo [/url]

5,源代码下载:
分享到:
评论

相关推荐

    castor解析xml与xsd校验xml

    Castor是一个Java库,它提供了一种方便...总结来说,Castor结合XSD提供了强大的XML处理能力,能够简化XML数据的解析和验证,提高数据的准确性和一致性。理解并熟练运用这两个工具,是Java开发中处理XML数据的关键技能。

    castor 学习文档英文原版

    在Castor学习文档中,首先介绍了XML框架,它是Castor的核心组件。文档的1.1.1节到1.1.6节涵盖了Castor XML的数据绑定框架的基本概念,例如框架的引入、使用现有类/对象进行映射、类描述符的使用以及XML上下文的创建...

    castor-xml-1.3.2.jar

    Unmarshall与Marshall使用的castor-xml-1.3.2.jar包

    Castor学习笔记 (转载)

    在这个学习笔记中,我们将深入探讨Castor的核心功能、使用场景以及其与XML绑定相关的技术。 1. Castor的基本概念 Castor的核心思想是通过XML绑定(XML Binding)技术,将XML文档结构与Java类结构对应起来。它通过...

    castor解析xml

    castor解析xml

    castor :Java与xml互转示例---代码

    Castor是一个开源的Java库,它提供了一个强大的框架,用于在Java对象和XML文档之间进行映射和转换。这个库的使用使得数据序列化和反序列化变得简单,尤其是在处理复杂的对象模型时。本文将深入探讨如何使用Castor在...

    Castor实现XML与Java的互转

    Castor实现XML与Java的互转,是目前非常流行的WSDL中常用的方法。有兴趣的可以下载看看

    castor1.4 xsd生成java

    9. **学习资源**:为了深入学习和使用Castor,可以查阅官方文档、在线教程和论坛讨论,以获取示例代码和常见问题解答。 通过以上知识点,我们可以了解到,Castor 1.4版本为XML Schema到Java类的转换提供了一个高效...

    castor插件java对象和XML自动绑定maping文件生成和java对象一键生成工具

    这个插件的主要目的是简化XML处理,特别是在Java应用程序中。它通过创建映射文件(Mapping Files)来定义Java对象和XML元素之间的关系,使得数据转换过程更加自动化。 Castor的核心功能包括: 1. **XML到Java对象...

    castor样例xml to bean和bean to xml样例

    - 支持JAXB和JDOM:Castor可以与Java Architecture for XML Binding (JAXB) 和Java Document Object Model (JDOM) 集成,扩大其在XML处理中的应用范围。 4. 示例代码: 在“castor-1.3.1-examples.jar”中,可能...

    Castor的使用,如何将java object转换为xml

    2. **处理复杂结构**:如果XML文档有复杂的嵌套结构,Castor能够自动处理这些关系,将XML节点转化为对应的Java对象,包括集合类、继承结构等。 **四、Castor的其他特性** 1. **类型转换**:Castor支持多种数据类型...

    castor-xml.jar

    解析wsdl文件的好帮手,和jdom.jar,wsdl4j.jar组合,能很好的解吸wsdl文件。

    castor-1.2-xml-schema castor转化XML需要的jar包

    Castor 项目采用 BSD 类型的证书,因此可在任何类型的应用程序(包括完整版权的项目)中使用。 Castor 实际上仅仅有 XML 数据绑定,它还支持 SQL 和 LDAP 绑定

    castor castor castor 资料

    2. **映射机制**:Castor使用XML映射文件来定义Java类和XML元素之间的对应关系。通过这种方式,开发者可以自定义对象到XML的转换规则,比如字段名的映射、复杂类型的处理等。 3. **支持多种数据类型**:Castor支持...

    castor-0.9.5.3-xml.jar

    castor-0.9.5.3-xml.jar,java和xml互相转换所使用的JAR

    castor插件java对象和XML自动绑定maping文件生成和java对象一键生成工具1.2

    总之,"castor插件java对象和XML自动绑定mapping文件生成和java对象一键生成工具1.2"是提升XML处理效率的利器,它简化了Java和XML之间的交互,使得开发过程更为流畅。X2MUTIL可能是该工具包的主程序或执行文件,用于...

    用SAXReader解析xml文档

    在Java中,解析XML文档有多种方式,其中SAX(Simple API for XML)阅读器是一种流行的选择,它以事件驱动的方式处理XML文档,具有内存占用小、处理速度快的优点。 SAXReader是DOM4J库中的一个类,它提供了SAX解析...

    castor 框架jar包和src

    它提供了一种将XML文档转换为Java对象以及将Java对象序列化为XML的机制,从而简化了XML处理并促进了Java应用程序与XML数据之间的交互。下面将详细介绍Castor框架、jar包和源代码的相关知识点。 1. **Castor框架核心...

Global site tag (gtag.js) - Google Analytics