[文章摘要] XMLBeans是Bea公司的一個項目,用于訪問和處理xml數(shù)據(jù)和文檔。使用XMLBeans可以讓您用面向?qū)ο蟮挠^點來對待和處理xml數(shù)據(jù)和文檔,同時又可以忠實于該xml數(shù)據(jù)對應的xml結(jié)構(gòu)和schema。本文中作者簡單的介紹了XMLBeans,并且給出了一個簡單的例子,詳細的演示了如何配置XMLBeans使它正常運行的全部過程。
關鍵詞: XMLBeans 訪問 XML XMLBeans來自于Bea,是使用java技術訪問和處理XML數(shù)據(jù)和文檔技術的一次突破性進展。第一次,開發(fā)者可以用自己熟悉的、方便的、面向?qū)ο蟮囊晥D來看待XML數(shù)據(jù),同時又可以訪問該xml數(shù)據(jù)對應的xml結(jié)構(gòu)和schema。 ――來自于Bea的關于XMLBeans的介紹 XMLBeans是Bea公司針對XML處理的一個項目,現(xiàn)在已經(jīng)提供免費下載和使用,目前的最新版本是1.0。 1 為什么使用XMLBeans在XMLBeans之前,我們訪問xml數(shù)據(jù)和文檔有兩種選擇: 1. 使用DOM、SAX來訪問XML數(shù)據(jù)和文檔的內(nèi)容 2. 使用JAXB等技術將XML映射為java類 不管你使用哪一種,你都無法完整的訪問該XML數(shù)據(jù)和對象的豐富內(nèi)容和Schema信息。產(chǎn)生的原因是因為java數(shù)據(jù)模型和XML之間不匹配造成的,所以應用中你要不就選擇了可擴展性,要不就只能選擇系統(tǒng)的強壯性。 隨著XMLBeans的出現(xiàn),我們不需要再采取這種折衷的措施了。XMLBeans提供了更多的特性來訪問XML數(shù)據(jù)和文檔: 1. XMLBeans是基于標記流,因此可以輕松的使用指針在xml數(shù)據(jù)和文檔之間導航。指針接口適用于所有xml數(shù)據(jù)和文檔。 2. 如果你的xml數(shù)據(jù)和文檔有一個schema的話,XMLBeans將給您生成這些XML數(shù)據(jù)和文檔的java類“視圖”(也就是訪問這些XML數(shù)據(jù)和文檔的java代碼)。 3. 開發(fā)者可以使用這些java代碼輕松的讀/寫xml數(shù)據(jù)和文檔,而且被強制的執(zhí)行xml schema中規(guī)定的一些約束。 4. java類“視圖”都能夠忠實的表述原始xml數(shù)據(jù)和文檔的內(nèi)容,因為java類“視圖”都是基于受保護的、最基本的xml表現(xiàn)。 所以使用XMLBeans來訪問xml 數(shù)據(jù)和文檔的好處是顯而易見的: 1. 完全使用面向?qū)ο蟮挠^點來看待和處理數(shù)據(jù)和文檔 2. 開發(fā)者不再需要編寫大量的代碼來訪問XML數(shù)據(jù)和文檔 3. 可以使用schema中規(guī)定的對于數(shù)據(jù)的約束條件,而不需要自己去編寫實現(xiàn)這些約束的代碼 4. 不需要解析所有的xml數(shù)據(jù)和文檔而僅僅是為了訪問其中的某個數(shù)據(jù)項 關于XMLBeans更詳細的情況請大家訪問http://dev2dev./technologies/xmlbeans/ 2 環(huán)境和工具準備XMLBeans中的大量工作使用了Ant工具,所以再開始工作之前請下載Ant工具并使它正常運行。 XMLBeans的java實現(xiàn)請大家到bea的網(wǎng)站上下載:http://dev2dev./technologies/xmlbeans/index.jsp 在執(zhí)行過程中,還需要用訪問xml的dom組件,也就是xml-apis.jar文件,可到http://xml./xerces2-j/index.html下載。附件中的test-XMLBeans.rar文件中也有這個jar文件。 3 第一個例子3.1 實例說明我們這里使用一個訂單的例子,他的實例文檔如下: <po:purchase-order xmlns:po=" http://vivianj.go./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來描述這個實例文檔: <xs:schema xmlns:xs="http://www./2001/XMLSchema" xmlns:po="http://vivianj.go./easypo" targetNamespace="http://vivianj.go./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é)將詳細的介紹這部分內(nèi)容 3.2 ant輔助生成訪問XML數(shù)據(jù)的java代碼3.2.1 外部jar文件在使用XMLBeans生成訪問XML數(shù)據(jù)的java代碼時,我們需要用到xbean.jar文件,下載的XMLBeans里面有這個文件。 3.2.2 增加的taskdef編譯腳本執(zhí)行時候必須增加一個XMLBean的taskdef,內(nèi)容如下: <taskdef name="xmlbean" classname="com.bea.xbean.tool.XMLBean" classpath="path/to/xbean.jar"/> 3.2.3 xmlbean使用xmlbean標簽來生成訪問xml數(shù)據(jù)的java代碼,簡單的例子如下: <xmlbean schema="schemas" destfile="Schemas.jar"/> <xmlbean schema="schemas/easypo.xsd" destfile="Schemas.jar" srcgendir="." /> 第一個例子表示為schemas下面所有的*.xsd文件生成訪問代碼,將所有的代碼編譯好后放入Schemas.jar文件中。 第二個例子表示為schemas下面所有的easypo.xsd文件生成訪問代碼,將所有的代碼編譯好后放入Schemas.jar文件中,而且將生成的。Java文件放在當前目錄下。 其中的參數(shù)簡單的說明如下: xmlbean 標簽表示這是要生成指定schema文件的訪問代碼。 Schema 屬性表示要生成訪問代碼的xsd文件的范圍,可以是一個目錄,也可以 是一個文件或者使用fileset進行定義。 Destfile 屬性定義了被生成的代碼編譯后將放在那個文件中。 Rcgendir 屬性則表示生成的。Java文件將放在那個目錄中。 Xmlbean標簽支持的其它參數(shù)和相關的說明請參考XMLBeans的幫助文檔,這里不作過多的說明。 3.2.4 實際的build.xml<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> 3.2.5 生成jar文件現(xiàn)在你可以進入build.xml文件所在的目錄,執(zhí)行ant -f build.xml來生成所有訪問該easypo.xml的代碼。 執(zhí)行完以后,這個目錄下面會多出一個Schemas.jar文件,他包含了所有被生成和編譯了的、訪問xml文檔的.class文件。目錄下面會多出一個net目錄,他的子目錄下包含了所有被生成的.java文件.實際的jar文件構(gòu)成請大家參考作者提供的Schemas.jar文件. 4 測試一下4.1 測試代碼好了,現(xiàn)在我們來寫個例子,測試一下是否可以成功的訪問xml數(shù)據(jù).完整的代碼請參看 //解析xml實例文檔,他的參數(shù)poFile是一個file類型的參數(shù) //所以需要我們將3.1的實例文檔保存為一個.xml文檔 PurchaseOrderDocument poDoc = PurchaseOrderDocument.Factory.parse(poFile); //創(chuàng)建一個訪問該xml實例文檔的接口PurchaseOrder /**[注] 讓作者感到很意外的是,bea提供的例子代碼中這段的定義是這樣的: *PurchaseOrder po = poDoc.getPurchaseOrder(); *也就是說PurchaseOrder這個接口應該是一個單獨的類,但是作者查看XMLBeans *最后生成的.java文件中,這個PurchaseOrder卻是作為PurchaseOrderDocument的一 *個內(nèi)部類出現(xiàn)的 */ PurchaseOrderDocument.PurchaseOrder po = poDoc.getPurchaseOrder(); //直接過去其中的所有lineitem子元素的所有內(nèi)容,他返回一個lineitem對象的數(shù)組. LineItem[] lineitems = po.getLineItemArray(); System.out.println("Purchase order has " + lineitems.length + " line items."); double totalAmount = 0.0; int numberOfItems = 0; //直接使用對應的get方法來獲取對應屬性的值 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); 4.2 測試結(jié)果運行這段代碼,應該在控制臺打印如下信息: 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 5 總結(jié)XMLBeans是Bea公司的一個公開源代碼項目,以Schema為基礎建立的、訪問xml的一種解決方法,提供了訪問和處理xml數(shù)據(jù)和文檔時既可以完全的訪問xml的內(nèi)容、又不丟失xml的schema信息的強大功能。使用XMLBeans可以讓您用面向?qū)ο蟮挠^點來對待和處理xml數(shù)據(jù)和文檔,同時又可以忠實于該xml數(shù)據(jù)對應的xml結(jié)構(gòu)和schema。 本文中作者簡單的介紹了XMLBeans,并且給出了一個簡單的例子,詳細的演示了如何配置XMLBeans,如何使用他的ant擴展輔助生成訪問xml的java代碼,如何編寫客戶端來測試該段代碼是否成功執(zhí)行的全過程。希望能夠讓大家掌握如何使用XMLBeans來簡化各自的開發(fā)工作、提高自己的開發(fā)速度。XMLBeans的高級應用將在接下來的文章中介紹。 參考資料: 1. ANT的幫助 http://ant./ 2. XMLBeans的幫助 http://dev2dev./technologies/xmlbeans/ 工具下載: 1. ANT工具下載 http://archive./dist/ant/binaries/ 2. XMLBeans下載 http://dev2dev./technologies/xmlbeans/ 作者的所有工作文件: test-XMLBeans.rar 作者信息: 姓名: 肖菁 聯(lián)系方式: 0731-6665772,jing.xiao.com 簡介: 作者目前是湖南省長沙鐵道學院科創(chuàng)計算機系統(tǒng)集成有限公司軟件中心軟件工程師,IBM developerworks/BEA dev2dev撰稿人,主要研究J2EE編程技術、Web Service技術以及他們在websphere、weblogic、apache平臺上的實現(xiàn),擁有IBM 的 Developing With Websphere Studio證書。歡迎大家訪問作者的個人網(wǎng)站: vivianj.go. |
|
來自: smoking_boy > 《我的圖書館》