JAXB解析xml转换为POJO

来源:互联网 发布:心事谁人知谐音 编辑:程序博客网 时间:2024/06/16 02:33

一。概述

JAXB(Java Architecture for XML Binding)是由 J2EE 体系中标准的 XML schema 和 Java 数据绑定框架,开发者可以使用 JAXB 方便地在 Java 应用程序中进行XML 数据和 Java 对象的转换。JAXB 提供了将 XML 文档解析为 Java 内容树的方法,以及将 Java 内容树重新写回 XML 文档的方法。同时 JAXB 还提供了基于 XML schema 生成 Java 类以及从 Java 类生成 XML schema 的支持。

二。JAXB 框架分为以下三个组成部分:

schema 编译器:schema 编译器以 XML schema 为输入生成和 schema 相对应的 Java 类集,生成的 Java 类中会根据 schema 的结构自动包含了相应的 JAXB 注解。
     比方说 schema 里的一个元素映射的 Java 类会自动用 @XmlType 注解加以标注,一个元素的属性所映射的 Java 字段会自动用 @XmlElement 注解加以标注;

schema 生成器:schema 生成器以包含 JAXB 注解的 Java 类集为输入生成相应的 XML schema。比方说一个包含 @XmlType 注解的 Java 类在生成的
schema 中会被映射为一个元素;

JAXB 运行环境:JAXB 运行时环境提供了两个基本的操作用于 XML 文档的访问,操作以及验证等等:marshal、unmarshal,这两个操作也是 XML 和 Java 绑定的基础。Marshal 是指将一个内存对象以 XML 文档形式进行编组处理的过程,unmarshal 则是一个相反的过程,将一个 XML 文档解析为内存对象的过程。


三。JAXB基础---XML Schema
XML schema 是 XML 文档的格式定义,是 DTD 的替代产品用于约束 XML 文档内容及结构,比如它定义了 XML 文档可以出现的元素,
元素出现的顺序,元素具有的属性等。XML schema 本身就是一个 XML 文档,因此天然具有了 XML 的可扩展性。
同时 XML schema 对 XML 数据类型提供了更为丰富的支持。JAXB 框架的基础就是 XML schema,一个使用 JAXB 的典型场合就是根据业务数据模型
需要先写出 XML schema,然后利用 JAXB 框架的绑定编译器直接生成 XML 相应的 Java 类集。
四。JAXB与WEB服务的关系

JAX-WS 型 Web 服务将 XML 和 Java 之间的绑定代理给了 JAXB 来完成,也就是说在 Web 服务调用过程中的 XML 数据和 Java 对象间转换都是由 JAXB 框架来完成的。Web 服务中接口引用的参数、返回类型等等数据类型描述都是在关联的 XML schema 中定义的,而 JAXB 框架也正是根据这个 Web 服务关联的 XML schema 来完成于 Java 对象之间的相互映射。


从 Java 到 XML schema 的映射开发者可以通过 JAXB 提供的注解来完成,在编程 Java 类时可以使用 JAXB 丰富的注解轻松地完成绑定定制。
五。使用JAXB来定制WEB服务

@XmlRootElement 
 注解用于标注类或枚举类型,用它标注的类在映射后的 schema 中会以一个全局元素的形式出现

参数:name   定制映射的 schema 全局元素的名称,一般来说以 @XmlRootElement 标注的类在相应的 XML 文档中会以最外层或根节点形式出现。

      namespace    定义这个根节点命名空间, XML元素的名称空间名
例:


@XmlAccessorType  定义映射这个类中的何种类型需要映射到XML。
      可接收四个参数,分别是:

      XmlAccessType.FIELD:映射这个类中的 private 非静态所有字段到XML

      XmlAccessType.PROPERTY:映射这个类中的属性(get/set方法)到XML

      XmlAccessType.PUBLIC_MEMBER:将这个类中的所有public的field或property同时映射到XML(默认)

      XmlAccessType.NONE:不映射
例如:@XmlAccessorType(XmlAccessType.FIELD)
           @XmlAccessorType(value = XmlAccessType.PROPERTY) 

@XmlType  
@XmlType 注解用于标注类或枚举类型,用它标注的类在映射后的 schema 中中会以一个 XML 复杂数据类型的形式出现

参数:propOrder        指定映射XML时的节点顺序,来指定输出顺序,来定制映射后的复杂数据类型的内容顺序

         factoryClass     指定UnMarshal时生成映射类实例所需的工厂类,默认为这个类本身

         factoryMethod  指定工厂类的工厂方法

         name               定义XML Schema中type的名称,定制映射的 XML 数据类型的名称

         namespace      指定Schema中的命名空间

例:

@XmlElement  
1)@XmlElement 注解用于标注 Javabean 的属性,用它标注的属性在映射后的 schema 中以元素的形式出现,所有 Javabean 属性映射的元素组合成为
  @XmlType 映射的复杂数据类型.
2)指定一个字段或get/set方法映射到XML的节点。如,当一个类的XmlAccessorType 被标注为PROPERTY时,在某一个没有get/set方法的字段上标注此注解,
即可将该字段映射到XML。

参数:defaultValue  指定节点默认值

           name             指定节点名称,定制映射后的 XML 元素的名称

          namespace    指定节点命名空间

          required         指定该元素是否必须出现.是否必须(默认为false)required() 为 true,则将Javabean 属性映射到一个 minOccurs="1" 的 XML 模式元素声明                              。maxOccurs为 "1" 表示单个赋值的属性,maxOccurs 为 "unbounded" 则表示多个赋值的属性。

         nillable           该字段是否包含 nillable="true" 属性(默认为false)

         type               定义该字段或属性的关联类型
例:



@XmlAttribute  指定一个字段或get/set方法映射到XML的属性。用于标注 Javabean 属性,用它标注的属性在映射后的 schema 中以元素属性形式表现

参数:name             指定属性名称,定制映射后的名称

         namespace    指定属性命名空间

         required         是否必须(默认为false,指定是否映射后的属性为必须出现的
例:


这个 Java 类在映射后的 Web 服务 schema 中会表现为:

@XmlTransient  定义某一字段或属性不需要被映射为XML。如,当一个类的XmlAccessorType 被标注为PROPERTY时,
在某一get/set方法的字段上标注此注解,那么该属性则不会被映射。


@XmlElementWrapper  为数组元素或集合元素定义一个父节点。如,类中有一元素为List items,若不加此注解,该元素将被映射为

    <items>...</items>

    <items>...</items>

这种形式,此注解可将这个元素进行包装,如:

    @XmlElementWrapper(name="items") 
    @XmlElement(name="item") 
    public List items;

将会生成这样的XML样式:

    <items>

        <item>...</item>

        <item>...</item>

    </items>


@XmlJavaTypeAdapter  自定义某一字段或属性映射到XML的适配器。如,类中包含一个接口,我们可以定义一个适配器(继承自javax.xml.bind.annotation.adapters.XmlAdapter类),指定这个接口如何映射到XML。

@XmlSchema 配置整个包的namespace,这个注解需放在package-info.java文件中。

0 0
原创粉丝点击