Scott Fordin

本章为使用JAXB提供了一些实用的说明。特别地,本章提供了九个示例Java应用,其中每一个都在关键的JAXB特性和概念的基础上演示并创建出来。因此建议按照顺序阅读本文。

读完本章,应该能轻松做到以下几点:

  • XML模式中生成JAXB Java
  • 利用模式派生JAXB类编组并反编组Java应用中的XML内容
  • 利用模式派生JAXB类从头开始创建Java内容树
  • 在反编组期间以及运行时确认XML内容
  • 自定义JAXB模式和Java的绑定

基本示例应用的主要目标在于利用默认的设置和绑定来突出核心的JAXB功能。熟悉了这些核心特性和功能后,就可以参照自定义JAXB绑定中的说明来使用那四个用来演示如何修改默认JAXB绑定的示例应用。


注意:这些示例中使用的采购单方案po.xsd和采购单XML文件po.xml是从David C. Fallside编辑的W3C XML Schema Part 0: Primer(http://www.w3.org/TR/xmlschema-0/)中衍生来的。

通用用法说明

这一部分给出了本章用到的示例应用的通用用法说明,包括如何手工以及利用Ant创建工具来创建和运行应用。并且还给出了这些示例中用到的模式和JAXB绑定的详细信息。特别地,本节的主题如下:

·   描述

·   系统需求

·   使用示例应用

·   手工配置和运行示例应用

·   利用Ant工具配置和运行示例应用

·   关于模式和Java的绑定

·   模式派生JAXB

描述

本章共有九个示例应用,前五个演示了像反编组、编组和确认XML内容这样的基本JAXB概念,后四个演示了自定义XML模式和Java对象绑定的各种方法。本章中的每个示例应用都建立在采购单场景的基础上。除第个9之外,所有示例应用都使用了一个根据XML模式和po.xsd编写的XML文档和po.xml

10-1  示例JAXB应用描述

示例应用

描述

示例应用1

演示了如何将XML文档反编组成Java内容树并访问其中的数据

示例应用2

演示了如何修改Java内容树

示例应用3

演示了如何利用ObjectFactory类从头创建一个Java内容树并将其编组成XML数据

示例应用4

演示了如何在反编组期间内进行确认

示例应用5

演示了如何在运行时确认Java内容树

示例应用6

演示了如何通过XML模式中的内联注释自定义默认的JAXB绑定

示例应用7

示例应用6类似,该示例演示了XML simpleType定义和Java数据类型的另一个更简洁的绑定

示例应用8

演示了如何利用一个外部绑定声明文件来将只读模式的绑定自定义传送给JAXB绑定编译器

示例应用9

演示了如何利用自定义来解决JAXB绑定编译器报告的名称冲突。另外,该示例还演示了如何绑定选择模型组和Java接口,以及如何正确操作JAXB列表。建议你首先运行应用目录中的ant fail来查看JAXB绑定编译器报告的错误,然后再观察binding.xjb以便找出解决问题的办法。在编译该模式时如果只运行了ant,那么就可以利用绑定自定义来解决名称冲突的问题


注意:这些示例应用位于$JAXB_HOME/examples/users-guide目录中


每个示例应用目录中都包含了以下几个基本文件:

·   po.xsd是被用作JAXB绑定编译器的输入的XML模式,并且从该模式中还可以衍生出很多JAXB Java类。对于示例应用67,该文件包含了内联的绑定自定义。注意示例应用9使用的是example.xsd,而不是po.xsd

·   po.xml是包含了示例XML内容的采购单XML文件,并且还是每个示例中需要将其反编组到一个Java内容树中的文件。该文件在所有的示例应用中几乎是一样的,只有些微用来凸显不同的JAXB概念的差别。注意示例应用9使用的是example.xml,而不是po.xml

·   Main.java是每个示例应用中的主Java类。

·   Build.xml是为了方便而提供的一个Ant项目文件。正如本章后面将会讲到的那样,你既可以手工利用标准的JavaJAXB命令来生成和编译模式派生的JAXB类,也可以利用Ant自动生成、编译和运行这些类。Build.xml文件根据示例应用的不同而不同。

·   示例应用6中的MyDatatypeConverter.java用来提供自定义的数据类型转换。

·   示例应用89中的binding.xjb是一个外部绑定声明文件,它被传送给JAXB绑定编译器,以自定义默认的JAXB绑定。

·   示例应用9中的example.xsd是一个有意包含命名冲突的短模式文件,它的目的在于说明如何利用自定义的JAXB绑定解决这样的冲突。

系统需求

为了使用这里所说的JAXB示例应用,需要有Java SDK,标准版1.3.1或者更新的版本。在Solaris/LinuxWindows NT/2000/XP操作系统环境中使用这些应用的说明被提供出来。手工或者利用嵌入在JWSDP中的Ant自动运行应用所需的说明也被提供出来。

使用示例应用

和上面提到的所有用来实现模式派生的JAXB类的应用一样,使用JAXB的过程分为两个截然不同的阶段:

1.   从一个XML源模式生成并创建JAXB Java类。

2.   反编组、确认、处理和编组XML内容。

至于这些示例应用,可以选择手工或者利用Ant以及各个示例应用目录中都有的build.xml项目文件来完成这些步骤。


注意:建议至少熟悉示例应用1的手动过程。其中各个示例应用的手动过程都大同小异。


手动配置和运行示例应用

本节描述了如何配置和运行示例应用1。其他示例应用的说明本质上一样的,只需将目录SampleApp1改成将要用到的应用的目录就行了。

Solaris/Linux

1. 设置环境变量:

export JAVA_HOME=<your J2SE installation directory>
export JWSDP_HOME=<your JWSDP1.1 installation directory>
export JAXB_HOME=$JWSDP_HOME/jaxb-1.0
export JAXB_LIBS=$JAXB_HOME/lib
export JAXP_LIBS=$JWSDP_HOME/jaxp-1.2.2/lib
export JWSDP_LIBS=$JWSDP_HOME/jwsdp-shared/lib

2. 设置PATH

export PATH=$JAXB_HOME/bin:$JWSDP_HOME/jwsdp-shared/bin:$PATH 

3. 更新CLASSPATH

export CLASSPATH=$JAXB_LIBS/jaxb-api.jar: \
$JAXB_LIBS/jaxb-ri.jar: \
$JAXB_LIBS/jaxb-xjc.jar: \
$JAXB_LIBS/jaxb-libs.jar: \
$JAXP_LIBS/jaxp-api.jar: \
$JAXP_LIBS/endorsed/xercesImpl.jar: \ $JAXP_LIBS/endorsed/xalan.jar: \
$JAXP_LIBS/endorsed/sax.jar: \
$JAXP_LIBS/endorsed/dom.jar: \
$JWSDP_LIBS/jax-qname.jar: \
$JWSDP_LIBS/namespace.jar:.

4. 改成所需示例应用的目录

例如,为运行示例应用1

cd $JAXB_HOME/examples/users-guide/SampleApp1

5. 利用xjc.sh命令从源XML模式中生成JAXB Java类。

$JAXB_HOME/bin/xjc.sh po.xsd -p primer.po

 

Po.xsd是源XML模式的名称。-p primer.po开关告诉JAXB编译器将生成的类放入名为primer.poJava包中。在本例中,包的名称必须为primer.po JAXB编译器选项中可以找到JAXB绑定编译器选项的完整列表。

6. 为使用Javadoc工具的应用生成API文档(可选的)。

$JAVA_HOME/bin/javadoc -package primer.po -sourcepath .
-d docs/api -windowtitle "Generated Interfaces for po.xsd" 

7. 编译生成的JAXB Java类。

$JAVA_HOME/bin/javac Main.java primer/po/*.java primer/ 
po/impl/*.java 

8. 运行Main类。

$JAVA_HOME/bin/java Main

Po.xml文件被反编组成Java内容树,并且该内容树中的XML数据被写成System.out

Windows NT/2000/XP

1. 设置环境变量:

set JAVA_HOME=<your J2SE installation directory>
set JWSDP_HOME=<your JWSDP1.1 installation directory>
set JAXB_HOME=%JWSDP_HOME%\jaxb-1.0
set JAXB_LIBS=%JAXB_HOME%\lib
set JAXP_LIBS=%JWSDP_HOME%\jaxp-1.2.2\lib
set JWSDP_LIBS=%JWSDP_HOME%\jwsdp-shared\lib

2.设置PATH

set PATH=%JAXB_HOME%\bin;%JWSDP_HOME%\jwsdp-shared\bin;%PATH% 

3. 更新CLASSPATH

set CLASSPATH=%JAXB_LIBS%\jaxb-api.jar;
%JAXB_LIBS%\jaxb-ri.jar;
%JAXB_LIBS%\jaxb-xjc.jar;
%JAXB_LIBS%\jaxb-libs.jar;
%JAXP_LIBS%\jaxb-api.jar;
%JAXP_LIBS%\endorsed\xercesImpl.jar;
%JAXP_LIBS%\endorsed\xalan.jar;
%JAXP_LIBS%\endorsed\sax.jar;
%JAXP_LIBS%\endorsed\dom.jar;
%JWSDP_LIBS%\jax-qname.jar;
%JWSDP_LIBS%\namespace.jar;.

上面的行分隔符只是为了读起来方便,另外要保证每一行都有一个CLASSPATH

4. 改成所需示例应用的目录。

例如,为了运行示例应用1

cd %JAXB_HOME%\examples\users-guide\SampleApp1

5. 利用xjc.bat命令来从源XML模式中生成JAXB Java类。

%JAXB_HOME%\bin\xjc.bat po.xsd -p primer.po

Po.xsd是源XML模式的名称。-p primer.po开关告诉JAXB编译器将生成的类放入名为primer.poJava包中。在本例中,包的名称必须为primer.po。在JAXB编译器选项中可以找到JAXB绑定编译器选项的完整列表。

6. 为使用Javadoc工具的应用生成API文档(可选的)。

%JAVA_HOME%\bin\javadoc -package primer.po -sourcepath .
-d docs\api -windowtitle "Generated Interfaces for po.xsd"

7. 编译模式派生的JAXB Java类。

%JAVA_HOME%\bin\javac Main.java primer\po\*.java
primer\po\impl\*.java

8. 运行Main类。

%JAVA_HOME%\bin\java Main

 

Po.xml文件被反编组到一个Java内容树中,并且该内容树中的XML数据被写成System.out

关于模式和Java的绑定中描述了模式派生的JAXB类以及它们如何被绑定到源模式中。而基本示例应用中则分析了用于在各个基本应用中创建和处理Java内容树的方法。

利用Ant配置和运行示例应用

各个示例应用目录中包含的build.xml文件是一个Ant项目文件。Apache Ant编译工具和Java Web服务开发者工具包包含在一起,可以使用该项目来自动完成手动配置和运行示例应用中列出的步骤。特别的,使用Ant以及包含的build.xml项目文件需要按照以下步骤操作:

1.       更新CLASSPATH以包含必需的模式派生的JAXB类。

2.       运行JAXB绑定编译器来从XML源模式po.xsd中生成JAXB Java类,并将这些类放入一个名为primer.po的包中。

3.       从使用Javadoc工具的模式派生的JAXB类中生成API文档。

4.       编译模式派生的JAXB类。

5.       运行示例应用的Main类。

正如前面讲过的那样,建议你至少要熟悉在第一个示例应用中手动完成这些步骤的步骤。

Solaris/Linux

1. 设置环境变量:

export JAVA_HOME=<your J2SE installation directory>
export JWSDP_HOME=<your JWSDP1.1 installation directory>
export JAXB_HOME=$JWSDP_HOME/jaxb-1.0
export ANT_HOME=$JWSDP_HOME/jakarta-ant-1.5.1

2. 设置PATH

export PATH=$JAXB_HOME/bin:$JWSDP_HOME/jwsdp-shared/bin:$PATH 

3. 改为所需示例应用的目录。

例如,为了运行示例应用1

cd $JAXB_HOME/examples/users-guide/SampleApp1

4. 运行Ant

$ANT_HOME/bin/ant -emacs

5. 为每个示例应用重复上面的步骤。

Windows NT/2000/XP

1. 设置环境变量:

set JAVA_HOME=<your J2SE installation directory>
set JWSDP_HOME=<your JWSDP1.1 installation directory>
set JAXB_HOME=%JWSDP_HOME%\jaxb-1.0