W3C 標準指出 XML 設計目標包括:「支援各式應用程式」、「編寫處理 XML 文件的程式將很容易」。但可讀性、序列化、傳輸等目標獲關注遠多於應用開發目標。本系列三部曲探討 XML 對應用開發的影響:
第 4 篇將整合所有技術展示真實範例。
傳統上 XML 定義業務文件元數據,DOM 用於應用中操作元數據。DOM 為階層式 XML 數據結構提供物件介面,可用 DOM API 操作。換言之,DOM 可作為物件包裝器操作任何可用 XML 表示的數據結構。
XML 數據模型中,許多應用數據物件被定義為 XML。因 XML 本質是階層式,極易以自然、人可讀格式捕捉不同數據物件間關係。
註:若數據已是 XML 格式,後續過程自然簡單。若為關聯格式,仍可用此法,但需建立關聯與 XML 雙向映射,可用 SQL/XML 發布與分解函數實現。多數關聯資料庫支援此類函數。對僅用 XML 作為數據模型的開發者,關聯映射到階層數據似屬多餘,但開發者在將關聯映射到數據物件時總在這麼做。XML 數據模型優勢足以促使許多開發者考慮在應用開發中使用 XML,即使業務模型不要求 XML 數據。
定義 XML 數據模型後,可用 DOM 解析器在應用中實例化。為隔離應用代碼與 DOM API,可為 DOM 和 XPath 實現創建包裝器,亦能提升應用代碼可移植性。本文提供 Java 包裝器範例(見下載區),可直接使用或作為模板。業務邏輯使用包裝器 API 直接操作 XML 模型,修改後的 XML 輕鬆序列化,在不同物件或多層環境 (SOA) 層間傳遞。
大多數應用由業務物件組成,操作數據物件階層。數據物件通常是業務數據的簡單包裝器,主要用途以受控方式向業務物件公開封裝數據。物件包裝器另一優勢:以自然物件階層表達關聯表中儲存的數據,捕捉數據間關係。編程工作主要部分即為業務數據創建這些物件包裝器。
因 XML 本質維護數據結構間關係,無需創建單獨物件階層捕捉關係。XML 已有標準物件模型 DOM,實現處理 XML 構造、修改、序列化。結合 XPath 與 DOM API,極易在業務應用中載入、修改、保存 XML 數據。
需創建 Customer、Items、Item 三個包裝器類(清單 1-3),包含 getter/setter、資料庫查詢邏輯、FindItemByPrice 等高級搜尋方法。應用代碼(清單 4)操作這些物件。發現:數據物件代碼遠多於業務邏輯代碼。包裝器隱藏底層業務數據關係,API 必須文檔完善開發者才能正確使用。簡單導航容易,但每個搜尋條件都需實現高級搜尋/導航功能(如 FindItemByPrice)。
包裝器主要用途是封裝業務數據,可用 XML 數據模型替換:
<Customer customerid="" firstname="" lastname="">
<Items>
<Item ID="" description="" purchaseDate="" price="" />
</Items>
</Customer>
假設資料庫數據已存為 XML:客戶數據存為 XML、商品數據存為 XML。對給定客戶,只需獲取客戶 XML 並插入查詢的商品列表。
1. Statement dbstmt= conn.createStatement();
2. ResultSet dbResult = dbstmt.executeQuery("select custXML from customer_table where customerid=custid");
3. XMLParse customerXML = new XMLParse(dbResult.getString(1));
4. customerXML.appendNode("/Customer", customerXML.createNode("<Items/>"))
5. dbResult = dbstmt.executeQuery("select itemXML from purchase_table where customerid=custid");
6. While (dbResult.next()) {
7. Node itemnode = customerXML.createNode(dbResult.getString(1));
8. customerXML.appendNode(itemnode, "/Customer/Items", false);
}
9. customerXML.find("/Customer/Items/item[@price>15.0 and @price<25.5]", true);
10. for(int i=0; i
第 2 行查詢返回客戶 custXML,第 3 行傳給 DOM 包裝器建構器實例化物件階層。第 4 行創建 Items 元素追加到 Customer。第 5-8 行獲取商品列表逐個追加。第 9 行用 XPath 搜尋價格區間商品,第 10-11 行輸出描述。
用 SQL/XML 發布函數在查詢中轉換(清單 7)。其餘應用代碼相同。
數據物件包裝器佔應用代碼大頭,嚴重分散開發者對業務邏輯的注意力,導致:額外成本、更多 Bug、更長開發週期、難移植代碼、模式變更需修改/重生成物件階層、維護更難、無內建數據驗證、需更多文檔解釋包裝器、高級搜尋導航需複雜邏輯、各業務物件自行處理序列化、若用映射工具則鎖定工具難替換。
XML 程式設計方法可取消整個包裝器物件階層,讓開發者專注業務邏輯不被數據結構分心。帶來優勢:
業務應用核心是創建、操作、儲存、呈現業務數據。數據物件包裝器旨在讓業務邏輯更易處理數據,但創建維護成本高,使開發者過度關注數據處理邏輯,分散對業務邏輯注意力。XML 數據模型可取消整個包裝器階層,聚焦業務邏輯。DOM 包裝器類隔離應用代碼與 DOM API。XPath 導航明確指出操作業務數據中的關係,代碼更易理解。理想情況數據應在資料庫存純 XML;即使存關聯表,應用中先轉 XML 再處理在許多情況下有意義。若包裝在物件階層的數據結構可用 XML 格式化,且物件階層主要用途操作這些結構並向業務邏輯公開,可考慮用 DOM 替代包裝器階層。