返回顶部

收藏

JAXB教程

更多

首先,只要您稍微用过一点数据绑定,对这两个术语应该很熟悉。先回顾一下这两个术语,然后我们将讨论一些更有趣的术语。

编组(Marshalling)是把内存中的数据转化到存储媒介上的过程。因此在 Java 和 XML 环境中,编组就是把一些 Java 对象转化成一个(或多个) XML 文档。在数据库环境中,则是把 Java 表示的数据存入数据库。显然,编组的秘密在于把 Java 实例中的面向对象结构转化成适用于 XML 的 扁平结构,或者 RDBMS 中的关系结构(使用 Java 技术转换到 OODBMS 实际上很简单)。

解组(Unmarshalling)是把数据从存储媒介转换到内存中的过程--正好与编组相反。因此需要把 XML 文档解组到 Java VM 中。这里的复杂性不是在扁平数据中,因为这不是必需的,而在于从正确的数据到正确的 Java 代码变量的映射。如果映射是错误的,就不可能正确地访问数据。当然,如果再尝试重新编组还会造成更大的问题,并且问题传播得很快。

JAXB 的下载地址 http://jaxb.java.net/2.2.4/

使用 JAXB 进行之前,首先要生成表示 XML 数据的 Java 类。需要 XML Schema 以生成类和数据结构。

JAXB简单应用

<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSpy v2009 (http://www.altova.com) by user (EMBRACE) -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="VMTemplate" type="Template">
        <xs:annotation>
            <xs:documentation>Virtual Machine Template</xs:documentation>
        </xs:annotation>
    </xs:element>
    <xs:element name="ServerTemplate" type="Template">
        <xs:annotation>
            <xs:documentation>Physical Machine Template</xs:documentation>
        </xs:annotation>
    </xs:element>
    <xs:complexType name="Template">
        <xs:all>
            <xs:element name="TemplateID" type="xs:string">
                <xs:annotation>
                    <xs:documentation>Virtual Machine Template Id (eg.CIDC-T-VM-00000001)
                        </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="ResourceType" type="xs:string">
                <xs:annotation>
                    <xs:documentation>Resource Type (eg.CIDC-RT-VM)
                        </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="MeasureMode" type="xs:string">
                <xs:annotation>
                    <xs:documentation>Measure Mode (eg.Duration)
                        </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="TemplateDesc" type="xs:string">
                <xs:annotation>
                    <xs:documentation>Virtual Machine Template Description
                        </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="TemplateStatus" type="xs:string">
                <xs:annotation>
                    <xs:documentation>
                        </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="TemplateCreator" type="xs:string">
                <xs:annotation>
                    <xs:documentation>Template Creator
                        </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="CreateTime" type="xs:string">
                <xs:annotation>
                    <xs:documentation>Create Time(eg.2011-05-24 08:55:30)
                        </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="ResourceInfo" type="xs:string">
                <xs:annotation>
                    <xs:documentation>Resource Information
                        </xs:documentation>
                </xs:annotation>
            </xs:element>
        </xs:all>
    </xs:complexType>
</xs:schema>

准备好XML Schema,生成 JAXB 类就很简单了。输入以下命令

xjc -p hello hello.xsd  

一定要在和 Schema的 XX.xsd文件相同的目录中执行上述命令这时会在hello目录下生成 ObjectFactory.java , Template.java 两个文件

主要的工作还是用来通过java类来生成相应的xml文件:

测试方法:

public static void main(String[] args) throws Exception {

        JAXBContext context = JAXBContext.newInstance(ObjectFactory.class);
        ObjectFactory of = new ObjectFactory();
        Templatefoo = new Template();
        JAXBElement<Foo> e = of.createRoot(foo);

        //用于输出元素
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        FileOutputStream stream = new FileOutputStream(new File(args[0]));
        marshaller.marshal(e, stream);
    }

标签:java,JAXB,xml,序列化

收藏

0人收藏

支持

0

反对

0

相关聚客文章
  1. sulong 发表 2009-11-20 13:36:30 让JAXB生成序列化的类
  2. 冷乐 发表 2015-07-04 08:29:21 使用JAXB类库实现JAVA对象与XML互转
  3. 隐形人真忙 发表 2015-11-11 14:40:54 common-collections中Java反序列化漏洞导致的RCE原理分析
  4. 博主 发表 2015-12-28 11:33:29 python3.5 安装 Paramiko
  5. dplord 发表 2016-12-27 14:40:35 java序列化Serializable小结
  6. dplord 发表 2016-12-27 14:40:35 java序列化Serializable小结
  7. lightless 发表 2018-07-20 06:44:58 [Java unserialization] JRE8u20 反序列化漏洞分析
  8. 博主 发表 2015-06-19 08:09:43 关于Java对象序列化您不知道的5件事
  9. 博主 发表 2015-11-26 05:52:15 json-lib反序列化精度丢失问题
  10. 博主 发表 2015-11-26 05:52:15 json-lib反序列化精度丢失问题
  11. 博主 发表 2016-04-09 05:42:54 JAXB 笔记
  12. ziggear 发表 2016-09-17 00:30:12 spring如何让thymeleaf不使用XML来解析页面