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