1、準(zhǔn)備工作 (1) 下載xmlbeans-2.3.0
解壓后的目錄結(jié)構(gòu)如下:
xmlbeans-2.3.0
+----bin:常用的命令
+----docs
+----lib:使用xmlbeans必要的jar包
+----samples
+----schemas
(2) 配置環(huán)境變量
增加系統(tǒng)環(huán)境變量JAVA_HOME(D:/ProgramFile/Java/jdk1.5.0_07)XMLBEANS_HOME(D:/xmlbeans-2.3.0),并在path變量后增加D:/xmlbeans-2.3.0/bin和D:/ProgramFile/Java/jdk1.5.0_07/bin
2、準(zhǔn)備XML Schema文件
XML Schema文件(后綴為.xsd)是一個(gè)XML的約束文件,它定義了XML文件的結(jié)構(gòu)和元素以及對元素和結(jié)構(gòu)的約束。XMLBean需要通過這個(gè)文件知道一個(gè)XML文件的結(jié)構(gòu)以及約束,比如數(shù)據(jù)類型等。利用這個(gè)Schema文件,XMLBean將會產(chǎn)生一系列相關(guān)的Java Classes來實(shí)現(xiàn)對XML的操作。而作為開發(fā)人員,則是利用XMLBean產(chǎn)生的Java Classes來完成對XML的操作。
在本項(xiàng)目中,Schema文件由設(shè)計(jì)人員利用XMLSPY生成并提供給開發(fā)人員。
3、Xmlbeans生成jar和class文件
(1) 手寫xsd配置文件
xsd配置文件(后綴為. xsdconfig)這個(gè)文件主要用來制定生成的Java Class的一些文件名規(guī)則和Package的名稱。Xsdconfig文件的示例如下:
<xb:config xmlns:xb="http://xml.apache.org/xmlbeans/2004/02/xbean/config">
<xb:namespace uri="http://www.cattsoft.com/ wscrm">
<xb:package>com.cattsoft. wscrm</xb:package>
</xb:namespace>
</xb:config>
寫好改文件后將其保存為wscrm.xsdconfig,并將該文件和wsd文件一起放到schema文件夾中并放到xmlbeans的根目錄下。
以后可以根據(jù)需要修改namespace和package。
注:namespace 后面跟著一個(gè) url的attribute。 如果不加這個(gè) attribute,同樣也會生成xml bean文件,只不過生成的jar文件中會多一層xmlbean的package 。
(2) 手寫運(yùn)行腳本
Xmlbeans
提供的一個(gè)編譯工具(scomp命令),它在bin的目錄下。通過這個(gè)工具,我們可以將Schema文件生成Java Classess。但是為了避免使用命令行窗口的麻煩,我們手寫一個(gè)運(yùn)行腳本(run.bat)如下所示:set XMLBEANS_HOME=D:/xmlbeans-2.3.0
set XMLBEANS_LIB=D:/xmlbeans-2.3.0/lib
scomp -src build/src -out build/wscrm.jar schema/*.xsd -compiler D:/ProgramFile/bea/jdk142_05/bin/javac schema/wscrm.xsdconfig
該腳本的含義是:告訴scomp生成wscrm.jar,放在build目錄下,同時(shí)生成源代碼放在build/src下, Schema文件是schema文件夾下的所有.xsd,xsdconfig文件是schema/wscrm.xsdconfig。文件
可以將該文件也放到bin目錄下,以后如果生成同一個(gè)jar文件可以直接運(yùn)行run.bat。如果生成一個(gè)新的jar需要根據(jù)生成jar包名稱、xsd文件的位置、xsdconfig文件位置等修改該運(yùn)行腳本。
附:scomp的語法如下:
scomp [options] [dirs]* [schemaFile.xsd]* [service.wsdl]* [config.xsdconfig]*
主要參數(shù)說明:
-src [dir]-- 生成的Java Classes存放目錄
-srconly-- 不編譯Java Classes,不產(chǎn)生Jar文件
-out [jarFileName] -- 生成的Jar文件,缺省是xmltypes.jar
-compiler-- Java編譯器的路徑,即Javac的位置
schemaFile.xsd-- XML Schema文件位置
config.xsdconfig-- xsdconfig文件的位置。
(3) 運(yùn)行腳本
運(yùn)行run.bat其實(shí), 在xmlbeans的根目錄下會生成一個(gè)build目錄,該目錄中即保存了生成的Java源代碼和jar包。實(shí)際上生成的Java源代碼沒有多大作用,我們要的是jar文件。對于其中的每個(gè)wsd文件在jar包中都會存在一個(gè)根節(jié)點(diǎn)(該XML文檔的Java Class映射),該根節(jié)點(diǎn)名字為XXXDocument。每個(gè)XXXDocument中每個(gè)element
4、Java程序中讀取/構(gòu)造xml
(1) 將xmlbeans/lib下的包和生成的jar包加入到Project的ClassPath中
(2) 寫XML文件
步驟簡要描述:
--XXXDocument.Factory.newInstance()得到XXXDocument的對象實(shí)例XXXDocument
--增加一個(gè)xs:complexType的節(jié)點(diǎn)用XXXDocument 的add方法,返回值類行為該復(fù)雜節(jié)點(diǎn)在xsd文件中定義的類型
--給一個(gè)復(fù)雜節(jié)點(diǎn)的簡單類型屬性賦值用該節(jié)點(diǎn)的set方法
--調(diào)用XXXDocument.toString()方法可以將該xml文件的按照字符串行式輸出
示例如下:
publicstatic String generateXML() throws IOException, XmlException{
CustomersDocument doc=CustomersDocument.Factory.newInstance();
CustomerType cust=doc.addNewCustomers().addNewCustomer();
cust.setId(1000);
cust.setGender("female");
cust.setFirstname("Sophia");
cust.setLastname("Lee");
cust.setPhoneNumber("123456");
AddressType address=cust.addNewAddress();
PrimaryAddressType pAddress=address.addNewPrimaryAddress();
pAddress.setPostalCode("100000");
pAddress.setAddressLine1("ABC");
pAddress.setAddressLine2("abc");
BillingAddressType bAddress=address.addNewBillingAddress();
bAddress.setAddressLine1("200000");
bAddress.setAddressLine1("XYZ");
bAddress.setAddressLine2("xyz");
String xmlDoc=doc.toString();
System.out.println("-------------------------------------");
System.out.println(xmlDoc);
System.out.println("--------------------------------------");
return xmlDoc;
}
(3) 讀XML文件
步驟簡要描述:
--XXXDocument.Factory.parse(xmlDoc)將xml文件的字符串作為輸入?yún)?shù)得到XXXDocument
--得到一個(gè)xs:complexType的節(jié)點(diǎn)用XXXDocument 的get方法,返回值類行為該復(fù)雜節(jié)點(diǎn)在xsd文件中定義的類型
--得到一個(gè)復(fù)雜節(jié)點(diǎn)的簡單類型屬性值用該節(jié)點(diǎn)的get方法
示例如下:
publicstaticvoid readXML(String xmlDoc) throws XmlException, IOException{
CustomersDocument doc=CustomersDocument.Factory.parse(xmlDoc);
CustomerType[] custs=doc.getCustomers().getCustomerArray();
for(int i=0;i<custs.length;i++){
CustomerType cust=(CustomerType)custs[i];
System.out.println("cust#"+i);
System.out.println("custId:"+cust.getId());
System.out.println("custGender:"+cust.getGender());
System.out.println("custFirstName:"+cust.getFirstname());
System.out.println("csutLastName:"+cust.getLastname());
System.out.println("custPhoneNumber:"+cust.getPhoneNumber());
AddressType address=cust.getAddress();
PrimaryAddressType pAddress=address.getPrimaryAddress();
System.out.println("PrimaryAddress:"+pAddress.getPostalCode()+"--"+pAddress.getAddressLine1()+"--"+pAddress.getAddressLine2());
BillingAddressType bAddress=address.getBillingAddress();
System.out.println("BillingAddress:"+bAddress.getPostalCode()+"--"+bAddress.getAddressLine1()+"--"+bAddress.getAddressLine2());
System.out.println("cust#"+i);
}
}