我們知道當(dāng)存在大量數(shù)據(jù)需要處理分析的話,最好是把這些數(shù)據(jù)放到數(shù)據(jù)庫中,所以幾乎所有大型的商業(yè)應(yīng)用系統(tǒng)都是和數(shù)據(jù)庫相關(guān)聯(lián)的,所以如果XML需要在商業(yè)領(lǐng)域大展宏圖的話,也必須要和數(shù)據(jù)庫相聯(lián)系。所以這里首先需要討論的一點(diǎn)問題是,XML本身是不是數(shù)據(jù)庫,從嚴(yán)格的意義上來說,XML僅僅意味著XML文檔。因?yàn)楸M管一個(gè)XML文檔包含數(shù)據(jù),但是如果不通過其他的軟件的軟件來進(jìn)行數(shù)據(jù)處理的話,它本身只不過是一個(gè)文本文件。所以XML本身不不能和數(shù)據(jù)庫掛上鉤,但是加上一些其他的輔助工具,我們可以把整個(gè)XML看成是一個(gè)數(shù)據(jù)庫系統(tǒng),XML文本本身可以看成是數(shù)據(jù)庫中的數(shù)據(jù)區(qū),DTD或者Schemas可以看成是數(shù)據(jù)庫模式設(shè)計(jì),XQL可以看成是數(shù)據(jù)庫查詢語言,SAX或DOM可以看成是數(shù)據(jù)庫處理工具。當(dāng)然它還是缺少數(shù)據(jù)庫所必須的一些東西,比如有效的存儲(chǔ)組織、索引結(jié)構(gòu)、安全性、事務(wù)處理、數(shù)據(jù)完整性、觸發(fā)器、多用戶處理機(jī)制等等。
但是為什么要把XML和數(shù)據(jù)庫相聯(lián)系呢?舉個(gè)例子來說明這個(gè)問題,比如你有一個(gè)電子商務(wù)的應(yīng)用程序需要使用XML來進(jìn)行數(shù)據(jù)傳輸。你所關(guān)心的是數(shù)據(jù)本身應(yīng)該具有的結(jié)構(gòu),你并不關(guān)心它在文檔中實(shí)際的存儲(chǔ)結(jié)構(gòu)。如果你的應(yīng)用程序很簡單的話,基本的文件系統(tǒng)將滿足你的需求,但如果應(yīng)用本身很復(fù)雜的話,你就需要一個(gè)完整的開發(fā)應(yīng)用環(huán)境來支持XML。從另一個(gè)方面來說,假設(shè)你有一個(gè)Web站點(diǎn),它的內(nèi)容是由一系列XML文檔構(gòu)成的,你不僅要管理這個(gè)站點(diǎn),同時(shí)你需要提供給用戶一個(gè)搜索該站點(diǎn)內(nèi)容的機(jī)制。而這些都需要借助數(shù)據(jù)庫來實(shí)現(xiàn)。選擇一個(gè)數(shù)據(jù)庫的最重要的因素是你是否需要數(shù)據(jù)庫來存儲(chǔ)數(shù)據(jù)或者是文檔,如果你想要存儲(chǔ)數(shù)據(jù)的話,你需要一個(gè)關(guān)系數(shù)據(jù)庫或者是對(duì)象數(shù)據(jù)庫來存儲(chǔ)實(shí)際的數(shù)據(jù),同時(shí)你需要中間件在數(shù)據(jù)庫和XML文檔之間建立橋梁關(guān)系,從另一方面來說,如果你想要存儲(chǔ)文檔,你需要一個(gè)內(nèi)容管理系統(tǒng),通過它進(jìn)行文檔的存儲(chǔ)。實(shí)際上,XML文檔可以分到兩大類:以數(shù)據(jù)為中心或者以文檔為中心。 以數(shù)據(jù)為中心的文檔:數(shù)據(jù)為中心的文檔有非常規(guī)則的結(jié)果,比如關(guān)于銷售訂單或者是飯店菜單的XML文檔。以數(shù)據(jù)為中心的文檔通常是為機(jī)器設(shè)計(jì)的,也就是說主要是方便機(jī)器進(jìn)行處理。通常,任何Web站點(diǎn)可以動(dòng)態(tài)的構(gòu)建HTML文檔,其步驟如下,根據(jù)用戶的查詢請求找到相關(guān)的面向數(shù)據(jù)的XML文檔,然后通過XSL對(duì)XML文檔進(jìn)行轉(zhuǎn)化,讓基于HTML的瀏覽器能夠方便的瀏覽結(jié)果。 以文檔為中心的文檔:以文檔為中心的文檔具有不規(guī)則的結(jié)構(gòu),而且數(shù)據(jù)的粒度也比較大。具體的例子如書本、電子郵件、廣告等等。以文檔為中心的文檔主要是用人類而設(shè)計(jì)的。 為了存儲(chǔ)或提取數(shù)據(jù),你可以使用數(shù)據(jù)庫和中間件,或者你可以使用XML服務(wù)器,或者是基于XML的Web服務(wù)器。為了存儲(chǔ)文檔,你需要一個(gè)內(nèi)容管理系統(tǒng)或者是可持久化的DOM實(shí)現(xiàn)??梢栽跀?shù)據(jù)庫或者是XML文檔中發(fā)現(xiàn)大量基于數(shù)據(jù)為中心的文檔。這樣我們就需要工具把數(shù)據(jù)從數(shù)據(jù)庫轉(zhuǎn)化成XML文檔,或者把一個(gè)XML文檔轉(zhuǎn)換到數(shù)據(jù)庫中。同時(shí)需要注意的是,當(dāng)把數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫中的時(shí)候,需要拋棄一個(gè)文檔的很多信息,比如它的名稱和DTD,它的物理結(jié)構(gòu),比如實(shí)體定義和使用,一個(gè)節(jié)點(diǎn)下元素的位置排列,二進(jìn)制數(shù)據(jù)的存儲(chǔ)方式等等。同樣,當(dāng)從數(shù)據(jù)庫中提取數(shù)據(jù)的時(shí)候,產(chǎn)生的XML文檔通常不包含CDATA或者是實(shí)體使用的說明,而且節(jié)點(diǎn)下元素的排列位置只和數(shù)據(jù)庫中記錄的順序位置一致。實(shí)際上一個(gè)XML文檔存儲(chǔ)到數(shù)據(jù)庫中,再由該數(shù)據(jù)庫生成此XML文檔,這前后兩個(gè)文檔格式幾乎不可能完全一樣。
為了在數(shù)據(jù)庫和XML文檔之間傳遞數(shù)據(jù),必須在文檔結(jié)構(gòu)和數(shù)據(jù)庫結(jié)構(gòu)之間建立映射,這種映射可以有兩個(gè)分類:模板驅(qū)動(dòng)和模型驅(qū)動(dòng)。 ?。保谀0弪?qū)動(dòng)的映射:需要在一個(gè)模板中嵌入命令,并用數(shù)據(jù)傳輸中間件進(jìn)行處理。比如,考慮下面的模板: ?。?xml version="1.0"?> ?。糉lightInfo> ?。糏ntro>The following flights have available seats:</Intro> <SelectStmt>SELECT Airline, FltNumber, Depart, Arrive FROM Flights</SelectStmt> ?。糃onclude>W(wǎng)e hope one of these meets your needs</Conclude> </FlightInfo> 注意其中嵌入了一個(gè)SELECT語句。當(dāng)用數(shù)據(jù)傳輸中間件進(jìn)行處理的時(shí)候,每一個(gè)SELECT語句都會(huì)被它的結(jié)果所代替,用XML格式化形式表現(xiàn)為: <?xml version="1.0"?> ?。糉lightInfo> ?。糏ntro>The following flights have available seats:</Intro> ?。糉lights> ?。糝ow> ?。糀irline>ACME</Airline> ?。糉ltNumber>123</FltNumber> ?。糄epart>Dec 12, 1998 13:43</Depart> <Arrive>Dec 13, 1998 01:21</Arrive> ?。?Row> ... ?。?Flights> ?。糃onclude>W(wǎng)e hope one of these meets your needs</Conclude> </FlightInfo> 基于模板驅(qū)動(dòng)的映射可以是相當(dāng)靈活的,比如,一些產(chǎn)品允許你把結(jié)果集放到XML文檔的任何位置,同時(shí)可以對(duì)SELECT語句設(shè)置參數(shù),并且可以使用for循環(huán)語句和if條件語句等。值得注意的是,當(dāng)前基于模板驅(qū)動(dòng)的映射只能應(yīng)用于在關(guān)系數(shù)據(jù)庫和XML文檔之間傳遞數(shù)據(jù)。 2 基于模型驅(qū)動(dòng)的映射:也就是說把數(shù)據(jù)從數(shù)據(jù)庫傳送到XML文檔是用一個(gè)具體的模型實(shí)現(xiàn)的,這樣,XSL可以被結(jié)合到基于模型映射的產(chǎn)品上。在XML文檔中,兩種模型是很常見的:表格模型(table model)和數(shù)據(jù)專用對(duì)象模型(data-specific object model)。 1) 表格模型:許多中間件軟件包用表格模型在XML文檔和關(guān)系數(shù)據(jù)庫之間傳遞數(shù)據(jù)。它把XML文檔表示為一個(gè)單一的表格或者是表格的集合。這樣,一個(gè)XML文檔的結(jié)構(gòu)可以用如下的形式表示:
?。糳atabase> ?。紅able> <row> ?。糲olumn1>...</column1> <column2>...</column2> ... ?。?row> ... ?。?table> ... ?。?database> 這里關(guān)鍵字"talbe"在把數(shù)據(jù)從數(shù)據(jù)庫傳遞到XML文檔的時(shí)候,表示一個(gè)單一的結(jié)果集,把數(shù)據(jù)從XML文檔傳遞到數(shù)據(jù)庫的時(shí)候,表示表示一個(gè)單一的表格或者視圖。但是,當(dāng)結(jié)果集合不只一個(gè)的時(shí)候,或者當(dāng)XML文檔包括多個(gè)復(fù)雜嵌套的時(shí)候,這種傳遞方式就不能適應(yīng)了。 2) 數(shù)據(jù)專用的對(duì)象模型:把一個(gè)XML文檔表示為由數(shù)據(jù)對(duì)象構(gòu)成的樹,每一個(gè)元素類型和對(duì)象相對(duì)應(yīng)。主要在面向?qū)ο蠛蛯哟螖?shù)據(jù)庫中使用,通過傳統(tǒng)的關(guān)系-對(duì)象模型也可以映射到關(guān)系數(shù)據(jù)庫中。注意這種模型并不是文檔對(duì)象模型(DOM)。比如,銷售訂單文檔可以被看成一個(gè)對(duì)象樹,其中包括五個(gè)類:Orders, SalesOrder, Customer, Line, 和Part。如下所示: ![]() 當(dāng)把一個(gè)XML文檔看成是一個(gè)以數(shù)據(jù)為中心的對(duì)象樹的時(shí)候,元素不一定和對(duì)象相對(duì)應(yīng),比如,一個(gè)元素只包含PCDATA,它能夠被當(dāng)成一個(gè)屬性,它包括一個(gè)單一的,標(biāo)量值。 實(shí)際上在XML和數(shù)據(jù)庫之間進(jìn)行數(shù)據(jù)轉(zhuǎn)化的時(shí)候,需要考慮兩個(gè)過程:一個(gè)是從數(shù)據(jù)庫模式中產(chǎn)生DTD,另外一個(gè)是根據(jù)DTD生成數(shù)據(jù)庫模式 從一個(gè)DTD中生成一個(gè)關(guān)系模式的步驟如下: 1. 對(duì)每一個(gè)元素,產(chǎn)生一個(gè)表和一個(gè)主鍵列。 2. 對(duì)每一個(gè)有混合內(nèi)容的元素,產(chǎn)生一個(gè)獨(dú)立的表格,用來存儲(chǔ)PCDATA,并通過父表的主鍵和父表相聯(lián)。 3. 對(duì)元素類型中的每一個(gè)單一值的屬性,對(duì)具有只有PCDATA內(nèi)容的子元素(該子元素按順序出現(xiàn)),產(chǎn)生一個(gè)單獨(dú)的列,如果子元素類型或者值是可以選擇的話,該列就應(yīng)該可以允許為NULL類型。 4. 對(duì)有多個(gè)值的屬性和可以出現(xiàn)多次的子元素(該子元素PCDATA)的話,需要?jiǎng)?chuàng)建一個(gè)單獨(dú)的表來存儲(chǔ)這些值,并通過父表的主鍵和父表相聯(lián)。 5. 對(duì)每一個(gè)包含元素或者混合內(nèi)容的子元素來說,通過父表的主鍵把父元素和子元素聯(lián)接起來。 從一個(gè)關(guān)系數(shù)據(jù)庫模式構(gòu)建DTD步驟如下: 1. 對(duì)每一個(gè)表,創(chuàng)建一個(gè)元素。 2. 對(duì)表中的每一列,創(chuàng)建一個(gè)屬性或者是一個(gè)只有PCDATA 內(nèi)容的子元素。 3. 根據(jù)表中的每一主鍵/外鍵關(guān)系,創(chuàng)建該表元素的子元素。 基于XML的數(shù)據(jù)庫產(chǎn)品分類
根據(jù)Ronald Bourret在XML Database Products一文中的描述,XML Database中包含有七種類型的產(chǎn)品,分別為: 1、 中間件(Middleware ) 2、 與XML相結(jié)合能驅(qū)動(dòng)XML的數(shù)據(jù)庫(XML-Enabled Databases),比如Oralce和微軟都宣稱在它們最新的數(shù)據(jù)庫產(chǎn)品都都能夠和XML進(jìn)行無縫的銜接。 3、 原始的XML數(shù)據(jù)庫(Native XML Database) 4、 XML服務(wù)器(XML Servers) 5、 XML應(yīng)用服務(wù)器,比如IBM的WebSphere 6、 內(nèi)容管理系統(tǒng)(Content Management Systems) 7、 可持久化的DOM實(shí)現(xiàn)(Persistent DOM Implementations) 下面我們對(duì)每一種產(chǎn)品做一個(gè)具體的說明和介紹 1、中間件:所謂中間件就是用來在XML文檔和數(shù)據(jù)庫之間進(jìn)行處理和轉(zhuǎn)化的軟件。主要應(yīng)用于以數(shù)據(jù)為中心的應(yīng)用里面,它可以用各種各樣的語言編寫,一般來說它需要用到ODBC, JDBC,或者是 OLE DB. 盡管它可以通過Internet進(jìn)行是數(shù)據(jù)的傳輸,但是一般它都是通過Web服務(wù)器來實(shí)現(xiàn)數(shù)據(jù)的傳輸。 下面我們需要考慮當(dāng)把XML文檔存儲(chǔ)到數(shù)據(jù)庫中,如何選擇適合你應(yīng)用程序的中間件。 實(shí)際上,在我們選擇中間件的時(shí)候,我們要考慮下面一些因素 1). 數(shù)據(jù)類型: XML不支持?jǐn)?shù)據(jù)類型,也就是說,在XML文檔中的所有數(shù)據(jù)都是文本,即使數(shù)據(jù)它本身代表了另外一種數(shù)據(jù)類型,比如日期或者整數(shù)。通常,數(shù)據(jù)傳輸中間件將把數(shù)據(jù)轉(zhuǎn)化為其他類型。 2). 二進(jìn)制數(shù)據(jù)處理:有兩種通常的方法存儲(chǔ)XML文檔中的二進(jìn)制數(shù)據(jù):未經(jīng)過解析的實(shí)體(unparsed entities)和Base64編碼。 3). Null類型處理:在關(guān)系數(shù)據(jù)庫世界中,NULL表示該數(shù)據(jù)不存在,它和0或者是空字符串當(dāng)然是不一樣的。當(dāng)然,XML也支持NULL的概念。如果一個(gè)可選擇的元素類型或者屬性是NULL的話,它就不包括在這個(gè)文檔里面。當(dāng)映射一個(gè)XML文檔的結(jié)構(gòu)到數(shù)據(jù)庫或者根據(jù)數(shù)據(jù)庫內(nèi)容生成XML文檔的時(shí)候,你需要考慮可選元素類型和屬性跟可NULL的列之間的映射。 4). 字符集:一個(gè)XML文檔可以包含任何Unicode字符,而不幸的是,許多數(shù)據(jù)庫并不支持Unicode。因此如果你的數(shù)據(jù)包括非ASCII字符的時(shí)候,需要注意數(shù)據(jù)庫和中間件對(duì)這些字符的處理。 5). 關(guān)于XML中的處理指令:處理指令并不是XML文檔中的數(shù)據(jù),因此中間件就很難決定如何存儲(chǔ)它們。所以在選擇中間件的時(shí)候,要看它們對(duì)處理指令的處理情況。 6). 標(biāo)記存儲(chǔ):注意不同的中間件對(duì)標(biāo)記的處理是不一樣的。而且在數(shù)據(jù)庫中的存儲(chǔ)模式也不同,見下面的例子: <description> ?。糱>Confusing example:</b> ?。?description> 在數(shù)據(jù)庫中存儲(chǔ)的形式如下: <b>Confusing example:</b> <foo/> 這主要是因?yàn)閿?shù)據(jù)庫不能識(shí)別<b>和<foo>是標(biāo)記還是文字。 典型的中間件有: ADO:它可以實(shí)現(xiàn)數(shù)據(jù)庫和XML文檔之間的雙向轉(zhuǎn)換。XML支持把一個(gè)記錄集合對(duì)象保存為一個(gè)XML文檔,它也能夠把一個(gè)XML文檔作為一個(gè)記錄集合進(jìn)行處理,這樣就在XML文檔和數(shù)據(jù)庫之間提供了一個(gè)橋梁。這種映射實(shí)際上是模型驅(qū)動(dòng)的,數(shù)據(jù)可以被看成是一棵對(duì)象樹,一個(gè)具有嵌套結(jié)構(gòu)的樹可以作為一個(gè)嵌套的記錄結(jié)果集被顯示,反之也是如此。另外,如果記錄集合數(shù)據(jù)有變化的話,可以反映到相應(yīng)的XML文檔中,而XML文檔中內(nèi)容的變化也可以導(dǎo)致數(shù)據(jù)庫內(nèi)容的變化。 ASP2XML:主要是通過一個(gè)COM對(duì)象實(shí)現(xiàn)XML文檔和基于ODBC或者是OLE DB的數(shù)據(jù)庫之間數(shù)據(jù)的傳遞。該產(chǎn)品實(shí)際上是基于模型驅(qū)動(dòng)的,把XML文檔看成是一個(gè)單一的表,當(dāng)把數(shù)據(jù)從數(shù)據(jù)庫傳遞到XML文檔的時(shí)候,用戶指定一個(gè)SELECT語句,輸出包含了ASP2XML專用的標(biāo)簽。當(dāng)把XML文檔的數(shù)據(jù)傳遞到數(shù)據(jù)庫的時(shí)候,XML文檔必須包含ASP2XML專用的標(biāo)簽。該COM對(duì)象是支持自動(dòng)化的,也就是說它能夠在劇本語言中使用,比如ASP。 2、支持XML的數(shù)據(jù)庫系統(tǒng)(XML-Enabled Databases):數(shù)據(jù)庫提供了擴(kuò)展的功能,能夠在XML文檔和數(shù)據(jù)庫之間進(jìn)行數(shù)據(jù)的傳輸。通常是設(shè)計(jì)成為能夠存儲(chǔ)和提取以數(shù)據(jù)為中心的文檔。一般來說是把XML文檔進(jìn)行解析以后,存儲(chǔ)到相應(yīng)的表格中,當(dāng)然,也可以存儲(chǔ)以文檔為中心的文檔,也就是說把整個(gè)文檔作為一個(gè)單一的表中的一個(gè)字段,然后通過文本檢索機(jī)制進(jìn)行查詢。因?yàn)樵S多數(shù)據(jù)庫現(xiàn)在能夠把內(nèi)容發(fā)布到網(wǎng)站上,基于XML的數(shù)據(jù)庫和XML服務(wù)器之間的差別就變得很模糊。 典型的產(chǎn)品有:微軟的SQL Server 2000。SQL Server2000通過三種方式支持XML技術(shù): 1) 在SELECT語句中增加了FOR XML條件子句:FOR XML條件子句有三種選擇,用來指定如何把SELECT語句映射到XML上去。RAW模式指定結(jié)果集為一個(gè)表格,表格中的每一行對(duì)應(yīng)一個(gè)元素,每一列對(duì)應(yīng)元素的屬性或者是它包含的子元素。AUTO和RAW的區(qū)別在于:行的元素名稱和表格名稱一致,產(chǎn)生的XML文檔是線性嵌套的,和表格在SELECT語句中出現(xiàn)的順序相對(duì)應(yīng)。EXPLICIT允許你使用一系列的SELECT語句的UNION來構(gòu)建一個(gè)XML文檔。 2 )通過XPath進(jìn)行信息定位:通過模式映射的方式,也就是在XML文檔的元素和屬性以及在數(shù)據(jù)庫中的表和字段之間建立映射關(guān)系。這里把XML看成是一棵對(duì)象樹,而使用XPath的一個(gè)子集來進(jìn)行查詢。 3 )在存儲(chǔ)過程中使用OpenXML函數(shù):OpenXML函數(shù)被用來提取XML文檔的任何一個(gè)部分,并把它當(dāng)作一個(gè)表格,然后就可以用SELECT語句中的FROM指定這個(gè)表格,并通過INSERT語句在XML文檔和數(shù)據(jù)庫之間傳遞數(shù)據(jù)。并可以用XPath來指定具體的元素或者屬性。 3、原始的XML數(shù)據(jù)庫(Native XML Database):實(shí)際上,在一個(gè)數(shù)據(jù)庫中存儲(chǔ)XML文檔可以有四種選擇: 1). 以文本形式存儲(chǔ)整個(gè)文檔,比如在關(guān)系數(shù)據(jù)庫中用BLOB類型,在文件系統(tǒng)用文件類型。 2). 在文件系統(tǒng)中以修改過的形式存儲(chǔ)整個(gè)文檔,比如,以壓縮的形式或者事先解析過的形式。 3). 把文檔結(jié)構(gòu)映射到數(shù)據(jù)庫中,比如把DOM模式映射成為數(shù)據(jù)庫中表格的形式。如何建立映射,各個(gè)數(shù)據(jù)庫可以有不同的實(shí)現(xiàn),。 4). 把數(shù)據(jù)結(jié)構(gòu)映射到數(shù)據(jù)庫中,比如,把一個(gè)包含銷售訂單的XML文檔映射到Order,Itmes,Parts和客戶等表格中去。 原始的XML數(shù)據(jù)庫和支持XML的數(shù)據(jù)庫的區(qū)別在于原始的XML數(shù)據(jù)庫一般使用方法2)和方法3)。而支持XML的數(shù)據(jù)庫一般選用方法4)。 典型的產(chǎn)品有斯坦福大學(xué)開發(fā)的Lore系統(tǒng),它的數(shù)據(jù)庫實(shí)際上是一個(gè)半結(jié)構(gòu)化的數(shù)據(jù)庫。所謂半結(jié)構(gòu)化的例子就是我們的簡歷,其中既有一些結(jié)構(gòu)化的信息,比如性別,年齡,通訊電話等等,也有非結(jié)構(gòu)化的信息,比如個(gè)人特長等的描述。XML本身就是一個(gè)非常好的半結(jié)構(gòu)化數(shù)據(jù)模式的例子,它本身是自描述的,包含了很多元數(shù)據(jù)。而且它同時(shí)可以擴(kuò)展或增加新的元數(shù)據(jù)(或者說是新的字段)。 Lore是用來存儲(chǔ)半結(jié)構(gòu)化的數(shù)據(jù)庫。它最開始是用來存儲(chǔ)HTML文檔數(shù)據(jù)的,但現(xiàn)在已經(jīng)可以被用來作為XML數(shù)據(jù)庫。它包括了一個(gè)查詢語言(Lorel),多索引機(jī)制,查詢優(yōu)化器,多用戶支持,日志記錄和恢復(fù)等功能,并且能夠倒入外部數(shù)據(jù)。因?yàn)長ore支持半結(jié)構(gòu)化,所以它也能夠存儲(chǔ)沒有DTD定義的XML文檔。 4、XML服務(wù)器:一般認(rèn)為,XML服務(wù)器是一個(gè)提供數(shù)據(jù)服務(wù)的平臺(tái),而這里的數(shù)據(jù)就是以XML形式出現(xiàn)的,而這些數(shù)據(jù)主要是為分布式應(yīng)用程序服務(wù)的,比如電子商務(wù)和B2B應(yīng)用等。XML服務(wù)器通常包括了一個(gè)完整的應(yīng)用開發(fā)環(huán)境,并通過各種數(shù)據(jù)存儲(chǔ)方式來使應(yīng)用程序可以方便的獲取和使用這些數(shù)據(jù)。存儲(chǔ)的數(shù)據(jù)包括傳統(tǒng)的數(shù)據(jù)庫數(shù)據(jù)、電子郵件信息和文件系統(tǒng)等等。我們知道傳統(tǒng)的Web服務(wù)器都是基于HTML文本進(jìn)行信息傳送的,隨著XML技術(shù)的出現(xiàn),對(duì)于基于XML的Web服務(wù)器的需求也就產(chǎn)生了。那么到底什么是XML服務(wù)器呢?準(zhǔn)確定義XML Server這個(gè)概念是困難的,因?yàn)檫@實(shí)在是一個(gè)比較新,而且概念很廣泛的東西,雖然已經(jīng)有許多的產(chǎn)品稱自己為XML Server,比如DataChannel公司的DataChannel Server 4.1;Software AG公司的Tamino;Excelon公司的excelon,但在應(yīng)用的范圍上以及功能上,每種產(chǎn)品都各不相同,因此這里也就不為XML Server進(jìn)行定義,而是歸納這幾種產(chǎn)品的共同擁有的一些特點(diǎn),以說明的方式來向大家解釋XML Server這個(gè)概念。 簡單地講,XML Server是一個(gè)提供數(shù)據(jù)的平臺(tái),它能夠以XML文檔的形式與分布式的應(yīng)用進(jìn)行數(shù)據(jù)交互。比如電子商務(wù)這一類的應(yīng)用。這聽上去和傳統(tǒng)的數(shù)據(jù)庫非常的相似,它和數(shù)據(jù)庫一樣提供數(shù)據(jù)的存貯與提取功能,但數(shù)據(jù)的格式的是基于XML的,因此在數(shù)據(jù)的處理方面,所用的是和傳統(tǒng)數(shù)據(jù)庫完全不同的技術(shù)了。 所以XML Server被認(rèn)為是XML Database其中的一種,XML-enabled Server則相對(duì)來講比較容易理解,因?yàn)樗举|(zhì)上就是一個(gè)Web Server,對(duì)于客戶端而言,瀏覽Web,客戶端不會(huì)感覺它和傳統(tǒng)Web Server有什么太大的區(qū)別,但實(shí)際上Server端在對(duì)請求(REQUEST)處理方法上,XML-enabled Web Server和傳統(tǒng)Web Server是完全兩種不同的方式,這是由于XML文檔與HTML文檔本身的特性所決定的。我們大家都知道,XML文檔是一種以數(shù)據(jù)為中心的文檔,XML文檔本身沒有表示格式化的信息,而是通過特定的XSL或者CSS來表現(xiàn),也就是說數(shù)據(jù)和表現(xiàn)是分離的。而在客戶端提交需求后由XML-enabled Web Server將內(nèi)容與形式結(jié)合后把最終結(jié)果發(fā)布給客戶端的Web Server。因此這是一種胖服務(wù)器,瘦客戶的模式。這種模式同微軟將XSL Parser集成到IE中的設(shè)計(jì)思想是完全不同的。它的優(yōu)點(diǎn)是能夠?qū)Σ煌脑O(shè)備瀏覽Web的提供各自相應(yīng)的格式的文檔,而不需要人工的干涉。 從另外一個(gè)角度講,XML Server可以提供比單純XML文檔更強(qiáng)的管理XMl格式數(shù)據(jù)的能力,而且可以避免用傳統(tǒng)數(shù)據(jù)庫時(shí)需要進(jìn)行數(shù)據(jù)轉(zhuǎn)換的過程(因?yàn)閄ML是標(biāo)準(zhǔn)的擴(kuò)展標(biāo)記語言,并不是各個(gè)公司專屬的技術(shù),而數(shù)據(jù)庫廠家對(duì)自己的數(shù)據(jù)庫都有不同的格式,所以必須通過一些中間件進(jìn)行轉(zhuǎn)換),而獲得高效。 當(dāng)然,任何技術(shù)都不是盡良盡美的,任何一項(xiàng)新的技術(shù)在沒有完全成熟以前都會(huì)存在許多的缺點(diǎn),XML Server同XML-enabled Server也不會(huì)例外,它們分別存在下面一些缺點(diǎn)或問題: 對(duì)于XML Server而言:XML Server的性能如何還沒有得到驗(yàn)證,因?yàn)樗捎玫氖且环N全新的數(shù)據(jù)組織方式,而這種方式在過去還沒有得到過廣泛的應(yīng)用。正如我們有理由看好XML Server發(fā)展前景的同時(shí),我們也有理由對(duì)這種沒有經(jīng)過大范圍使用的產(chǎn)品持懷疑態(tài)度。我們可以看一下幾種典型XML Server產(chǎn)品的配置需求。 △ DataChannel Server 4.1 在Windows環(huán)境下的硬件要求: 500MHz or faster Pentium III processor with at least 256MB of RAM △ DataChannel Server 4.1 在Windows環(huán)境下的硬件要求: Sun Ultra 10 or equivalent. At least 256MB of RAM △ Tamino 在Windows環(huán)境下的硬件要求: At least 300MHZ or faster. At least 256MB of RAM 對(duì)于XML-enabled Web Server而言:最大的問題是XML-enabled Web Server太復(fù)雜了,比較起原來用Html和傳統(tǒng)Web Server建設(shè)Web,懂得使用XML這些先進(jìn)技術(shù)的人還是太少了,而且Server的安裝也顯得太復(fù)雜,而開發(fā)工具則又太專業(yè)了。如何使電腦的初級(jí)用戶能很快的學(xué)會(huì)使用它,是它需要解決的另外一個(gè)問題。 基于XML的Web服務(wù)器體系結(jié)構(gòu)如下所示: ![]() 最后,我們看一下微軟對(duì)基于XML的Web服務(wù)器的支持,它的實(shí)際實(shí)現(xiàn)方法是通過IIS的ISAPI擴(kuò)展用以提供通過HTTP直接訪問SQL Server并將查詢結(jié)果形成XML返回到客戶端而完成的。最簡單的訪問方法是直接HTTP的URL中使用SQL語句: http://IISServer/VirtualRoot?sql=SELECT+*+FROM+Customers+FOR+XML+AUTO 同時(shí)需要注意的,我們可以在URL中執(zhí)行存儲(chǔ)過程和使用xml文檔模板?! ?/div> 5、XML應(yīng)用服務(wù)器:XML應(yīng)用服務(wù)器實(shí)際上是支持XML的Web應(yīng)用服務(wù)器,它們通常是模板驅(qū)動(dòng)的,通過在一個(gè)劇本語言中嵌入使用SQL語句來提取數(shù)據(jù)并動(dòng)態(tài)構(gòu)建XML文檔。
5、內(nèi)容管理系統(tǒng):內(nèi)容管理系統(tǒng)是用來存儲(chǔ)、提取和裝配XML文檔的系統(tǒng)。它們通常包括以下一些特征:編輯器、版本控制和多用戶并發(fā)處理,它們本身的對(duì)數(shù)據(jù)庫實(shí)現(xiàn)對(duì)用戶是透明的。它們的主要目的是用來管理文檔。文檔一般是以XML格式或者其他的如RTF、PDF或者SGML的形式出現(xiàn)的,對(duì)于非常簡單的文檔集合,文件系統(tǒng)就能夠滿足你的要求,但是,如果你有一個(gè)復(fù)雜的文檔集合的話,你通常需要一個(gè)內(nèi)容管理系統(tǒng)。這里的內(nèi)容管理系統(tǒng)的含義就是說允許你把文檔分割成具體的內(nèi)容片段,比如例子、過程、章節(jié)或者是工具條和其他的一些元數(shù)據(jù)比如:作者名字、版本號(hào)等等。然后可以根據(jù)需要來重新裝配XML文檔。你也可以根據(jù)這些片段來合成一個(gè)新的XML文檔。 內(nèi)容管理系統(tǒng)通常具有下面的一些功能: 1).版本和可獲取性控制 2).搜索引擎 3).編輯器 4).發(fā)布引擎,把內(nèi)容發(fā)布到書本、CD或者Web上 5).內(nèi)容和形式的分離 6).通過劇本和接口進(jìn)行擴(kuò)展 7).和數(shù)據(jù)庫數(shù)據(jù)集成 采用對(duì)象-關(guān)系模型,把DOM映射到數(shù)據(jù)庫中,你需要為DOM中的每一個(gè)對(duì)象在數(shù)據(jù)庫中建立對(duì)應(yīng)的表格。一般來說,系統(tǒng)需要包括五個(gè)表: 1) 屬性定義:定義屬性,包括他們的類型,合法的值等等。 2 )元素/屬性關(guān)聯(lián):定義哪些屬性是和哪些元素相關(guān)聯(lián)的。 3 )內(nèi)容模型定義:定義哪些元素能夠包含其他的元素。 4 )屬性值:包含屬性值和指向在屬性定義表和元素/屬性關(guān)聯(lián)表中的相關(guān)行的指針。 5 )元素值:包括元素值(PCDATA或者指向其他元素值的指針),元素在它的父節(jié)點(diǎn)中出現(xiàn)的次數(shù),指向包含父節(jié)點(diǎn)元素值所在行的指針,指向在元素/屬性表中的相應(yīng)行的指針。 前三個(gè)表和一個(gè)簡單的DTD是等價(jià)的,接下來的兩個(gè)表包含了實(shí)際的數(shù)據(jù)。通過反復(fù)的查詢后面兩個(gè)表,就有可能構(gòu)建XML文檔的任意一個(gè)部分。 7、可持久化的DOM實(shí)現(xiàn)(Persistent DOM Implementations):使用數(shù)據(jù)庫來進(jìn)行DOM實(shí)現(xiàn)的考慮是為了加快速度和避免機(jī)器內(nèi)存不夠,尤其是在XML文檔非常大的時(shí)候。它們存儲(chǔ)了XML文檔的結(jié)構(gòu),可持久化的DOM實(shí)現(xiàn)能夠被用來存儲(chǔ)、提取和查詢XML文檔,也可以從現(xiàn)在的文檔中創(chuàng)建新的文檔。也就是說能夠通過編程實(shí)現(xiàn)基于DOM的應(yīng)用。 實(shí)際上,你可以在自己的應(yīng)用程序中,通過編寫代碼來整合中間件、支持XML的數(shù)據(jù)庫,原始XML數(shù)據(jù)庫、XML服務(wù)器和永久DOM實(shí)現(xiàn)等技術(shù)。這里XML應(yīng)用服務(wù)器需要你編寫一些劇本代碼,內(nèi)容管理系統(tǒng)需要你做一些系統(tǒng)的配置。 |
|