今天在開發(fā)rest接口,要使用jaxb從對象生成xml返回給客戶端。由于是中途介入,jaxb已經(jīng)被人成功地引入到了我們的web項(xiàng)目中,所以在只里之是想說下如何從xml生成jaxb需要的java對象。
1.第一步:通常我們會跟客戶端程序定義好傳輸數(shù)據(jù)xml,如
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user>
<name>小李</name>
<sex>男</sex>
<age>24</age>
</user>
<user>
<name>小麗</name>
<sex>女</sex>
<age>18</age>
</user>
<user>
<name>小王</name>
<sex>男</sex>
<age>22</age>
</user>
</users>
2.第二步:可以通過一些外部工具生成xml的Schema文檔
這里推薦兩個網(wǎng)址供大家參考:
http://www.xmlforasp.net/CodeBank/System_Xml_Schema/BuildSchema/BuildXMLSchema.aspx
http://www.dotkam.com/2008/05/28/generate-xsd-from-xml/
<?xml version="1.0" encoding="utf-16"?>
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="users" type="usersType" />
<xsd:complexType name="usersType">
<xsd:sequence>
<xsd:element maxOccurs="unbounded" name="user" type="userType" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="userType">
<xsd:sequence>
<xsd:element name="name" type="xsd:string" />
<xsd:element name="sex" type="xsd:string" />
<xsd:element name="age" type="xsd:int" />
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
3.第三步:利用JAXB工具包(http://www.oracle.com/technetwork/java/index-jsp-136025.html),讓它來替我們生成操縱符合這個Schema規(guī)定的所有XML實(shí)例文檔的所有Java源代碼
如果已經(jīng)設(shè)置好了環(huán)境變量的話,那么只需要運(yùn)行JAXB包所帶的“xjc”運(yùn)行程序,例如
%JAXB_HOME%\bin\xjc.bat userSchema.xsd -d src -p primer.userinfo
其中:
A. %JAXB_HOME%是你安裝JAXB工具包的位置,通常在jwsdp工具包的子目錄下。
B. userSchema.xsd 是Schema的文件名,一般以xsd作為文件名的后綴。
C. -d 的選項(xiàng),是指定系統(tǒng)生成的Java源代碼所放置的目錄,示例中為:src
D. -p 的選項(xiàng),是指定系統(tǒng)生成的Java源代碼所在的Java Package的名稱,示例中為:primer.userinfo
E. 還有更多的選項(xiàng),請參考JAXB的相關(guān)文檔。
如果運(yùn)行成功的話,就會在你"-d"選項(xiàng)指定的目錄下產(chǎn)生一些java代碼文件
注意:現(xiàn)在JDK1.6的bin目錄下已經(jīng)帶有xjc.exe,直接使用就行了。我一開始還下了那個工具包,結(jié)果報(bào)"but found class javax.xml.bind.annotation.AccessType"的異常,定位了半天說是版本沖突。所以說1.6的jdk就直接運(yùn)行就行了,1.5的話才下那個東東
4.第四步 在應(yīng)用程序中使用這些代碼
下面我們分析一下如何在我們的應(yīng)用程序中使用JAXB工具包替我們生成的代碼。
1) JAXBContext 提供了一個入口,通過這個入口可以管理必要的XML/Java綁定信息。客戶端應(yīng)用程序通過newInstance(contextPath)方法得到該類的新實(shí)例。contextPath 參數(shù)包含一個或多個Java包名,這些Java包就是了JAXB編譯器所產(chǎn)生的接口代碼所在的Java包。該參數(shù)值初始化JAXBContext 對象,使得它能夠管理JAXB編譯器產(chǎn)生的接口。
JAXBContext jc = JAXBContext.newInstance("primer.userinfo");
2) 而通過ObjectFactory,可以直接生成根節(jié)點(diǎn)java對象Users 和子對象User。
User userA = objFactory.createUser();
Users users = objFactory.createUsers();
3) 對于Marshaller和Unmarshaller,這兩個對象主要是用于Java對象和XML文檔互相轉(zhuǎn)換的主要接口(Marshaller負(fù)責(zé)從Java對象到XML文檔的轉(zhuǎn)換,Unmarshaller負(fù)責(zé)從XML文檔到Java對象的轉(zhuǎn)換)。
JAXBElement usersE = objFactory.createUsers(users);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.marshal( usersE,new FileOutputStream("src/test.xml"));
Marshaller能把Users 對象轉(zhuǎn)換成XML文件
JAXBElement usersE = (JAXBElement)jc.createUnmarshaller().unmarshal(new File("src/test.xml"));
Users users = (Users)usersE.getValue();
Unmarshaller能把 XML文件轉(zhuǎn)換成Users對象