Service Data Object (SDO) 2.0 是一個(gè)開放標(biāo)準(zhǔn)數(shù)據(jù)模型編程 API,允許開發(fā)人員在較高的級別方便地操作數(shù)據(jù)。盡管 SDO 1.0 以相同的數(shù)據(jù)抽象為目標(biāo),但有幾個(gè)大的缺點(diǎn),其中主要的一點(diǎn)是缺少 Helper 類,如 XSDHelper
, XMLHelper
等。而最終結(jié)果是,開發(fā)人員被迫使用 SDO 1.0 實(shí)現(xiàn) API(來自 Eclipse Modeling Framework (EMF) SDK)。
當(dāng)前的實(shí)現(xiàn) (SDO 2.0) 使用 EMF 2.2 SDK,但這個(gè) SDO 2.0 實(shí)現(xiàn)細(xì)節(jié)并不會影響開發(fā)人員根據(jù)新 API 編寫程序。將來,開放源代碼社區(qū)(通過 Apache Software Foundation)可能會決定提供不同的 SDO 2.0 實(shí)現(xiàn),但這不應(yīng)影響基于 SDO 2.0 API 構(gòu)建的應(yīng)用程序。
了解這個(gè)新 API 的優(yōu)勢的最基本方法是使用 SDO 2.0 來創(chuàng)建符合 XML 模式 (XSD) 的 XML 文檔并對其進(jìn)行讀取操作。要在不使用 SDO 2.0 的情況下完成相同的工作,開發(fā)人員需要理解 XML 解析器如何工作,并將數(shù)據(jù)解析邏輯與應(yīng)用程序緊密集成。如果以后 XSD 需要更改,將需要對應(yīng)用程序的各處進(jìn)行調(diào)整,從而可能對代碼的質(zhì)量帶來災(zāi)難性的影響。
SDO 2.0 API 的新用戶很難直接通過學(xué)習(xí)規(guī)范來理解相關(guān)概念。為了提供一定的幫助,我們從 XML Schema Primer(請參閱參考資料)創(chuàng)建了一個(gè)示例,以說明如何使用 SDO 2.0 API 進(jìn)行以下任務(wù):
- 將 XML 文檔寫入到磁盤
- 從磁盤讀取該文檔。
以下是我們將嘗試通過我們的示例實(shí)現(xiàn)的使用場景。首先,公司確定購買訂單(purchase order,PO)信息的要求。完成此任務(wù)后,我們就開始創(chuàng)建靜態(tài)表單,以設(shè)計(jì)信息的結(jié)構(gòu)。在數(shù)據(jù)庫中,此靜態(tài)表單即表模式。在 XML,此靜態(tài)表單即 XML 模式 (XSD)。如果以后需要收集更多的客戶信息,我們將需要重新設(shè)計(jì)表單/表模式/XSD。
下訂單時(shí),客戶需要填寫 PO 表單,或向操作員提供相同的信息,以便填寫此表單。表單中的信息將隨后由公司用于對訂單進(jìn)行配送。
公司接收到 PO 信息后,很有可能會將其進(jìn)行保存,并在以后對其進(jìn)行讀取以用于各種目的(如提供客戶支持)。在此示例中,我們可以將信息以 XML 格式保存,然后使用 SDO API 進(jìn)行讀取。
圖 1
顯示了從客戶 Robert Smith 收集的 PO 信息示例。將創(chuàng)建 XSD 文件,以采用結(jié)構(gòu)化的方式存儲此示例購買訂單。將用一個(gè)名為 CreatePurchaseOrder.java
的示例程序來采用 XML 格式創(chuàng)建示例 PO(名為 po.xml
)。最后,將使用 ReadPurchaseOrder.java
來演示如何從 po.xml
讀取訂單信息。
圖 1. 來自 Rober Smith 的示例購買訂單信息
Order date: 1999-10-20
Shipping information: Billing information: Order Items: 2. Part number:926-AA Comment: Hurry, my lawn is going wild! |
![]() ![]() |
![]()
|
基于圖 1 所示的示例購買訂單,可以使用一個(gè) PO 類型來表示訂單。我們將其命名為 PurchaseOrderType
。PurchaseOrderType
的實(shí)例可以包含四個(gè)主要數(shù)據(jù),如下所示:
-
shipping information
-
billing information
-
order items information
-
comment
shipping information 和 billing information 可包含更多的數(shù)據(jù),如 name
、street
、city
、state
、zip
和 country
。Order items information 可以包含客戶所購買的物品的很多信息。每個(gè)物品可能包含 part number
、product name
、quantity
, price
、ship date
和 comment
。PO 的 comment 區(qū)域包含一個(gè)字符串值,并不要求采用更結(jié)構(gòu)化的信息。
清單 1 顯示了結(jié)構(gòu)化為 XSD 格式的文件中包含的所有購買訂單信息。
清單 1. PO.xsd
|
還可以使用統(tǒng)一建模語言(Unified Modeling Language,UML)類關(guān)系圖來對購買訂單信息進(jìn)行結(jié)構(gòu)化,如圖 2 中所示。
圖 2. 購買訂單的 UML 類關(guān)系圖

XSD po.xsd
文件和該 UML 類關(guān)系圖具有以下區(qū)別:
- 類關(guān)系圖定義了
ItemType
,而并未在po.xsd.diagram
中定義此項(xiàng)。盡管po.xsd
并不具體定義ItemType
,XSD 規(guī)范仍可將ItemType
作為匿名類型處理。 - XSD 中所有
xsd:<type>
在類關(guān)系圖中都縮寫為了<type>
。在 XSD 中,xsd:<type>
模式中的 xsd 用于指示類型所屬的命名空間。在類關(guān)系圖中,為了簡單起見而將其省略了。 -
SKU type
未在類關(guān)系圖中定義。SKU type
事實(shí)上是在po
命名空間中定義的規(guī)范化字符串類型。在類關(guān)系圖中,它由string type
加以表示。
![]() ![]() |
![]()
|
清單 2 中所示的示例 CreatePurchaseOrder.java
程序用于創(chuàng)建一個(gè) PO,該 PO 采用名為 po.xml
的 XML 格式(如清單 3 所示)。
清單 2. CreatePurchaseOrder.java
|
清單 3. Po.xml
|
該示例 Java 程序首先通過調(diào)用 XSDHelper.INSTANCE.define()
方法向 SDO 運(yùn)行時(shí)注冊 po.xsd
中描述的所有類型。然后,它從 PurchaseOrderType
創(chuàng)建一個(gè)根 DataObject
。該程序?qū)脑撎幨褂?DataObject
API 來構(gòu)建 DataObject
樹,以表示購買訂單信息,如圖 3 中所示。
圖 3. DataObject 樹

在圖 3 中,每個(gè)矩形都劃分為兩個(gè)隔間。頂部間隔(灰色)指示 DataObject
實(shí)例名稱及其實(shí)際類型;底部間隔指示所包含的屬性。例如,樹的根元素為 purchaseOrder DataObject
實(shí)例;其實(shí)際類型為 PurchaseOrderType
,在清單 1 中的 PO.xsd
中定義。在此 DataObject
實(shí)例中,包含兩個(gè)屬性值——orderDate
和 comment
。
創(chuàng)建 DataObject
樹后,該程序調(diào)用 XMLHelper.INSTANCE.save()
方法來將從 purchaseOrder DataObject
實(shí)例開始的樹內(nèi)容保存到 XML 文檔中(此例中為 po.xml
)。事實(shí)上,可以將樹中任何 DataObject
實(shí)例指定為 XMLHelper.INSTANCE.save()
方法的第一個(gè)參數(shù),save()
方法將保存從所指定的實(shí)例開始的所有 DataObject
實(shí)例。
![]() ![]() |
![]()
|
CreatePurchaseOrder.java
創(chuàng)建了 po.xml
后,我們可以編譯并運(yùn)行清單 4 中所示的 ReadPurchaseOrder.java
,以演示如何使用 SDO API 來遍歷 po.xml
的內(nèi)容。該應(yīng)用程序?qū)?zhí)行以下操作:
- 進(jìn)行檢查,以確保已向 SDO 運(yùn)行時(shí)注冊了
po.xsd
中定義的類型 - 調(diào)用
XMLHelper.load()
方法來將po.xml
加載到內(nèi)存中(使用XMLDocument
實(shí)例xmlDoc
加以表示) - 調(diào)用
xmlDoc.getRootObject()
方法來檢索名為purchaseOrder
的DataObject
樹的根對象,該對象與圖 3 中所示的DataObject
樹關(guān)系圖中的purchaseOrder DataObject
對應(yīng) -
purchaseOrder DataObject
返回后,遍歷DataObject
樹,以檢索關(guān)于此 PO 的所有信息
清單 4. ReadPurchaseOrder.java
|
清單 4 中以黑體顯示的 System.out.println()
顯示各種數(shù)據(jù)對象的屬性值,包括:
-
purchaseOrder DataObject
的orderDate
和comment
屬性 -
shipTo DataObject
的name
屬性 -
billTo DataObject
的name
屬性 - 各種數(shù)據(jù)對象的
partNum
和productName
屬性
圖 4. 運(yùn)行 ReadPurchaseOrder 的控制臺輸出
Order date: 1999-10-20
Comment:Hurry, my lawn is going wild! Part num:872-AA Part num:926-AA |
在圖 4 中,我們可以看到運(yùn)行 ReadPurchaseOrder
Java 代碼的輸出。
![]() ![]() |
![]()
|
結(jié)束語:SDO 將成為事實(shí)上的數(shù)據(jù)模型編程 API
SDO 2.0 API 提供了創(chuàng)建和訪問數(shù)據(jù)的一致方式,使開發(fā)人員不必了解分析和維護(hù)數(shù)據(jù)完整性的底層實(shí)現(xiàn)細(xì)節(jié)。SDO 2.0 目前是 Apache Software Foundation 下的一個(gè)試驗(yàn)性子項(xiàng)目(稱為 Tuscany),預(yù)期將成為 SOA 開發(fā)的數(shù)據(jù)模型編程 API 的事實(shí)標(biāo)準(zhǔn)。請參閱參考資料部分,以獲得一個(gè)相關(guān)鏈接。
可以從上面的示例中看出,SDO 2.0 API 使您完全不必知道和使用 XML 解析器 API 來讀取、寫入和操作數(shù)據(jù)。如果使用 Java 創(chuàng)建了 DataObject
來表示符合您所定義的 XML 模式的 XML 數(shù)據(jù),SDO 2.0 將提供足夠的方便性和靈活性,讓您將精力放在如何使用數(shù)據(jù)上。因此,它可為您帶來極大的好處,從而提高開發(fā)工作效率和產(chǎn)品質(zhì)量。
總之,通過使用 SDO 2.0 提供的數(shù)據(jù)抽象技術(shù),您可以根據(jù)所定義的業(yè)務(wù)邏輯來處理數(shù)據(jù),以滿足您的業(yè)務(wù)需求。這可以幫助您簡化業(yè)務(wù)應(yīng)用程序開發(fā),也能提高團(tuán)隊(duì)的工作效率和工作質(zhì)量。
![]() ![]() |
![]()
|
學(xué)習(xí)
- 您可以參閱本文在 developerWorks 全球站點(diǎn)上的 英文原文 。
- 請參閱 W3 網(wǎng)站上的 XML Schema Part 0:Primer Second Edition,以了解 XML 模式機(jī)制的說明,并了解如何使用 XML 模式語言創(chuàng)建模式。
- 請參閱 Service Data Objects 規(guī)范。
- 在 Apache Software Foundation 網(wǎng)站了解有關(guān) Tuscany/SDO 2.0 project 的更多信息。
- 請?jiān)L問 SOA and Web services 專區(qū),以獲得數(shù)百篇關(guān)于如何開發(fā) Web 服務(wù)應(yīng)用程序的文章以及入門級、中級和高級教程,您將大開眼界。
討論
-
developerWorks 博客
——參加 developerWorks 社區(qū)。
![]() ![]() |
![]()
|
![]() |
||
|
![]() |
Fuhwei Lwo 目前是 WebSphere Service Data Objects (SDO) 的團(tuán)隊(duì)負(fù)責(zé)人。他主要的工作重點(diǎn)是推動在面向服務(wù)的體系結(jié)構(gòu)(Service Oriented Architecture,SOA)中將 SDO 作為數(shù)據(jù)數(shù)據(jù)模型編程 API 成功采用。 |
凡是有該標(biāo)志的文章,都是該blog博主Caoer(草兒)原創(chuàng),凡是索引、收藏
、轉(zhuǎn)載請注明來處和原文作者。非常感謝。