该教程是针对JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
请参阅Java语言变化,了解Java SE 9及其后续版本中更新的语言特性的概述。
请参阅JDK发行说明,了解所有JDK发行版的新特性、增强功能和已移除或已弃用选项的信息。
以下部分描述了如何使用包含在JAXB RI包中的示例应用程序。JAXB RI包可以从http://jaxb.java.net下载和安装。示例位于jaxb-ri-install/samples/目录中。这些示例演示并构建了JAXB的关键特性和概念。请按照所述的顺序进行操作。
阅读完本节后,您应该对JAXB感到足够熟悉,能够:
本文档描述了三组示例:
基本和自定义示例目录包含以下几个基本文件:
以下表格简要描述了基本的、自定义的和Java-to-Schema JAXB示例。
表格:基本的JAXB示例
| 示例名称 | 描述 |
|---|---|
| 修改Marshal | 演示如何修改Java内容树。 |
| Unmarshal验证 | 演示如何在解组期间启用验证。 |
表格:自定义JAXB示例
| 示例名称 | 描述 |
|---|---|
| 自定义内联 | 演示如何使用内联注释在XML模式中自定义默认的JAXB绑定。 |
| 数据类型转换器 | 演示了将XML的simpleType定义绑定到Java数据类型的替代、更简洁的绑定,类似于自定义内联示例。 |
| 外部自定义 | 演示如何使用外部绑定声明文件将绑定自定义传递给JAXB绑定编译器,用于只读模式。 |
表格:Java-to-Schema JAXB示例
| 示例名称 | 描述 |
|---|---|
| 创建Marshal | 演示如何使用ObjectFactory类创建Java内容树并将其编组为XML数据。还演示了如何向JAXB List属性添加内容。 |
| XmlAccessorOrder | 演示如何在Java类中使用@XmlAccessorOrder和@XmlType.propOrder映射注解来控制Java类型编组或解组XML内容的顺序。 |
| XmlAdapter | 演示如何使用接口XmlAdapter和注解@XmlJavaTypeAdapter,为使用整数(int)作为键和字符串(String)作为值的HashMap(字段)提供自定义的XML内容映射。 |
| XmlAttribute | 演示如何使用注解@XmlAttribute将属性或字段定义为XML属性处理。 |
| XmlRootElement | 演示如何使用注解@XmlRootElement为对应类的XML模式类型定义一个XML元素名称。 |
| XmlSchemaType类 | 演示如何使用注解@XmlSchemaType自定义属性或字段到XML内置类型的映射。 |
| XmlType | 演示如何使用注解@XmlType将类或枚举类型映射到XML模式类型。 |
JAXB XJC模式绑定编译器将源XML模式转换或绑定到Java编程语言中的一组JAXB内容类。编译器类xjc在JAXB RI包中提供:Solaris/Linux上的xjc.sh,Windows上的xjc.bat。xjc类包含在JDK类库中(在tools.jar中)。
xjc.sh和xjc.bat使用相同的命令行选项。您可以通过调用脚本而不带任何选项或使用-help开关来显示快速使用说明。语法如下:
xjc [-选项 ...] <模式文件/URL/目录/包>... [-b >绑定信息文件<] ...
如果指定了 目录,将编译目录中的所有模式文件。如果指定了 包,将编译 /META-INF/sun-jaxb.episode 绑定文件。
xjc 命令行选项如下:
JAXB Schema Generator(schemagen)为您的Java类中引用的每个命名空间创建一个模式文件。可以通过使用相应平台的bin目录中的适当的schemagen脚本启动模式生成器。模式生成器仅处理Java源文件。如果Java源文件引用其他类,则这些源文件必须从系统的CLASSPATH环境变量中可访问;否则,在生成模式时会出现错误。无法控制生成的模式文件的名称。
您可以通过在不带任何选项的情况下调用脚本或使用-help选项来显示快速使用说明。语法如下:
schemagen [-d 路径]
[java源文件]
-d 路径选项指定处理器生成的和javac生成的类文件的位置。
当您对基本示例中使用的po.xsd XML模式运行JAXB绑定编译器时,JAXB绑定编译器将生成一个名为primer.po的Java包,其中包含以下表中描述的类。
表:基本示例中的模式生成的JAXB类
| 类 | 描述 |
|---|---|
| primer/po/Items.java | 绑定到模式complexType名称为Items的公共接口。 |
| primer/po/ObjectFactory.java | 扩展com.sun.xml.bind.DefaultJAXBContextImpl的公共类;用于创建指定接口的实例。例如,ObjectFactory的createComment()方法实例化一个Comment对象。 |
| primer/po/PurchaseOrderType.java | 绑定到模式complexType名称为PurchaseOrderType的公共接口。 |
| primer/po/USAddress.java | 绑定到模式complexType名称为USAddress的公共接口。 |
以下表格描述了这些类及其与基本示例的源XML模式的具体绑定。
表:基本示例的模式到Java绑定
| XML Schema | JAXB绑定 |
|---|---|
<xsd:schema xmlns:xsd= "http://www.w3.org/2001/XMLSchema"> |
|
<xsd:complexType
name="PurchaseOrderType">
<xsd:sequence>
<xsd:element
name="shipTo"
type="USAddress"/>
<xsd:element
name="billTo"
type="USAddress"/>
<xsd:element
ref="comment"
minOccurs="0"/>
<xsd:element
name="items"
type="Items"/>
</xsd:sequence>
<xsd:attribute
name="orderDate"
type="xsd:date"/>
</xsd:complexType>
|
PurchaseOrderType.java |
<xsd:complexType
name="USAddress">
<xsd:sequence>
<xsd:element
name="name"
type="xsd:string"/>
<xsd:element
name="street"
type="xsd:string"/>
<xsd:element
name="city"
type="xsd:string"/>
<xsd:element
name="state"
type="xsd:string"/>
<xsd:element
name="zip"
type="xsd:decimal"/>
</xsd:sequence>
<xsd:attribute
name="country"
type="xsd:NMTOKEN"
fixed="US"/>
</xsd:complexType>
|
USAddress.java |
<xsd:complexType
name="Items">
<xsd:sequence>
<xsd:element
name="item"
minOccurs="1"
maxOccurs="unbounded">
|
Items.java |
<xsd:complexType>
<xsd:sequence>
<xsd:element
name="productName"
type="xsd:string"/>
<xsd:element
name="quantity">
<xsd:simpleType>
<xsd:restriction
base="xsd:positiveInteger">
<xsd:maxExclusive
value="100"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element
name="USPrice"
type="xsd:decimal"/>
<xsd:element
ref="comment"
minOccurs="0"/>
<xsd:element
name="shipDate"
type="xsd:date"
minOccurs="0"/>
</xsd:sequence>
<xsd:attribute
name="partNum"
type="SKU"
use="required"/>
</xsd:complexType>
|
Items.ItemType |
</xsd:element> </xsd:sequence> </xsd:complexType> |
|
<!-- Stock Keeping Unit, 用于标识产品的代码 --> |
|
<xsd:simpleType
name="SKU">
<xsd:restriction
base="xsd:string">
<xsd:pattern
value="\d{3}-[A-Z]{2}"/>
</xsd:restriction>
</xsd:simpleType>
|
|
</xsd:schema> |
下面的章节简要介绍了JAXB绑定编译器为示例生成的以下各个类的功能:
在 Items.java 中:
在 ObjectFactory.java 中:
例如,在此示例中,对于 Java 接口 primer.po.Items.ItemType,ObjectFactory 创建了方法 createItemsItemType()。
在 PurchaseOrderType.java 中:
在 USAddress.java 中: