本作品採用知識共享署名-非商業性使用-相同方式共享 2.5 中國大陸許可協議進行許可。
JAXB(Java Architecture for XML Binding)是一種特殊的序列化/反序列化工具。它可以使XML數據以Java Objects的形式直接應用於Java程序之中,使Java Objects與XML數據之間的轉換成爲可能。在JAXB中將Java Objects到XML數據的轉換稱爲marshal;XML數據到Java Objects的轉換稱爲unmarshal。
如圖所示,使用JAXB分兩步,首先利用xjc命令行程序編譯DTD或Schema文件生成與XML數據結構相對應的JavaBeans類,再通過JAXB API中的marshal與unmarshal操作完成JavaBeans對象與XML數據之間的互換。
JAXB使用了最新的元數據技術,故而只能在JDK 1.5以上版本使用,JAXB的官方網站如下:
https://jaxb.dev.java.net/
可以在其中下載到最新的JAXB。安裝之後的JAXB目錄結構如下:
/JAXB-HOME(path/to/jaxb)
/bin
/lib
/docs
在bin目錄中有所有的JAXB工具,其中包括xjc命令行程序;在lib目錄中可以找到所有JAXB的jar包;在docs目錄中有一個JAXB的使用幫助及API說明。
一. xjc使用幫助
1. 通過命令行編譯
命令行程序xjc用於編譯DTD或Schema生成與XML數據結構對應的JavaBeans類。操作方法如下:
xjc [-xmlschema|-dtd] [–d 保存java文件的目錄] [–p java文件所在的包] <編譯文件>
-xmlschema 指定編譯文件的格式爲Schema格式,此參數是默認值,可以不用提供。
如果不提供此參數,編譯文件必須是Schema文件。
-dtd 指定編譯文件的格式爲DTD格式,如果編譯文件是DTD文件則必須提供此參數。
-d 指定了保存java文件的目錄
-p 指定了生成的java文件所在的包
例如編譯當前目錄下的schema.xls文件,java文件保存在src目錄,包名爲generate,其命令如下:
xjc –d src –p generate schema.xsd
如果編譯文件是schema.dta,則命令如下:
xjc –dtd –d src –p generate schema.dtd
2. 通過ANT編譯
在/JAXB-HOME/lib目錄中的jaxb-xjc.jar包中包含了XJCTask.class文件,可以依據該類定義一個ant task,通過執行該task生成java文件,task的定義如下:
<taskdef name="xjc" classname="com.sun.tools.xjc.XJCTask">
<classpath>
<fileset dir="${JAXB-HOME}/lib" includes="*.jar" />
</classpath>
</taskdef>
執行xjc task的ant代碼樣例如下:
<target name="generate" description="generate Java source files">
<echo message="generate java from schema..." />
<mkdir dir="src" />
<xjc schema="books.xsd" package="com.chris.jaxb" destdir="gen-src">
<produces dir="src/com/chris/jaxb " includes="**/*.java" />
</xjc>
</target>
其中
schema 指定DTD或Schema文件的位置;
destdir 指定生成的java文件所保存的根目錄;
package 指定生成的java文件所在的包;
args 指定額外的參數,其中最重要的參數是“-dtd”,如果schema指定的是一個DTD文件,則args中必須提供“-dtd”;
produces 用於在指定目錄中檢查最新版本。
二. 序列化(Marshalling)與反序列化(Unmarshalling)
要想在Java程序中使用JAXB,必須用到以下幾個jar包:
jaxb-api.jar
jaxb-impl.jar
activation.jar
jsr173_1.0_api.jar
以上包均在/JAXB-HOME/lib目錄中可以找到。
JAXB的核心類是JAXBContext類,該類可以根據一個包名或一個類名加載Java Objects。
使用包名加載Java Objects的樣例如:
JAXBContext jc = JAXBContext.newInstance("generate");
其指定的包中必須包含ObjectFactory類,該類由xjc生成,用於生成XML數據所對應的Java Objects。
如果使用類名加載Java Object,例如:
JAXBContext jc = JAXBContext.newInstance(ObjectFactory.class);
其指定的類必須是用於生成Java Objects的工廠類,如ObjectFactory類。
爲了方便使用,下面的代碼封裝了JAXB相關類,樣例以包名加載方式爲主,提供了基本的marshal與unmarshal操作。
使用這個工具類非常簡單,代碼如下: