資料繫結系列的第二篇是如何從 XML 資料限制中產生一個 Java 語言。 本文通過完整的代碼展現了如何產生類和代碼,並提供了如何定製您自己版本的建議。 還沒有看過第一篇嗎?第一篇, "對象,無處不在的對象", 解釋了資料繫結是如何將 XML 和 Java 語言對象互為轉換。它比較了資料繫結和其它在 Java 程式中處理 XML 的方法, 並介紹了一個 XML 配置文檔樣本。第一部分也介紹了使用 XML Schema 來約束資料。
在深入 Java 程式和 XML 代碼之前,先快速回顧一下本系列第一部分所打下的基礎。
在第一部分中,我們知道只要可以標識文檔的一組約束,就可以將文檔轉換成 Java 對象。那些約束為資料提供了介面。如 Web 服務配置文檔樣本中所示,XML 文檔應當成為現有 Java 類的一個執行個體,並且從資料約束產生那個類。最後,會看到表示樣本 XML 文檔約束的 XML schema。
如果對細節還有疑問,請回顧 第一篇文章.
打造基礎
現在,可以著手從 XML schema 建立 Java 類。該類必須準確表示資料約束,並提供 Java 應用程式將使用的簡單讀方法和寫方法。開始之前,讓我們先回顧清單 1,查看為 WebServiceConfiguration 文檔定義的 XML schema。
清單 1. 表示 Web 容器配置文檔資料介面的 XML schema
<?xml version="1.0"?>
<schema targetNamespace="http://www.enhydra.org"
xmlns="http://www.w3.org/1999/xmlSchema"
xmlns:enhydra="http://www.enhydra.org"
>
<complexType name="ServiceConfiguration">
<attribute name="name" type="string" />
<attribute name="version" type="float" />
</complexType>
<element name="serviceConfiguration" type="ServiceConfiguration" />
<complexType name="WebServiceConfiguration"
baseType="ServiceConfiguration"
derivedBy="extension">
<element name="port">
<complexType>
<attribute name="protocol" type="string" />
<attribute name="number" type="integer" />
<attribute name="protected" type="string" />
</complexType>
</element>
<element name="document">
<complexType>
<attribute name="root" type="string" />
<attribute name="index" type="string" />
<attribute name="error" type="string" />
</complexType>
</element>
</complexType>
<element name="webServiceConfiguration" type="WebServiceConfiguration" />
</schema>
產生代碼
開始產生 Java 代碼之前,首先必須確定核心類的名稱。將使用 org.enhydra.xml.binding 包中的 SchemaMapper,它是 Enhydra 應用伺服器公用程式類集合的一部分。還可以將任何必需的支援類放到這個包中。
除了類名稱以外,還必須確定用來讀取和建立 XML 的 Java API。如上一篇文章中所討論過的,三種主要選擇是 SAX、DOM 和 JDOM。由於 SAX 僅僅適用於讀取 XML 文檔,因此它不適合建立 XML。由於在打包階段中要將 Java 對象轉換為 XML 表示,因此在此階段中需要建立 XML。這就將選擇的範圍縮小到 DOM 和 JDOM。在這兩種選擇都可用的情況下,本例中我選擇使用 JDOM API,僅為了顯示其功能性(並不僅僅因為我是它的合著者之一!)。
最後,必須指出如何將 XML schema 提供給 SchemaMapper 類。通常,可以假設類的產生是離線完成的(通過靜態 main 方法)。僅通過使 main 方法調用非靜態方法,還可以從運行時環境中使用類。做了這些決定後,就可以開始勾畫類的架構了。