關(guān)鍵詞: XMLBeans 訪問 XML
XMLBeans來自于Bea,是使用java技術(shù)訪問和處理XML數(shù)據(jù)和文檔技術(shù)的一次突破性進(jìn)展。第一次,開發(fā)者可以用自己熟悉的、方便的、面向?qū)ο蟮囊晥D來看待XML數(shù)據(jù),同時(shí)又可以訪問該xml數(shù)據(jù)對(duì)應(yīng)的xml結(jié)構(gòu)和schema。
――來自于Bea的關(guān)于XMLBeans的介紹
XMLBeans是Bea公司針對(duì)XML處理的一個(gè)項(xiàng)目,現(xiàn)在已經(jīng)提供免費(fèi)下載和使用,目前的最新版本是1.0。
在XMLBeans之前,我們?cè)L問xml數(shù)據(jù)和文檔有兩種選擇:
1. 使用DOM、SAX來訪問XML數(shù)據(jù)和文檔的內(nèi)容
2. 使用JAXB等技術(shù)將XML映射為java類
不管你使用哪一種,你都無法完整的訪問該XML數(shù)據(jù)和對(duì)象的豐富內(nèi)容和Schema信息。產(chǎn)生的原因是因?yàn)?/span>java數(shù)據(jù)模型和XML之間不匹配造成的,所以應(yīng)用中你要不就選擇了可擴(kuò)展性,要不就只能選擇系統(tǒng)的強(qiáng)壯性。
隨著XMLBeans的出現(xiàn),我們不需要再采取這種折衷的措施了。XMLBeans提供了更多的特性來訪問XML數(shù)據(jù)和文檔:
1. XMLBeans是基于標(biāo)記流,因此可以輕松的使用指針在xml數(shù)據(jù)和文檔之間導(dǎo)航。指針接口適用于所有xml數(shù)據(jù)和文檔。
2. 如果你的xml數(shù)據(jù)和文檔有一個(gè)schema的話,XMLBeans將給您生成這些XML數(shù)據(jù)和文檔的java類“視圖”(也就是訪問這些XML數(shù)據(jù)和文檔的java代碼)。
3. 開發(fā)者可以使用這些java代碼輕松的讀/寫xml數(shù)據(jù)和文檔,而且被強(qiáng)制的執(zhí)行xml schema中規(guī)定的一些約束。
4. java類“視圖”都能夠忠實(shí)的表述原始xml數(shù)據(jù)和文檔的內(nèi)容,因?yàn)?/span>java類“視圖”都是基于受保護(hù)的、最基本的xml表現(xiàn)。
所以使用XMLBeans來訪問xml 數(shù)據(jù)和文檔的好處是顯而易見的:
1. 完全使用面向?qū)ο蟮挠^點(diǎn)來看待和處理數(shù)據(jù)和文檔
2. 開發(fā)者不再需要編寫大量的代碼來訪問XML數(shù)據(jù)和文檔
3. 可以使用schema中規(guī)定的對(duì)于數(shù)據(jù)的約束條件,而不需要自己去編寫實(shí)現(xiàn)這些約束的代碼
4. 不需要解析所有的xml數(shù)據(jù)和文檔而僅僅是為了訪問其中的某個(gè)數(shù)據(jù)項(xiàng)
關(guān)于XMLBeans更詳細(xì)的情況請(qǐng)大家訪問http://dev2dev.bea.com/technologies/xmlbeans/
XMLBeans中的大量工作使用了Ant工具,所以再開始工作之前請(qǐng)下載Ant工具并使它正常運(yùn)行。
XMLBeans的java實(shí)現(xiàn)請(qǐng)大家到bea的網(wǎng)站上下載:http://dev2dev.bea.com/technologies/xmlbeans/index.jsp
在執(zhí)行過程中,還需要用訪問xml的dom組件,也就是xml-apis.jar文件,可到http://xml.apache.org/xerces2-j/index.html下載。附件中的test-XMLBeans.rar文件中也有這個(gè)jar文件。
我們這里使用一個(gè)訂單的例子,他的實(shí)例文檔如下:
<po:purchase-order xmlns:po=" http://vivianj.go.nease.net/easypo ">
<po:customer>
<po:name>Gladys Kravitz</po:name>
<po:address>Anytown, PA</po:address>
</po:customer>
<po:date>2003-01-07T14:16:00-05:00</po:date>
<po:line-item>
<po:description>Burnham‘s Celestial Handbook, Vol 1</po:description>
<po:per-unit-ounces>5</po:per-unit-ounces>
<po:price>21.79</po:price>
<po:quantity>2</po:quantity>
</po:line-item>
<po:line-item>
<po:description>Burnham‘s Celestial Handbook, Vol 2</po:description>
<po:per-unit-ounces>5</po:per-unit-ounces>
<po:price>19.89</po:price>
<po:quantity>2</po:quantity>
</po:line-item>
<po:shipper>
<po:name>ZipShip</po:name>
<po:per-ounce-rate>0.74</po:per-ounce-rate>
</po:shipper>
</po:purchase-order>
我們使用下面的schema來描述這個(gè)實(shí)例文檔:
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:po="http://vivianj.go.nease.net/easypo"
targetNamespace="http://vivianj.go.nease.net/easypo"
elementFormDefault="qualified">
<xs:element name="purchase-order">
<xs:complexType>
<xs:sequence>
<xs:element name="customer" type="po:customer"/>
<xs:element name="date" type="xs:dateTime"/>
<xs:element name="line-item" type="po:line-item" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="shipper" type="po:shipper" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="customer">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
</xs:sequence>
<xs:attribute name="age" type="xs:int"/>
</xs:complexType>
<xs:complexType name="line-item">
<xs:sequence>
<xs:element name="description" type="xs:string"/>
<xs:element name="per-unit-ounces" type="xs:decimal"/>
<xs:element name="price" type="xs:decimal"/>
<xs:element name="quantity" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="shipper">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="per-ounce-rate" type="xs:decimal"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
現(xiàn)在,要訪問的xml數(shù)據(jù)已經(jīng)確定了,而且已經(jīng)用schema來描述他了,剩下的就是使用XMLBeans來輔助生成訪問XML數(shù)據(jù)的java代碼了,下面的章節(jié)將詳細(xì)的介紹這部分內(nèi)容
在使用XMLBeans生成訪問XML數(shù)據(jù)的java代碼時(shí),我們需要用到xbean.jar文件,下載的XMLBeans里面有這個(gè)文件。
編譯腳本執(zhí)行時(shí)候必須增加一個(gè)XMLBean的taskdef,內(nèi)容如下:
<taskdef name="xmlbean" classname="com.bea.xbean.tool.XMLBean" classpath="path/to/xbean.jar"/>
使用xmlbean標(biāo)簽來生成訪問xml數(shù)據(jù)的java代碼,簡(jiǎn)單的例子如下:
<xmlbean schema="schemas" destfile="Schemas.jar"/>
<xmlbean schema="schemas/easypo.xsd" destfile="Schemas.jar" srcgendir="." />
第一個(gè)例子表示為schemas下面所有的*.xsd文件生成訪問代碼,將所有的代碼編譯好后放入Schemas.jar文件中。
第二個(gè)例子表示為schemas下面所有的easypo.xsd文件生成訪問代碼,將所有的代碼編譯好后放入Schemas.jar文件中,而且將生成的。Java文件放在當(dāng)前目錄下。
其中的參數(shù)簡(jiǎn)單的說明如下:
xmlbean 標(biāo)簽表示這是要生成指定schema文件的訪問代碼。
Schema 屬性表示要生成訪問代碼的xsd文件的范圍,可以是一個(gè)目錄,也可以
是一個(gè)文件或者使用fileset進(jìn)行定義。
Destfile 屬性定義了被生成的代碼編譯后將放在那個(gè)文件中。
Rcgendir 屬性則表示生成的。Java文件將放在那個(gè)目錄中。
Xmlbean標(biāo)簽支持的其它參數(shù)和相關(guān)的說明請(qǐng)參考XMLBeans的幫助文檔,這里不作過多的說明。
<project name="MyProject" default="compile" basedir=".">
<property name="src" value="."/>
<property name="build" value="build"/>
<property name="dist" value="dist"/>
<property name="classpath" value="./xkit/lib/xbean.jar "/>
<target name="init">
<!-- Create the build directory structure used by compile -->
<mkdir dir=""/>
</target>
<target name="compile" depends="init">
<!-- Compile the java code from into -->
<taskdef name="xmlbean" classname="com.bea.xbean.tool.XMLBean" classpath=""/>
<xmlbean schema="schemas/easypo.xsd" classpath="" destfile="easypo.jar" srcgendir=""/>
</target>
</project>
現(xiàn)在你可以進(jìn)入build.xml文件所在的目錄,執(zhí)行ant -f build.xml來生成所有訪問該easypo.xml的代碼。
執(zhí)行完以后,這個(gè)目錄下面會(huì)多出一個(gè)Schemas.jar文件,他包含了所有被生成和編譯了的、訪問xml文檔的.class文件。目錄下面會(huì)多出一個(gè)net目錄,他的子目錄下包含了所有被生成的.java文件.實(shí)際的jar文件構(gòu)成請(qǐng)大家參考作者提供的Schemas.jar文件.
好了,現(xiàn)在我們來寫個(gè)例子,測(cè)試一下是否可以成功的訪問xml數(shù)據(jù).完整的代碼請(qǐng)參看
//解析xml實(shí)例文檔,他的參數(shù)poFile是一個(gè)file類型的參數(shù)
//所以需要我們將3.1的實(shí)例文檔保存為一個(gè).xml文檔
PurchaseOrderDocument poDoc =
PurchaseOrderDocument.Factory.parse(poFile);
//創(chuàng)建一個(gè)訪問該xml實(shí)例文檔的接口PurchaseOrder
/**[注] 讓作者感到很意外的是,bea提供的例子代碼中這段的定義是這樣的:
*PurchaseOrder po = poDoc.getPurchaseOrder();
*也就是說PurchaseOrder這個(gè)接口應(yīng)該是一個(gè)單獨(dú)的類,但是作者查看XMLBeans
*最后生成的.java文件中,這個(gè)PurchaseOrder卻是作為PurchaseOrderDocument的一
*個(gè)內(nèi)部類出現(xiàn)的
*/
PurchaseOrderDocument.PurchaseOrder po = poDoc.getPurchaseOrder();
//直接過去其中的所有lineitem子元素的所有內(nèi)容,他返回一個(gè)lineitem對(duì)象的數(shù)組.
LineItem[] lineitems = po.getLineItemArray();
System.out.println("Purchase order has " + lineitems.length + " line items.");
double totalAmount = 0.0;
int numberOfItems = 0;
//直接使用對(duì)應(yīng)的get方法來獲取對(duì)應(yīng)屬性的值
for (int j = 0; j < lineitems.length; j++)
{
System.out.println(" Line item: " + j);
System.out.println(
" Description: " + lineitems[j].getDescription());
System.out.println(" Quantity: " + lineitems[j].getQuantity());
System.out.println(" Price: " + lineitems[j].getPrice());
numberOfItems += lineitems[j].getQuantity().intValue();
totalAmount += lineitems[j].getPrice().doubleValue() * lineitems[j].getQuantity().doubleValue();
}
System.out.println("Total items: " + numberOfItems);
System.out.println("Total amount: " + totalAmount);
運(yùn)行這段代碼,應(yīng)該在控制臺(tái)打印如下信息:
Purchase order has 3 line items.
Line item 0
Description: Burnham‘s Celestial Handbook, Vol 1
Quantity: 2
Price: 21.79
Line item 1
Description: Burnham‘s Celestial Handbook, Vol 2
Quantity: 2
Price: 19.89
Total items: 4
Total amount: 41.68
XMLBeans是Bea公司的一個(gè)公開源代碼項(xiàng)目,以Schema為基礎(chǔ)建立的、訪問xml的一種解決方法,提供了訪問和處理xml數(shù)據(jù)和文檔時(shí)既可以完全的訪問xml的內(nèi)容、又不丟失xml的schema信息的強(qiáng)大功能。使用XMLBeans可以讓您用面向?qū)ο蟮挠^點(diǎn)來對(duì)待和處理xml數(shù)據(jù)和文檔,同時(shí)又可以忠實(shí)于該xml數(shù)據(jù)對(duì)應(yīng)的xml結(jié)構(gòu)和schema。
本文中作者簡(jiǎn)單的介紹了XMLBeans,并且給出了一個(gè)簡(jiǎn)單的例子,詳細(xì)的演示了如何配置XMLBeans,如何使用他的ant擴(kuò)展輔助生成訪問xml的java代碼,如何編寫客戶端來測(cè)試該段代碼是否成功執(zhí)行的全過程。希望能夠讓大家掌握如何使用XMLBeans來簡(jiǎn)化各自的開發(fā)工作、提高自己的開發(fā)速度。XMLBeans的高級(jí)應(yīng)用將在接下來的文章中介紹。
參考資料:
1. ANT的幫助 http://ant.apache.org/
2. XMLBeans的幫助 http://dev2dev.bea.com/technologies/xmlbeans/
工具下載:
1. ANT工具下載 http://archive.apache.org/dist/ant/binaries/
2. XMLBeans下載 http://dev2dev.bea.com/technologies/xmlbeans/
作者的所有工作文件: test-XMLBeans.rar
作者信息:
姓名: 肖菁
聯(lián)系方式: 0731-6665772,jing.xiao.com
簡(jiǎn)介: 作者目前是湖南省長(zhǎng)沙鐵道學(xué)院科創(chuàng)計(jì)算機(jī)系統(tǒng)集成有限公司軟件中心軟件工程師,IBM developerworks/BEA dev2dev撰稿人,主要研究J2EE編程技術(shù)、Web Service技術(shù)以及他們?cè)?/span>websphere、weblogic、apache平臺(tái)上的實(shí)現(xiàn),擁有IBM 的 Developing With Websphere Studio證書。歡迎大家訪問作者的個(gè)人網(wǎng)站: vivianj.go.nease.net
聯(lián)系客服