posts - 7, comments - 2, trackbacks - 0, articles - 6
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理
          XMLBeans是Bea公司的一個項目,用于訪問和處理數據和文檔。使用XMLBeans可以讓您用面向對象的觀點來對待和處理xml數據和文檔,同時又可以忠實于該xml數據對應的xml結構和schema。本文中作者簡單的介紹了XMLBeans,并且給出了一個簡單的例子,詳細的演示了如何配置XMLBeans使它正常運行的全部過程。

           

          XMLBeans來自于Bea,是使用java技術訪問和處理XML數據和文檔技術的一次突破性進展。第一次,開發者可以用自己熟悉的、方便的、面向對象的視圖來看待XML數據,同時又可以訪問該數據對應的結構和schema。                                 ――來自于Bea的關于XMLBeans的介紹

          XMLBeansBea公司針對XML處理的一個項目,現在已經提供免費下載和使用,目前的最新版本是1.0

          1 為什么使用XMLBeans

          XMLBeans之前,我們訪問xml數據和文檔有兩種選擇:

          1. 使用DOMSAX來訪問XML數據和文檔的內容

          2. 使用JAXB等技術將XML映射為java

          不管你使用哪一種,你都無法完整的訪問該XML數據和對象的豐富內容和Schema信息。產生的原因是因為java數據模型和XML之間不匹配造成的,所以應用中你要不就選擇了可擴展性,要不就只能選擇系統的強壯性。

          隨著XMLBeans的出現,我們不需要再采取這種折衷的措施了。XMLBeans提供了更多的特性來訪問XML數據和文檔:

          1.   XMLBeans是基于標記流,因此可以輕松的使用指針在xml數據和文檔之間導航。指針接口適用于所有xml數據和文檔。

          2.   如果你的xml數據和文檔有一個schema的話,XMLBeans將給您生成這些XML數據和文檔的java類“視圖”(也就是訪問這些XML數據和文檔的java代碼)。

          3.   開發者可以使用這些java代碼輕松的讀/寫xml數據和文檔,而且被強制的執行xml schema中規定的一些約束。

          4.   java類“視圖”都能夠忠實的表述原始xml數據和文檔的內容,因為java類“視圖”都是基于受保護的、最基本的xml表現。

          所以使用XMLBeans來訪問xml 數據和文檔的好處是顯而易見的:

          1.   完全使用面向對象的觀點來看待和處理數據和文檔

          2.   開發者不再需要編寫大量的代碼來訪問XML數據和文檔

          3.   可以使用schema中規定的對于數據的約束條件,而不需要自己去編寫實現這些約束的代碼

          4.   不需要解析所有的xml數據和文檔而僅僅是為了訪問其中的某個數據項

          關于XMLBeans更詳細的情況請大家訪問http://dev2dev.bea.com/technologies/xmlbeans/

          2 環境和工具準備

          XMLBeans中的大量工作使用了Ant工具,所以再開始工作之前請下載Ant工具并使它正常運行。

          XMLBeansjava實現請大家到bea的網站上下載:http://dev2dev.bea.com/technologies/xmlbeans/index.jsp

          在執行過程中,還需要用訪問xmldom組件,也就是xml-apis.jar文件,可到http://xml.apache.org/xerces2-j/index.html下載。附件中的test-XMLBeans.rar文件中也有這個jar文件。

          3 第一個例子

          3.1    實例說明

          我們這里使用一個訂單的例子,他的實例文檔如下:

          <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來描述這個實例文檔:

          <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>

          現在,要訪問的xml數據已經確定了,而且已經用schema來描述他了,剩下的就是使用XMLBeans來輔助生成訪問XML數據的java代碼了,下面的章節將詳細的介紹這部分內容

          3.2    ant輔助生成訪問XML數據的java代碼

          3.2.1      外部jar文件

          在使用XMLBeans生成訪問XML數據的java代碼時,我們需要用到xbean.jar文件,下載的XMLBeans里面有這個文件。

          3.2.2      增加的taskdef

          編譯腳本執行時候必須增加一個XMLBeantaskdef,內容如下:

          <taskdef name="xmlbean" classname="com.bea.xbean.tool.XMLBean" classpath="path/to/xbean.jar"/>

          3.2.3      xmlbean

          使用xmlbean標簽來生成訪問xml數據的java代碼,簡單的例子如下:

          <xmlbean schema="schemas" destfile="Schemas.jar"/>

          <xmlbean schema="schemaseasypo.xsd" destfile="Schemas.jar" srcgendir="." >

          第一個例子表示為schemas下面所有的*.xsd文件生成訪問代碼,將所有的代碼編譯好后放入Schemas.jar文件中。

          第二個例子表示為schemas下面所有的easypo.xsd文件生成訪問代碼,將所有的代碼編譯好后放入Schemas.jar文件中,而且將生成的。Java文件放在當前目錄下。

          其中的參數簡單的說明如下:

          xmlbean 標簽表示這是要生成指定schema文件的訪問代碼。

          Schema  屬性表示要生成訪問代碼的xsd文件的范圍,可以是一個目錄,也可以

          是一個文件或者使用fileset進行定義。

          Destfile  屬性定義了被生成的代碼編譯后將放在那個文件中。

          Rcgendir 屬性則表示生成的。Java文件將放在那個目錄中。

          Xmlbean標簽支持的其它參數和相關的說明請參考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="${build}"/>

          </target>

          <target name="compile" depends="init">

              <!-- Compile the java code from ${src} into ${build} -->

              <taskdef name="xmlbean" classname="com.bea.xbean.tool.XMLBean" classpath="${classpath}"/>

              <xmlbean schema="schemas/easypo.xsd" classpath="${classpath}" destfile="easypo.jar" srcgendir="${src}"/>

            </target>

          </project>

          3.2.5      生成jar文件

          現在你可以進入build.xml文件所在的目錄,執行ant f build.xml來生成所有訪問該easypo.xml的代碼。

          執行完以后,這個目錄下面會多出一個Schemas.jar文件,他包含了所有被生成和編譯了的、訪問xml文檔的.class文件。目錄下面會多出一個net目錄,他的子目錄下包含了所有被生成的.java文件.實際的jar文件構成請大家參考作者提供的Schemas.jar文件.

          4 測試一下

          4.1    測試代碼

          好了,現在我們來寫個例子,測試一下是否可以成功的訪問xml數據.完整的代碼請參看

          //解析xml實例文檔,他的參數poFile是一個file類型的參數

          //所以需要我們將3.1的實例文檔保存為一個.xml文檔

          PurchaseOrderDocument poDoc =

                PurchaseOrderDocument.Factory.parse(poFile);

          //創建一個訪問該xml實例文檔的接口PurchaseOrder

          /**[讓作者感到很意外的是,bea提供的例子代碼中這段的定義是這樣的:

          *PurchaseOrder po = poDoc.getPurchaseOrder();

          *也就是說PurchaseOrder這個接口應該是一個單獨的類,但是作者查看XMLBeans

          *最后生成的.java文件中,這個PurchaseOrder卻是作為PurchaseOrderDocument的一

          *個內部類出現的

          */

          PurchaseOrderDocument.PurchaseOrder po = poDoc.getPurchaseOrder();

          //直接過去其中的所有lineitem子元素的所有內容,他返回一個lineitem對象的數組.

            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    測試結果

          運行這段代碼,應該在控制臺打印如下信息:

          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 總結

          XMLBeansBea公司的一個公開源代碼項目,以Schema為基礎建立的、訪問xml的一種解決方法,提供了訪問和處理xml數據和文檔時既可以完全的訪問xml的內容、又不丟失xmlschema信息的強大功能。使用XMLBeans可以讓您用面向對象的觀點來對待和處理xml數據和文檔,同時又可以忠實于該xml數據對應的xml結構和schema

          本文中作者簡單的介紹了XMLBeans,并且給出了一個簡單的例子,詳細的演示了如何配置XMLBeans,如何使用他的ant擴展輔助生成訪問xmljava代碼,如何編寫客戶端來測試該段代碼是否成功執行的全過程。希望能夠讓大家掌握如何使用XMLBeans來簡化各自的開發工作、提高自己的開發速度。XMLBeans的高級應用將在接下來的文章中介紹。

          參考資料:

          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

          作者信息:

          姓名: 肖菁

          聯系方式: 0731-6665772,jing.xiao@chinacreator.com

          簡介: 作者目前是湖南省長沙鐵道學院科創計算機系統集成有限公司軟件中心軟件工程師,IBM developerworksBEA dev2dev撰稿人,主要研究J2EE編程技術、Web Service技術以及他們在websphereweblogicapache平臺上的實現,擁有IBM Developing With Websphere Studio證書。歡迎大家訪問作者的個人網站: vivianj.go.nease.net


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 台南县| 隆回县| 文成县| 同仁县| 双江| 双牌县| 兴海县| 临猗县| 祁阳县| 大理市| 宁夏| 乐都县| 舟曲县| 抚远县| 大连市| 维西| 台中县| 玛曲县| 文山县| 龙口市| 隆化县| 青神县| 竹溪县| 卢氏县| 云林县| 都昌县| 高碑店市| 伊通| 林口县| 马关县| 朝阳区| 寻乌县| 小金县| 玛多县| 环江| 古浪县| 海淀区| 禄劝| 保亭| 通渭县| 陕西省|