XML 資料繫結架構 JiBX

來源:互聯網
上載者:User


XML 資料繫結架構 JiBX


作者:王恩建
申明:未經作者同意,謝絕轉載。

XML 在現在 Java 應用的開發中,很多地方都能看到它的身影,比如最常見的是我們定義參數設定檔用的就是 XML 檔案格式,避免程式的寫入程式碼。當然,XML 的應用不僅限於此,在其他技術領域 XML 也佔有舉足輕重的位置。如何在 Java 中處理 XML 檔案?目前最基礎最底層的 API 是 DOM, SAX, JDOM, dom4j。這些 API 為 Java 處理 XML 提供瞭解決方案,但是不足的是他們使用方法複雜,在處理 XML 的時候很容易發生錯誤。記得在兩年前使用 Cocoon 1.8 的時候,因為遺留系統採用 DOM 定義 XML 資料檔案格式,大量的子項目、父元素、同級元素、屬性讓人好半天都沒有理出頭緒來。

這次我們介紹的 JiBX 是處理 XML 的進階 API,同類的項目還有 JAXB, Castor, Zeus。使用這類進階 API,在處理 XML 的使用,你的 Java 應用中將不再會有元素和屬性,取而代之的是對象和範圍。優點顯而易見,處理 XML 的難度大大降低,而且更加符合物件導向的編程思想。

一 JiBX 簡介

JiBX 是一個綁定 XML 資料到 Java 對象的架構。JiBX 用一個綁定定義文擋(binding definition document)來定義 XML 資料與 Java 對象轉換的規則,這個文擋就是聯絡 XML 資料與 Java 對象之間的橋樑。

這裡有必要先介紹兩個資料繫結術語 marshal 和 unmarshal,marshal 是由 Java 對象產生 XML 文擋,unmarshal 是根據 XML 文擋建立 Java 對象。

使用 JiBX 的過程分成兩個過程,一個是 binding compiler,另一個是 binding runtime。binding compiler 是一個前期準備過程,包括定義綁定定義文擋,定義與 XML 綁定在一起的 Java 對象,然後編譯。在這個過程,JiBX 比其他項目在操作上要簡單,不用定義 DTD 和 Schema,缺點是需要自己定義 Java 程式。binding runtime 是使用 binding compiler 編譯好的 Java class 處理 XML 資料。

JiBX 也用到了第三方的工具 XPP3 Pull Parser 和 BCEL,在 JiBX 發布的檔案中也包含了這兩個工具相關的檔案。

二 簡單範例

按照慣例,還是從最簡單的例子說起。

首先從 JiBX 網站下載 JiBX,當前最新版本是 beta 3。解開下載的 zip 檔案,裡面有一個 lib 目錄,包含了 bcel.jar, jibx-bind.jar, jibx-extras.jar, jibx-run.jar, xpp3.jar 五個 jar 檔案。bcel.jar, jibx-bind.jar 只有在 binding compiler 的時候才用得到。jibx-extras.jar 是一個可選的工具包,裡面有一些測試和驗證的工具類。

1.定義一個我們將要處理 XML 檔案,檔案名稱為 data.xml,內容如下:

<customer>

 <person>

  <cust-num>123456789</cust-num>

  <first-name>John</first-name>

  <last-name>Smith</last-name>

 </person>

 <street>12345 Happy Lane</street>

 <city>Plunk</city>

 <state>WA</state>

 <zip>98059</zip>

 <phone>888.555.1234</phone>

</customer>

這個 XML 檔案非常簡單,共有十個元素,沒有屬性。根項目 customer 有 person, street, city, state, zip, phone 六個子項目。其中元素 person 有 cust-num, first-name, last-name 三個子項目。

2.接著定義兩個 Java 類 Customer 和 Person,也採用最簡單的方式,用對象的域值對應元素,內容如下:

public class Customer {

  public Person person;

  public String street;

  public String city;

  public String state;

  public Integer zip;

  public String phone;

}

public class Person {

  public int customerNumber;

  public String firstName;

  public String lastName;

}

這個兩個類沒有任何方法,夠簡單吧!或許你已經看出來了,Customer 類的七個 field 對應的是 XML 檔案中 customer 元素的七個子項目。Person 類的三個 field 對應的是 person 元素的三個子項目。在 Person 類的 field 的名稱並不是和 person 元素的子項目名稱完全相等,這是遵守 Java 編程規範 field 命名的需要,雖然不相等,但這不重要,可以在綁定定義文擋中把它們一一對應起來。

3.綁定定義文擋

綁定定義文擋是依據綁定定義規範將 XML 資料和 Java 對象綁定的 XML 文擋。檔案名稱為 binding.xml,內容如下:

<binding>

 <mapping name="customer" class="Customer">

  <structure name="person" field="person">

   <value name="cust-num" field="customerNumber"/>

   <value name="first-name" field="firstName"/>

   <value style="text" field="lastName"/>

  </structure>

  <value name="street" field="street"/>

  <value name="city" field="city"/>

  <value name="state" field="state"/>

  <value name="zip" field="zip"/>

  <value name="phone" field="phone"/>

 </mapping>

</binding>

binding.xml 檔案中的 name 和 field 屬性分別將 XML 中的元素和 Java 對象中的 field 一一對應並綁定起來。

<mapping name="customer" class="Customer">

mapping 元素的 name 和 class 屬性將 customer 根項目和 Customer 類綁定在一起。

<structure name="person" field="person">

public Person person;

上面兩行定義了 person 是 Customer 的 field,同時也把 person 元素和 person 類綁定在一起。

4.現在來看看他們之間的關係吧,如


圖片來自 Jibx 官方網站

對於終端使用者來說,他們只知道 XML 資料文擋和 Java 類,而綁定定義文擋是透明的。

5.執行 Binding Compiler 過程

以下命令是在 Linux 下執行,如果是 Windows 平台請轉換成相應的命令

#javac Person.java

#javac -classpath . Customer.java

#java -jar lib/jibx-bind.jar binding.xml

執行完後,在目前的目錄多了四個 class 檔案,分別是 Person.class, Customer.class, JiBX_bindingCustomer_access.class, JiBX_bindingFactory.class。

6.執行 binding runtime 過程

首先定製一個 XML 資料檔案 data.xml, 內容如下:

<customer>

 <person>

  <cust-num>123456789</cust-num>

  <first-name>John</first-name>

  <last-name>Smith</last-name>

 </person>

 <street>12345 Happy Lane</street>

 <city>Plunk</city>

 <state>WA</state>

 <zip>98059</zip>

 <phone>888.555.1234</phone>

</customer>

接著寫一個簡單的讀取 data.xml 測試程式 Test.java,內容如下:

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import org.jibx.runtime.JiBXException;

import org.jibx.runtime.IBindingFactory;

import org.jibx.runtime.BindingDirectory;

import org.jibx.runtime.IUnmarshallingContext;

class Test {

  public static void main(String[] args) {

  try{

    IBindingFactory bfact = BindingDirectory.getFactory(Customer.class);

    IUnmarshallingContext uctx = bfact.createUnmarshallingContext();

    Customer customer = (Customer)uctx.unmarshalDocument(new FileInputStream("data.xml"), null);

    Person person = customer.person;

    System.out.println("cust-num:" + person.customerNumber);

    System.out.println("first-name:" + person.firstName);

    System.out.println("last-name:" + person.lastName);

    System.out.println("street:" + customer.street);

  }catch(FileNotFoundException e){

    System.out.println(e.toString());

  }catch(JiBXException e){

    System.out.println(e.toString());

  }

 }

}

編譯並運行這個測試程式

#javac -classpath .:lib/jibx-run.jar Test.java

#java -cp .:lib/jibx-run.jar:lib/xpp3.jar Test

程式啟動並執行結果是

cust-num:123456789

first-name:John

last-name:Smith

street:12345 Happy Lane

三 總結

總的來說,JiBX 就這麼簡單,不過 JiBX 還有一稍微複雜一點的應用,本文沒有介紹,感興趣的朋友可以繼續研究下去。如果你有什麼問題可以直接到我們的論壇 http://www.sentom.net/forum 提出,也非常歡迎把你的經驗給大家分享。

原作者:王恩建

來 源:http://www.sentom.net

共有1760位讀者閱讀過此文

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.