该教程是针对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 中: