JAXB是Java Architecture for XMLBinding 的缩写,它将XML Schema 和Java对象结合起来,提供XML文档和Java类互相转换的功能(根据Schema生成Java类,或将Java对象类树写到XML文档),从而使XML文件的读(unmarshalling)写(marshalling)变得十分方便。
1.JAXB结构
这一节描述JAXB处理模型的组件和相互作用。
架构概述
如图所示,一个JAXB实现包含以下组件:
- Schema编译器(Schema Compiler),将Schema和由Schema衍生的程序模块绑定。绑定过程由基于XML的绑定语言说明。
- Schema生成器(Schema generator),将一组程序模块映射到一个Schema。映射过程由程序注释(annotations)说明。
- 绑定过程框架(Binding runtime Framework),提供XML文档操作、验证等所需的读(unmarshalling)和写(writing)功能。
JAXB绑定过程
下图描述了JAXB绑定的具体过程:
JAXB数据绑定一般包括以下步骤:
- 生成类,XML Schema作为输入,由JAXB编译器生成对应的类。
- 编译类,编译所有的类。
- 读(Unmarshal),JAXB绑定框架能读取所有满足Schema的XML文件,而且也支持从DOM节点、String buffers、SAX等读取XML内容。
- 生成对象树(Generate Content tree),Unmarshal后会生成JAXB生成类的实例的结构树;这些类树表示包含了XML文件的结构和内容。
- 验证(Validate,可选),在读XML文档生成类实例前会验证XML文档,判断文档是否满足Schema的要求。如果在第6步修饰了文档内容,可以在写入XML文档前重新验证。
- 处理文档,可通过Java对象对XML数据进行修改。
- 写(Marshal),处理后的数据可写入一个或多个XML文档。可在写入前对其验证。默认采用UTF-8编码。
2.XML内容表示
JAXB支持将生成的类放到不同的package中。一个package包含以下内容:
3.XML Schema 绑定
这一节主要说明JXAB使用的默认XML-Java绑定。所有这些绑定项都可以在全局上进行覆盖,或者使用自定义绑定声明。具体参见(JAXB文档)。
简单类型定义
使用简单类型定义的Schema组件一般映射为Java属性。因为有不同类型的Schema组件,下面的Java属性特征包括:
- 基类型(Base type)
- 集合类型(Collection type)
- 断言(predicate)
余下的Java属性特征在Schema 组件中使用simple类型定义指定。
默认数据类型绑定
下面部分解释默认Schema-to-Java,JAXBElement和Java-to-Schema数据类型绑定。
Schema-to-Java 映射
Java数据类型比XML Schema要丰富的多。下表提供了JAXB中XML和Java数据类型的对应关系:
XML Schema Type |
Java Data Type |
xsd:string |
java.lang.String |
xsd:integer |
java.math.BigInteger |
xsd:int |
int |
xsd.long |
long |
xsd:short |
short |
xsd:decimal |
java.math.BigDecimal |
xsd:float |
float |
xsd:double |
double |
xsd:boolean |
boolean |
xsd:byte |
byte |
xsd:QName |
javax.xml.namespace.QName |
xsd:dateTime |
javax.xml.datatype.XMLGregorianCalendar |
xsd:base64Binary |
byte[] |
xsd:hexBinary |
byte[] |
xsd:unsignedInt |
long |
xsd:unsignedShort |
int |
xsd:unsignedByte |
short |
xsd:time |
javax.xml.datatype.XMLGregorianCalendar |
xsd:date |
javax.xml.datatype.XMLGregorianCalendar |
xsd:g |
javax.xml.datatype.XMLGregorianCalendar |
xsd:anySimpleType |
java.lang.Object |
xsd:anySimpleType |
java.lang.String |
xsd:duration |
javax.xml.datatype.Duration |
xsd:NOTATION |
javax.xml.namespace.QName |
JAXBElement 对象
当XMLElement的信息无法用Java映射类表示时,会以JAXBElement表示。该对象可以获得和设置对象名和值。
Java-to-Schema映射
Java Class |
XML Data Type |
java.lang.String |
xs:string |
java.math.BigInteger |
xs:integer |
java.math.BigDecimal |
xs:decimal |
java.util.Calendar |
xs:dateTime |
java.util.Date |
xs:dateTime |
javax.xml.namespace.QName |
xs:QName |
java.net.URI |
xs:string |
javax.xml.datatype.XMLGregorianCalendar |
xs:anySimpleType |
javax.xml.datatype.Duration |
xs:duration |
java.lang.Object |
xs:anyType |
java.awt.Image |
xs:base64Binary |
javax.activation.DataHandler |
xs:base64Binary |
javax.xml.transform.Source |
xs:base64Binary |
java.util.UUID |
xs:string |
4.自定义生成类和Java元素
Schema-to-Java
自定义JAXB绑定声明允许自定义JAXB生成类,而不局限于XML Schema的限制,例如类名和包名的映射修改等。
在后面我们会提供自定义JAXB绑定的实例。
Java-to-Schema
javax.xml.bind.annotation包中提供的JAXBannotation可以用于自定义Java类元素同XML Schema的映射。
Java包注释总结
注释 |
描述和默认设置 |
@XmlSchema |
将一个package映射到XML target namespace。 默认设置: @XmlSchema ( |
@XmlAccessorType |
控制字段和属性的默认序列化。 默认设置: @XmlAccessorType ( |
@XmlAccessorOrder |
控制映射到XML元素的属性和字段的默认排序。 默认设置: @XmlAccessorOrder ( |
@XmlSchemaType |
允许自定义到XML Schema内置类型的映射。 默认设置: @XmlSchemaType ( |
@XmlSchemaTypes |
用于多个@XmlSchemaType注释定义的容器的注释。 默认设置:None |
Java类注释总结
注释 |
描述和默认设置 |
@XmlType |
映射一个Java类到schema类型。 默认设置: @XmlType ( |
@XmlRootElement |
将Schema类型的一个全局元素和类映射的对象进行关联。 默认设置: @XmlRootElement ( |
Java enum类型注释
注释 |
描述和默认设置 |
@XmlEnum |
将一个Java类型映射到一个XML 简单类型。 默认设置: @XmlEnum ( value = String.class ) |
@XmlEnumValue |
将一个Java类型映射到一个XML 简单类型 默认设置:None |
@XmlType |
Java类到Schema类型的映射。 默认设置: |
@XmlRootElement |
将Schema类型的一个全局元素和类映射的对象进行关联。 默认设置: @XmlRootElement ( |
Java属性和字段注释
注释 |
描述和默认设置 |
@XmlElement |
Maps a JavaBeans property or field to an XML element derived from a property or field name. Default settings: @XmlElement ( |
@XmlElements |
A container annotation for defining multiple@XmlElementannotations. Default settings:None |
@XmlElementRef |
Maps a JavaBeans property or field to an XML element derived from a property or field’s type. Default settings: @XmlElementRef ( |
@XmlElementRefs |
A container annotation for defining multiple@XmlElementRefannotations. Default settings:None |
@XmlElementWrapper |
Generates a wrapper element around an XML representation. It is typically used as a wrapper XML element around collections. Default settings: @XmlElementWrapper ( |
@XmlAnyElement |
Maps a JavaBeans property to an XML infoset representation or a JAXB element. Default settings: @XmlAnyElement ( |
@XmlAttribute |
Maps a JavaBeans property to an XML attribute. Default settings: @XmlAttribute ( |
@XmlAnyAttribute |
Maps a JavaBeans property to a map of wildcard attributes. Default settings:None |
@XmlTransient |
Prevents the mapping of a JavaBeans property to an XML representation. Default settings:None |
@XmlValue |
Defines mapping of a class to an XML Schema complex type with asimpleContentor an XML Schema simple type. Default settings:None |
@XmlID |
Maps a JavaBeans property to an XML ID. Default settings:None |
@XmlIDREF |
Maps a JavaBeans property to an XML IDREF. Default settings:None |
@XmlList |
Maps a property to a list simple type. Default settings:None |
@XmlMixed |
Marks a JavaBeans multi-valued property to support mixed content. Default settings:None |
@XmlMimeType |
Associates the MIME type that controls the XML representation of the property. Default settings:None |
@XmlAttachmentRef |
Marks a field/property that its XML form is a URI reference to mime content. Default settings:None |
@XmlInlineBinaryData |
Disables consideration of XOP encoding for data types that are bound to base64-encoded binary data in XML. Default settings:None |
工厂对象注释
Annotation |
Description and Default Setting |
@XmlElementDecl |
Maps a factory method to an XML element. Default settings: @XmlElementDecl ( |
适配器注释
注释 |
@H_403_1883@
@XmlJavaTypeAdapter |
@H_403_1883@
@XmlJavaTypeAdapters |
@H_403_1883@