前言
在上期中,我們討論了XML在企業中所扮演的角色,以及XML在各個領域中所能帶來的幫助與影響。隨著企業水平整合的需求增加,各個傳統垂直整合的企業資訊系統已面臨轉型的壓力,而XML的適時出現,正好減低了各個企業所需要付出的轉型代價,就如同止痛劑一般,將會受到企業的普遍歡迎。
在本期中,我們將延續上一期所探討XML的功能,繼續介紹XML應該以什麼樣的形式與角色呈現企業之中,以擔負企業資訊中心的資料交換與存取的重責大任。筆者在前兩期中曾經針對企業應用伺服架構做了一個簡單的介紹,探討在多階層式的企業服務模型中,各個階層的角色與責任,請參考(圖一)。而其中在企業資訊系統階層部份,就是所謂的企業資訊中心。在本期中,我們將介紹一個以XML為基礎的伺服架構,討論這樣的架構如何在企業中擔負中間階層與企業資訊系統階層的任務。
XML很好,但是它要如何整合到企業資訊系統中呢?
既然XML在企業中佔有著重要的地位,那麼,接下來的問題就是:XML到底應該在企業應用伺服架構中使用呢?這是頗為耐人尋味的問題。在前幾期中,我們介紹了新一代的企業應用伺服架構,以及在架構中各個組成份子所扮演的角色,如圖一所示。如果我們將期間所流動的資訊,都能夠以XML的形式來取代的話,將會形成一個以XML傳遞為主體的企業應用伺服架構。在這樣的架構下,會衍生出幾個重要的議題以供探討。首先是各個組成份子如何處理XML的問題。一旦要使用XML來當作資料交換的媒介,這就意味著各個組成份子都要具有處理XML的能力。舉例來說,在一個以XML為資料交換核心的醫院中,各個系統便都需要了解醫院病歷資料的架構格式(也就是所謂的DTD, Document Type Definition),如此才能夠解釋期間所傳遞的病歷資料,如下例所示:
<?XML version = *1.0* ?>
<!DOCTYPE patient-record [
<!ELEMENT patient-list (patient)* >
<!ELEMENT patient (pa_id, pa_lname, pa_fname,
phone, address, city, state, country, postalcode, record) >
<!ELEMENT pa_id (#PCDATA)>
<!ELEMENT pa_lname (#PCDATA)>
<!ELEMENT pa_fname (#PCDATA)>
<!ELEMENT phone (#PCDATA)>
<!ELEMENT address (#PCDATA)>
<!ELEMENT city (#PCDATA)>
<!ELEMENT state (#PCDATA)>
<!ELEMENT country (#PCDATA)>
<!ELEMENT postalcode (#PCDATA)>
<!ELEMENT record (date, description)*>
<!ELEMENT date (#PCDATA)>
<!ELEMENT description (#PCDATA)>
]>
其次,是整個伺服架構的佈設問題。一個企業應用伺服架構一旦是以處理XML為核心時,它便相當於一個XML伺服器,這樣的伺服架構我們將會在本文後半部份介紹。最後則是XML資料的存取問題,因為XML終歸是要集中起來以方便管理,所以在企業資訊系統端最重要的XML儲存處將會是是資料庫伺服器。目前來說,最廣為使用的資料庫伺服器就是關聯式資料庫,但是關聯式資料庫的表格關聯式管理與XML的階層式資料結構又有著顯著的不同,所以如何協調二者,以順利地利用關聯式資料庫存取XML,便成為一項頗值得深思的研究議題。接下來,我們就針對XML伺服器的架構做一介紹,希望能夠提供讀者一些可資運用的概念與方向。
XML伺服器架構的介紹
所謂的XML伺服器,就是用來處理XML的整合環境,而所謂的XML處理,則包括了各種XML的運作,如建立、解析、接收、傳送等等。要如何將這些工作予以簡化,進而提供一個應用程式開發的平台,就是XML伺服器最主要的任務。就某些角度來看,XML伺服器和Web伺服器似乎有幾分神似,Web伺服器不但可以透過HTTP協定來傳遞HTML文件,同時也可以當作使用者與後端系統溝通的橋樑(也就是所謂的CGI)。而XML伺服器也是一樣,可以透過協定將XML文件傳遞給使用者。旦其中有兩點不同:首先,XML伺服器提供了處理XML文件的標準應用程式界面,其次,它提供了數種不同的溝通方式來達到傳遞XML文件的目的。
所以,一個XML伺服器最主要的目的,將會是在不同的應用程式或機構之間擔任資訊交換的角色,而非使用者。舉例來說,一個負責購買行為的應用程式,可以將XML的資訊傳遞給另一個應用程式,以及資料庫中內容的更新。因此,一個XML伺服器,是一個完整的應用程式開發架構,能夠提供各種不同的用途。(圖二)便是一個典型的XML伺服器架構。
由圖二可知,一個典型的XML伺服器,應該包括以下幾個主要的組成份子:
1.客戶端:
這是一個可以自由收送XML文件的應用程式,其範圍涵蓋很廣,它可以是一個如個人數位助理般的設備,也可已是一個瀏覽器或是一個Web伺服器,甚至也可以是另一個XML伺服器。
2.通訊服務:
一個XML伺服器應該要能夠應付處理許多不同的通訊協定,其中Email和HTTP可能是最常被使用的協定。但是有某些應用程式可能會需要同時將XML文件傳遞到多個客戶端,甚至將文件廣播(multicast或是broadcast)出去,這時候就需要使用另一種型態的訊息佇列系統來提供這類型的服務。
理想上來說,一個XML伺服器應該要能夠提供處理任何一種通訊協定的運作架構,以提供應用程式傳遞資料之用。而這種處理多樣化通訊協定的能力,可以內建在伺服器之中,也可以獨立在伺服器之外,而以一種嵌入式外掛模組的型態存在。如此一來,在應用程式的開發上就可以達到在不需要任何改變的情形下,使用各種不同的通訊協定。我們常見的通訊協定,計有HTTP, Email, FTP, EJB, RMI, IIOP, COM,以及MQSeries等等。
3.XML伺服程式:
這是整個伺服架構的核心部份。在上一期中,我們說明了用Java來處理XML式相當有利的做法,因此,XML伺服程式自然可以用Java來進行開發。一個以Java為基礎的XML伺服程式不但具有可移植性、擴展性以及較高的生產力,同時也可以提供一個整合新的服務與物件在應用程式之間重複使用的完美平台。同時,由於有許多不同廠商都開發了許多工具程式,使得Java在這之中扮演著平衡各家技術的角色,如IBM、Microsoft以及Sun均提供了以Java為基礎的XML parser,而W3C則提出了所謂的文件物件模型(DOM, Document Object Model),其中更定義了一組核心介面來處理XML文件的存取問題。
4.文件處理模組:
XML伺服器中一個重要的功能,就是文件的處理。而所謂的文件處理模組是一種特定的應用程式邏輯,這種邏輯是用來處理某種類型的文件。而每一種文件處理模組通常也會定義一組方法來處理該種特定型態的文件。舉例來說,一個訂購單文件的處理模組可能會有submit、 acknowledge以及cancel方法,而每一種方法中都會包含一些特定的應用程式邏輯,以便和後端的資料庫物件發生互動,如資料庫及其他檔案系統等等。
XML伺服器實作
在XML伺服器實作部份,最好是將每一種文件處理模組寫成一個個不同的Java類別,而每一個運作項目則會定義成類別中的方法。每一種不同類別的文件都會被指定到不同且單一的文件處理模組,而文件的類別則可以被當成XML最上層的根節點(root node)。而一旦某個文件處理模組被啟動之後,該模組也有能力去呼叫其他的處理模組來共同合作。
因此,你便可以定義出一個文件處理的鏈結流程,依序執行不同的模組來解析並處理整個XML文件。此外,文件處理模組也可以支援所謂的請求遞送架構,用以定義出不同處理模組的先後執行順序。當XML伺服器收到遞送過來的請求時,它便會將其放入佇列之中以等待執行。不論是以鏈結流程或是請求遞送的形式,都絕對可以確保處理模組擁有最高的重複使用效率。
1.資料物件的存取:
當文件處理模組開始運作之後,通常模組中的應用程式邏輯會呼叫適當的後端資料物件,並依據不同的處理方式,送出相對應的輸入資料。舉例來說,該模組可以透過一個SQL指令來將一個新的客戶資料放入後端的資料庫中。而一個XML伺服器則應該實作出一些上層的資料庫運作特色,如連結管理、資料庫登入機制、JDBC的支援、以及交易處理等等。此外,如何和許多XML的資料端銜接也相當的重要,這些資料端包括SAP、PeopleSoft、大型主機,中間階層軟體,以及新一代的物件資料端如Java、EJB、CORBA以及COM等等。
當資料或是物件由後端傳回之後,下一個問題便是如何在處理模組中產生XML文件。這種文件產生的過程可以經由許多不同的途徑來完成,如對應或連結服務、樣板的套用處理、物件本身的自行產生、甚至是透過XSL(Extensible Style Language)來完成。
這其中最主要的概念,便是將資料欄位對應到XML文件中適當的元素位置。舉例來說,一個叫做book_name的資料庫欄位應該對應到XML文件的<book_name>元素,這樣的動作是經由動態對應來完成的。如果有多筆資料記錄傳回時,則XML文件也必須依照適當的對應來完成元素的產生。而資料在傳回的過程中,也可以做一些過濾及轉換(如代碼轉換)的工作。
2.XML核心服務:
XML伺服器是使用XML核心服務來完成最重要的運作功能。所謂的XML核心服務,包括parser、 DOM、 XSL以及XML查詢語言(XQL)等等。但是就如我們之前所提到的,這些核心服務也可以以嵌入模組的形式存在,如parser模組可以換成別家協力廠商的parser產品等等。這些核心服務共同提供了對文件的解析、確定文件類別處理模組、後端資料物件存取、以及資料以XML格式輸出等等特色。
一個典型的運作範例
接下來,我們用一個例子來說明整個應用程式的運作流程。(圖三)是一個查詢資料庫結果並輸出為XML文件的範例。首先,我們將一個XML文件當成查詢工作的輸入資料(步驟1),其中author_list_Handler_S是處理author_list元素的文件處理模組,如圖所示。
這個文件處理模組會將資料庫中的作者資料透過一個SQL指令來取出(步驟2),而最後的結果就會如(步驟3)所示。接下來,一個稱為PopulateXmlMsgBox的內容產生模組,會被用來將資料庫中取出的資料予以格式化(請參考附錄一)。
這個內容產生物件會利用資料庫中的欄位名稱來當作每個項目的標籤,並運用相同的方法來處理所有資料庫中所傳回的記錄資料。最後,我們所看見的,則是如步驟4中所產生的XML文件,並伴隨著一個該XML文件的DTD。
下例為文件處理模組所輸出的結果,我們可以更清楚XML如何實作:
/**
* 所產生的XML文件,並伴隨著該文件的DTD
*/
<!-- author DTD -->
<?XML version = "1.0" ?>
<!DOCTYPE author-list [
<!ELEMENT author-list (author)* >
<!ELEMENT author (au_id, au_lname, au_fname,
phone, address, city, state,country, postalcode) >
<!ELEMENT au_id (#PCDATA)>
<!ELEMENT au_lname (#PCDATA)>
<!ELEMENT au_fname (#PCDATA)>
<!ELEMENT phone (#PCDATA)>
<!ELEMENT address (#PCDATA)>
<!ELEMENT city (#PCDATA)>
<!ELEMENT state (#PCDATA)>
<!ELEMENT country (#PCDATA)>
<!ELEMENT postalcode (#PCDATA)>
]>
<author-list>
<author>
<au_id>172-32-1176</au_id>
<au_lname>懷特</au_lname>
<au_fname>強生</au_fname>
<phone>408 496-7223</phone>
<address>10932 Bigge Rd.</address>
<city>縵羅</city>
<state>加州</state>
<country>美國</country>
<postalcode>94025</postalcode>
</author>
<author>
<au_id>213-46-8915</au_id>
<au_lname>格林</au_lname>
<au_fname>瑪嘉烈</au_fname>
<phone>415 986-7020</phone>
<address>309 63rd St. #411</address>
<city>奧克蘭</city>
<state>加州</state>
<country>美國</country>
<postalcode>94618</postalcode>
</author>
<author>
<au_id>238-95-7766</au_id>
<au_lname>卡爾森</au_lname>
<au_fname>雪莉</au_fname>
<phone>415 548-7723</phone>
<address>589 Darwin Ln.</address>
<city>柏克萊</city>
<state>加州</state>
<country>美國</country>
<postalcode>94705</postalcode>
</author>
</author-list>
上面的例子,說明了一個動態的XML伺服器所能發揮的能力。它可以僅用短短的五行Java程式碼,便達到對資料庫下查詢指令,並利用查詢的結果產生一個完整的XML文件,其中並附有動態產生的DTD。此外,XML伺服器也可以運用一個標準的XML parser來幫助我們完成解析XML文件的工作。這樣的XML伺服器,將可以發揮Java元件重複使用的特色,不但可以減少不必要的開發浪費,同時也可以簡化管理上的需求,而成為一個優良的資料內容產生器。而就如同Web伺服器是Web基礎架構的重要單元一般,XML伺服器也將會對下一世代的Web應用提供一個重要的建構基石。
後記
到目前為止,我們所討論到的技巧與範例,似乎都是以簡單的資料型態為主,如作者資料,在我們的範例中都是以一維的資料型態存在。而XML與SQL最大的不同點,便在於XML與SQL二者所著力的角度不同,XML基本上是以呈現高度結構化的資料為目的,而SQL則是著重在處理那些可以用行與列來表示的關聯式資料表。結構化、階層化的資料非常適合用來組織資訊,因為這樣的表示方法可以達到非常清楚且複雜的語意架構,而關聯式的資料表,則因其關聯式的特性,允許對相同的資料集,動態產生許多不同的資料結構。
由於以上這兩種特色都相當的重要,因此要如何由資料庫中動態的產生結構化的XML文件,將成為相當值得探討的議題。相反地,如何將一個XML文件,以最經濟的方式存入資料庫中,也會是非常值得研究的主題之一。在下一期中,我們將針對SQL與XML各自的相同點與相異點,和讀者一起來探討如何結合二者的優點,在企業中發揮出最大的影響力。