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

《Jaxb2 转换XML文档》学习笔记

 
阅读更多

——完成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的相互转换。在线博文:http://www.cnblogs.com/hoojo/archive/2011/04/25/2026819.html

这次介绍Jaxb2完成xml的转换,Jaxb2使用了JDK的新特性。如:Annotation、GenericType等,Jaxb2需要在即将转换的JavaBean中添加annotation注解。下面我们就来看看Jaxb2是怎么样完成Java对象到XML之间的相互转换吧。

原文地址
Jaxb2 转换XML文档
http://www.cnblogs.com/hoojo/archive/2011/04/26/2029011.html

以下是学习笔记:
1,改造成Maven工程后的pom.xml文件
<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>jaxb2-demo</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>jaxb2-demo Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <junit.version>4.11</junit.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
        </dependency>

        <dependency>
            <groupId>com.thoughtworks.xstream</groupId>
            <artifactId>xstream</artifactId>
            <version>1.4.7</version>
        </dependency>

    </dependencies>
    <build>
        <finalName>jaxb2-demo</finalName>
    </build>
</project>


2,完整的Jaxb2Test.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 javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.hoo.entity.Account;
import com.hoo.entity.AccountBean;
import com.hoo.entity.Birthday;
import com.hoo.entity.ListBean;
import com.hoo.entity.MapBean;

/**
 * function:Jaxb2 完成Java和XML的编组、解组
 * 
 * @author hoojo
 * @createDate 2011-4-25 上午11:54:06
 * @file Jaxb2Test.java
 * @package com.hoo.test
 * @project WebHttpUtils
 * @blog http://blog.csdn.net/IBM_hoojo
 * @email hoojo_@126.com
 * @version 1.0
 */
public class Jaxb2Test {
    private JAXBContext context = null;

    private StringWriter writer = null;
    private StringReader reader = null;

    private AccountBean bean = null;

    @Before
    public void init() {
        bean = new AccountBean();
        bean.setAddress("北京");
        bean.setEmail("email");
        bean.setId(1);
        bean.setName("jack");
        Birthday day = new Birthday();
        day.setBirthday("2010-11-22");
        bean.setBirthday(day);

        try {
            context = JAXBContext.newInstance(AccountBean.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @After
    public void destory() {
        context = null;
        bean = 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);
    }

    @Test
    public void testBean2XML() {
        try {
            failRed("---------testBean2XML---------");
            // 下面代码演示将对象转变为xml
            Marshaller mar = context.createMarshaller();
            writer = new StringWriter();
            mar.marshal(bean, writer);
            fail(writer);

            // 下面代码演示将上面生成的xml转换为对象
            reader = new StringReader(writer.toString());
            Unmarshaller unmar = context.createUnmarshaller();
            bean = (AccountBean) unmar.unmarshal(reader);
            fail(bean);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void testList2XML() {
        failRed("---------testList2XML---------");
        ListBean listBean = new ListBean();
        listBean.setName("list to xml");
        List<Object> list = new ArrayList<Object>();
        list.add(bean);
        bean = new AccountBean();
        bean.setAddress("china");
        bean.setEmail("tom@125.com");
        bean.setId(2);
        bean.setName("tom");
        Birthday day = new Birthday("2010-11-22");
        bean.setBirthday(day);

        Account acc = new Account();
        acc.setAddress("china");
        acc.setEmail("tom@125.com");
        acc.setId(2);
        acc.setName("tom");
        day = new Birthday("2010-11-22");
        acc.setBirthday(day);
        list.add(bean);
        list.add(acc);
        listBean.setList(list);

        try {
            context = JAXBContext.newInstance(ListBean.class);
            // 下面代码演示将对象转变为xml
            Marshaller mar = context.createMarshaller();
            writer = new StringWriter();
            mar.marshal(listBean, writer);
            fail(writer);

            // 下面代码演示将上面生成的xml转换为对象
            reader = new StringReader(writer.toString());
            Unmarshaller unmar = context.createUnmarshaller();
            listBean = (ListBean) unmar.unmarshal(reader);
            fail(listBean.getList().get(0));
            fail(listBean.getList().get(1));
            fail(listBean.getList().get(2));
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }

    /**
     * <b>function:</b>Map需要自己实现,可以构造一个简单的Map对象实现
     * http://metro.1045641.n5.nabble.com/Does-JAXB-2-0-support-Map-td1058084.html
     * 
     * @author hoojo
     * @createDate 2010-12-1 上午10:23:26
     */
    @Test
    public void testMap2XML() {
        failRed("---------testMap2XML---------");
        MapBean mapBean = new MapBean();
        HashMap<String, AccountBean> map = new HashMap<String, AccountBean>();
        map.put("NO1", bean);
        bean = new AccountBean();
        bean.setAddress("china");
        bean.setEmail("tom@125.com");
        bean.setId(2);
        bean.setName("tom");
        Birthday day = new Birthday("2010-11-22");
        bean.setBirthday(day);
        map.put("NO2", bean);
        mapBean.setMap(map);

        try {
            context = JAXBContext.newInstance(MapBean.class);
            // 下面代码演示将对象转变为xml
            Marshaller mar = context.createMarshaller();
            writer = new StringWriter();
            mar.marshal(mapBean, writer);
            fail(writer);

            // 下面代码演示将上面生成的xml转换为对象
            reader = new StringReader(writer.toString());
            Unmarshaller unmar = context.createUnmarshaller();
            mapBean = (MapBean) unmar.unmarshal(reader);
            fail(mapBean.getMap());
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }
}

3,运行结果:
---------testMap2XML---------
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><mapBean><map><item><key>NO2</key><value number="2"><address>china</address><birthday><birthday>2010-11-22</birthday></birthday><email>tom@125.com</email><name>tom</name></value></item><item><key>NO1</key><value number="1"><address>北京</address><birthday><birthday>2010-11-22</birthday></birthday><email>email</email><name>jack</name></value></item></map></mapBean>
{NO2=tom#2#china#2010-11-22#tom@125.com, NO1=jack#1#北京#2010-11-22#email}
---------testBean2XML---------
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><account number="1"><address>北京</address><birthday><birthday>2010-11-22</birthday></birthday><email>email</email><name>jack</name></account>
jack#1#北京#2010-11-22#email
---------testList2XML---------
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><list-bean name="list to xml"><bean number="1"><address>北京</address><birthday><birthday>2010-11-22</birthday></birthday><email>email</email><name>jack</name></bean><bean number="2"><address>china</address><birthday><birthday>2010-11-22</birthday></birthday><email>tom@125.com</email><name>tom</name></bean><account><address>china</address><birthday><birthday>2010-11-22</birthday></birthday><email>tom@125.com</email><id>2</id><name>tom</name></account></list-bean>
jack#1#北京#2010-11-22#email
tom#2#china#2010-11-22#tom@125.com
2#tom#tom@125.com#china#2010-11-22


4,git源代码地址:
https://git.oschina.net/coderdream/jaxb2-demo

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

相关推荐

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

    《用Castor处理XML文档》学习笔记 在IT行业中,数据交换和持久化是常见的需求,XML作为一种结构化的数据格式,被广泛用于这些场景。Castor是一个Java库,它提供了强大的XML到Java对象绑定功能,使得处理XML文档变得...

    JAXB 学习笔记

    **JAXB(Java Architecture for XML Binding)学习笔记** JAXB是Java平台标准版(Java SE)的一部分,它提供了一种方便的方式来将XML数据绑定到Java对象上,以及将Java对象转换为XML数据。这个强大的工具使得开发...

    JAXB学习笔记

    例如,在给出的代码片段中,`Persion`类就是一个被JAXB支持的类,它使用了`@XmlRootElement`注解来声明这个类对应于XML文档中的根元素,而`@XmlAccessorType(XmlAccessType.FIELD)`注解则表明所有字段(而非getter和...

    xml学习笔记

    9. **DOM4J与JAXB**:JAXB(Java Architecture for XML Binding)是Java标准API,用于将XML文档与Java对象互相转换。DOM4J可与JAXB结合使用,增强XML操作能力。 10. **错误处理**:在处理XML时,可能会遇到语法错误...

    java视频教程.XML.课堂笔记

    - XSLT用于将XML文档转换为其他XML文档或HTML,实现数据格式的转换。 - 使用模板和模式匹配来控制转换过程。 10. **DOM(文档对象模型)和SAX(简单API for XML)** - DOM将XML文档加载到内存中形成树形结构,...

    XML资料大全--基础 语言 笔记课件

    - XSLT(XSL Transformations):用于转换XML文档,将其转换成其他XML或HTML文档。 5. XML在实际应用中的角色: - 数据交换:XML常用于不同系统间的接口数据交换,因为它具有良好的可读性和可解析性。 - 配置...

    一个简单的xml使用测试实例

    在本实例中,我们将探讨如何在Java 1.4环境中使用XML进行基本操作,如解析和生成XML文档。 首先,我们有两个类——`XMLTest` 和 `StudentBean`。`XMLTest` 是主要的测试类,它负责执行XML的操作,而`StudentBean` ...

    jdk6学习笔记(17,18,19,20,21)

    这些学习笔记涵盖了第17到21章的内容,以下是其中的一些关键知识点: 1. **枚举(Enum)的增强**: JDK 6对枚举类型进行了增强,支持枚举常量之间的比较,可以实现Comparable接口,还引入了枚举套接字(EnumSet)...

    XML初步到精通(asp java)

    通过"XML初步到精通.exe"这个资源,你将能深入学习XML的基础知识,包括如何创建、解析、验证XML文档,以及如何在实际项目中运用XML。无论你是C#开发者、ASP.NET Web应用的构建者,还是Java程序员,这份资料都将为你...

    jdk学习笔记

    4. **XML处理**:增加了对JAXB(Java Architecture for XML Binding)的支持,便于Java对象与XML文档之间的转换。 这份"JDK6学习笔记"可能还涵盖了JDK6的其他特性,如改进的垃圾回收机制、JVM性能优化等,这些都是...

    Java JDK 6学习笔记——ppt简体版

    另外,还引入了JAXB 2.0,提供了一种将Java对象绑定到XML文档的机制,简化了XML数据的序列化和反序列化。 7. **JDBC 4.0** JDBC 4.0在Java 6中引入,增加了自动连接管理和批处理改进,简化了数据库连接和操作。它...

    J2EE知识点大全,学习笔记

    12. **JAXB(Java Architecture for XML Binding)**:自动将Java对象转换为XML,反之亦然,用于XML数据的序列化和反序列化。 13. **JCA(Java Connector Architecture)**:定义了与企业信息系统(如ERP、CRM)...

    json学习笔记、jackson的jar包

    - 和Apache的JAXB相比,Jackson在速度和灵活性上有优势,JAXB则更适用于XML和Java对象之间的转换。 8. 示例代码: ```java import com.fasterxml.jackson.databind.ObjectMapper; public class User { ...

    Java 入门word笔记

    2. DOM解析:DOM(Document Object Model)将XML文档解析为树形结构,可以遍历节点进行读写操作。Java提供了javax.xml.parsers.DocumentBuilderFactory和org.w3c.dom.Document等类来实现DOM解析。 3. SAX解析:SAX...

    CXF webservice初学笔记

    - `xalan-2.7.1.jar`:Xalan-Java是一个XSLT处理器,用于转换XML文档。 - `spring.jar`:Spring框架,提供依赖注入和事务管理,常与CXF结合使用以管理服务实例。 - `struts2-core-2.1.6.jar`:Struts2是一个基于...

    CXF笔记

    在CXF中,数据绑定组件如JAXB(Java Architecture for XML Binding)负责这项工作,它能将XML文档自动转换为Java对象,反之亦然。对于RESTful服务,CXF支持JAX-RS的MessageBodyReader和MessageBodyWriter接口,以便...

    超详细java笔记

    - **JAXB(Java Architecture for XML Binding)**:JAXB允许将Java对象转换为XML,反之亦然,简化了XML数据的处理。 3. **JavaScript** - **JavaScript基础**:JavaScript是一种客户端脚本语言,用于网页动态...

Global site tag (gtag.js) - Google Analytics