国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項超值服

開通VIP
XML和數(shù)據(jù)庫
1.0 簡介
本論文簡要的探討了XML和數(shù)據(jù)庫之間的關(guān)系,同時列出一些可以使用數(shù)據(jù)庫處理XML文檔的軟件。雖然這里不打算詳盡地介紹這些軟件,但是筆者希望它能夠描述使用數(shù)據(jù)庫處理XML文檔中的主要部分。這里有點(diǎn)偏向與關(guān)系數(shù)據(jù)庫,因為我的經(jīng)驗如此。

2.0 XML是數(shù)據(jù)庫嗎?
在開始討論XML和數(shù)據(jù)庫之前,我們需要回答一個縈繞在很多心頭的問題: "XML是數(shù)據(jù)庫嗎?"在嚴(yán)格意義上將,如果"XML"是指XML文檔時,答案是"否"。盡管XML文檔包含了數(shù)據(jù),但是如果沒有其他的軟件來處理這些數(shù)據(jù),它對于數(shù)據(jù)庫的意義和其他文本文件沒有什么區(qū)別。

如果在更為寬泛一些的意義上將,當(dāng)"XML是指XML文檔以及所有相關(guān)的XML的工具和技術(shù)時,答案則是"是"。 之所以肯定是由于XML提供了許多數(shù)據(jù)庫中所需要的部分:存儲(XML文檔),結(jié)構(gòu)(DTD, XML schema語言),查詢語言(XQL, XML-QL, QUILT等), 編程接口(SAX, DOM),等等。不過...XML還缺少很多在真實的數(shù)據(jù)庫中所必備的內(nèi)容: 有效的存儲、索引、安全、交易、數(shù)據(jù)完備性、多用戶訪問、觸發(fā)、多文檔查詢等。

因此如果在數(shù)據(jù)量一般、用戶較少、性能要求不高的環(huán)境下可以把XML當(dāng)作數(shù)據(jù)庫來使用;而在大多產(chǎn)品的環(huán)境中,要求有許多的用戶使用、需要嚴(yán)格的數(shù)據(jù)完整性并且對性能有很高的要求,XML就不能勝任了。而且,考慮到象dBase和Access等數(shù)據(jù)庫既便宜又十分易用,因此甚至在第一種情況下XML都很少有理由充當(dāng)數(shù)據(jù)庫的角色。

3.0 為什么使用數(shù)據(jù)庫?
當(dāng)在考慮使用XML和數(shù)據(jù)庫時,第一個要問自己的問題應(yīng)該是:為什么我需要使用數(shù)據(jù)庫?你需要將原有的數(shù)據(jù)導(dǎo)出?你需要保存你的Web主頁?你是要在一個電子商務(wù)應(yīng)用中使用數(shù)據(jù)庫,而且其中XML當(dāng)做傳輸?shù)臄?shù)據(jù)格式?這些問題的答案都將直接影響到你對數(shù)據(jù)庫和中間件(如果有的話)的選擇。

例如,假設(shè)你在電子商務(wù)應(yīng)用程序中使用XML來進(jìn)行數(shù)據(jù)傳輸。這是很好的方案,因為你的數(shù)據(jù)具有高度規(guī)范的結(jié)構(gòu),而XML中的那些實體和編碼對你而言并不重要了。畢竟樣你關(guān)心的僅僅是數(shù)據(jù)而不在于這些數(shù)據(jù)如何在文檔中進(jìn)行物理的存儲。如果你的應(yīng)用程序相對比較簡單的話,關(guān)系數(shù)據(jù)庫和數(shù)據(jù)傳輸中間件將可以滿足你的需求;如果應(yīng)用程序龐大而且復(fù)雜,那么你就需要一個完全支持XML的開發(fā)環(huán)境了。

從另一方面來說,假設(shè)你有一個從零散的XML文件創(chuàng)建的網(wǎng)站。你不僅需要管理這個網(wǎng)站,你還要提供方法讓用戶可以查詢其中的內(nèi)容。這時你的文件將非常的不規(guī)范,而實體的使用對你來說將變得很重要,因為這些文件的結(jié)構(gòu)是網(wǎng)站的根本。在這個例子中,你就需要某類"原生 XML"數(shù)據(jù)庫可以執(zhí)行版本化、跟蹤實體的使用并且支持如XQL這樣的查詢語言。

4.0 數(shù)據(jù)和文檔的對比

筆者認(rèn)為,在選擇數(shù)據(jù)庫時,最重要的判斷因素可能是你是利用數(shù)據(jù)庫來保存數(shù)據(jù)還是保存文檔。如果你想保存數(shù)據(jù),你需要的數(shù)據(jù)庫主要是面向數(shù)據(jù)存儲(例如關(guān)系型數(shù)據(jù)庫或者面向?qū)ο笮蛿?shù)據(jù)庫)以及在數(shù)據(jù)庫和XML文檔之間相互轉(zhuǎn)換。從另一個角度來將,如果你想存儲文檔,你需要一個專門設(shè)計用來存儲文件的內(nèi)容管理系統(tǒng)。

雖然你可以自己把文件保存在關(guān)系數(shù)據(jù)庫或面向?qū)ο髷?shù)據(jù)庫中,可是你常會發(fā)現(xiàn)你的工作是在重復(fù)內(nèi)容管理系統(tǒng)的功能。類似的,雖然一個內(nèi)容管理系統(tǒng)通常是建立在面向?qū)ο髷?shù)據(jù)庫或關(guān)系數(shù)據(jù)庫之上,但要是把一個內(nèi)容管理系統(tǒng)當(dāng)做數(shù)據(jù)庫來使用就可能非常的令人困繞。

你需要存儲數(shù)據(jù)還是文檔,答案常常取決于你的XML文檔。原因是XML文件分為兩大類:以數(shù)據(jù)為中心和以文檔為中心。.

4.1 以數(shù)據(jù)為中心的文件
以數(shù)據(jù)為中心的文件的特點(diǎn)是結(jié)構(gòu)相當(dāng)規(guī)范、數(shù)據(jù)顆粒度好(也就是說,數(shù)據(jù)中最小的獨(dú)立單元是PCDATA元素或者是屬性)、很少或者沒有混合內(nèi)容。其中同層次元素和PCDATA的出現(xiàn)順序并不重要。典型的例子是,XML文檔包含了銷售定單、飛行安排、餐館菜單等等。數(shù)據(jù)為中心的文檔常被用于機(jī)器的使用,這時XML可能是多余的---它僅僅是數(shù)據(jù)傳輸?shù)氖侄味选?

例如,下面的銷售定單的文檔就是以數(shù)據(jù)為中心的:

 
   
    
      ABC Industries
      123 Main St.
      Chicago
      IL
      60609
    
     981215
    
      
       
         Turkey wrench:
         Stainless steel, one-piece construction,
         lifetime guarantee.
       
        9.95
      
      10
    
    
      
       
         Stuffing separator:
         Aluminum, one-year guarantee.
       
        13.27
      
      5
    
   
 

在XML的世界中,許多內(nèi)容豐富的文檔實際上都是數(shù)據(jù)為中心的。我們以顯示圖書信息的Amazon.com網(wǎng)站為例。雖然這個頁面是相當(dāng)巨大的文本,但是這個文本的結(jié)構(gòu)是高度規(guī)范的,其中許多的部分對任何的書本描述頁面都是相同的,并且特點(diǎn)頁面中的各部分的大小都是有限的。也就是說,該頁面可以通過一個簡單的、數(shù)據(jù)為中心的XML文檔來建立,其中包含了從數(shù)據(jù)庫中檢索得到的文本信息以及一個XSL樣式表。通常,目前任何通過在模板中填充數(shù)據(jù)庫數(shù)據(jù)而動態(tài)構(gòu)造HTML頁面的網(wǎng)站都可以被上面介紹的用以數(shù)據(jù)為中心的XML文檔和一個或者多個的XSL樣式表方式替代。

例如,我們來看下面的租房(Lease)文檔:

 
   ABC Industries agrees to lease the property at
   123 Main St., Chicago, IL from XYZ
   Properties for a term of not less than 18 at a cost of 1000.
 

可以從下面的XML文檔和簡單的樣式表得到:

 
   ABC Industries
   123 Main St., Chicago, IL
   XYZ Properties
   18
   1000
 

4.2 以文檔為中心的文件
以文檔為中心的文檔的特點(diǎn)是:結(jié)構(gòu)不規(guī)范、數(shù)據(jù)顆粒度更大(即,最小的獨(dú)立數(shù)據(jù)單元是包含有混合內(nèi)容的元素或者就是整個XML文檔)以及含有大量的混合內(nèi)容。其中相同層次的元素和PCDATA出現(xiàn)順序是非常重要的。典型的例子是書、電子郵件、廣告以及大多數(shù)XHTML文檔。以文檔為中心的文檔是用于人的使用。

例如,下面的產(chǎn)品描述文檔就是以文檔為中心: 

 

  Turkey Wrench

  Full Fabrication Labs, Inc.

  Like a monkey wrench, but not as big.

 

  The turkey wrench, which comes in both right- and
  left-handed versions (skyhook optional), is made of the finest
  stainless steel. The Readi-grip rubberized handle quickly adapts
  to your hands, even in the greasiest situations. Adjustment is
  possible through a variety of custom dials.
 
  You can:
 
 
  Order your own turkey wrench
  Read more about wrenches
  Download the catalog
 
 
  The turkey wrench costs just $19.99 and, if you
  order now, comes with a hand-crafted shrimp hammer as a
  bonus gift.
 
 
 

4.3 數(shù)據(jù)、文檔和數(shù)據(jù)庫
在現(xiàn)實情況中,以數(shù)據(jù)為中心的文件和文檔為中心的文件之間的區(qū)別并不是很嚴(yán)格。例如,一個以數(shù)據(jù)為中心的文件(如一張發(fā)票),也有可能包含粗顆粒度、不規(guī)則的數(shù)據(jù)(如發(fā)票的描述部分)。而一個以文檔為中心文件(如用戶手冊)也可能包含有良好顆粒度、規(guī)則的結(jié)構(gòu)化數(shù)據(jù)(通常是元數(shù)據(jù)),例如作者和修訂日期。除此之外,讓你的文檔具有以數(shù)據(jù)為中心或者以文檔為中心的特點(diǎn)有助于你判斷是關(guān)心數(shù)據(jù)還是文檔,這也將決定你需要采用什么樣的系統(tǒng)。

要存儲或檢索數(shù)據(jù),你可以使用一個數(shù)據(jù)庫(通常是關(guān)系型、面向?qū)ο笮突蛘呤菍哟涡?和中間件(字帶或者是采用第三方),你也可以使用XML服務(wù)器(即創(chuàng)建分布式應(yīng)用的平臺,例如利用XML進(jìn)行數(shù)據(jù)傳輸?shù)碾娮由虅?wù)應(yīng)用)。要保存文檔,你將需要一個內(nèi)容管理系統(tǒng)或者是一致性的DOM實現(xiàn)系統(tǒng)。有關(guān)各類系統(tǒng)的探討在5.0 "存儲和檢索數(shù)據(jù)" 小節(jié)和6.0 "存儲和檢索文檔 " 小節(jié)。你也能夠在 XML數(shù)據(jù)庫產(chǎn)品 中了解詳細(xì)的相關(guān)產(chǎn)品列表。

5.0 存儲和檢索數(shù)據(jù)
在以數(shù)據(jù)為中心的文檔中的數(shù)據(jù)內(nèi)容可能來自數(shù)據(jù)庫(此時你想把數(shù)據(jù)導(dǎo)出為XML格式),也可能是XML文檔(此時你想把數(shù)據(jù)存儲在數(shù)據(jù)庫中)。前者的例子是在關(guān)系型數(shù)據(jù)庫中存儲的大量現(xiàn)有數(shù)據(jù)(或稱遺產(chǎn)數(shù)據(jù));后者的例子是將數(shù)據(jù)作為XML發(fā)布在Web中,而且你想要在你的數(shù)據(jù)庫中進(jìn)行存儲以進(jìn)行更多的處理。如此,根據(jù)你的需求,你可能需要將XML文檔轉(zhuǎn)移到數(shù)據(jù)庫的軟件,也可能需要從數(shù)據(jù)庫轉(zhuǎn)移到XML文檔的軟件,或者兩者都支持。

5.1 轉(zhuǎn)移數(shù)據(jù)
將數(shù)據(jù)存儲在數(shù)據(jù)庫中時,經(jīng)常需要丟棄大量與文檔有關(guān)的信息,例如文檔名稱和DTD,同時還有其物理結(jié)構(gòu),例如實體的定義和使用、屬性值和同層元素的順序、二進(jìn)制數(shù)據(jù)的存儲方式(是Base64編碼、是未析實體或他方式)、字符數(shù)據(jù)段和其他的編碼信息。類似的,當(dāng)從數(shù)據(jù)庫中檢索數(shù)據(jù)時,生成的XML文檔結(jié)果除了非預(yù)定義實體lt(<"),gt(">"), amp("&"), apos("'"), quot(""")不包含任何CDATA或?qū)嶓w引用。而同層元素和屬性的出現(xiàn)順序也常常就是從數(shù)據(jù)庫中返回的數(shù)據(jù)的次序。

盡管一開始有些讓你吃驚,但是這常常是合理的。例如,假設(shè)你需要用XML作為數(shù)據(jù)格式把一張銷售從一個數(shù)據(jù)庫中轉(zhuǎn)移到另一個數(shù)據(jù)庫中。在這種情況下,在XML文檔中并不關(guān)心銷售單的編號是保存在銷售單的日期的前面還是后面,也不用關(guān)心是否將顧客的名稱保存在字符數(shù)據(jù)(CDATA)段還是作為一個外部實體,或者直接當(dāng)成一個PCDATA。最重要的在于相關(guān)的數(shù)據(jù)是從第一個數(shù)據(jù)庫轉(zhuǎn)移到第二個數(shù)據(jù)庫中。這樣,這個數(shù)據(jù)傳輸軟件就需要考慮數(shù)據(jù)的層次結(jié)構(gòu)(該結(jié)構(gòu)將銷售單的有關(guān)進(jìn)行進(jìn)行了分組),而其他則不必過多考慮?!?

忽略文檔信息以及其物理結(jié)構(gòu)的后果之一是 文檔的"逆反回歸"的不一致效應(yīng),即將一個文檔的數(shù)據(jù)存儲在數(shù)據(jù)庫中,然后根據(jù)這些數(shù)據(jù)重新組織成新的文檔。而即便是根據(jù)標(biāo)準(zhǔn)格式處理,得到的也常常是和前面不同的文檔。這是否可以接受要取決于你的需求,而且也將影響到你對數(shù)據(jù)庫和數(shù)據(jù)傳輸中間件的選擇。


5.2 從文檔結(jié)構(gòu)到數(shù)據(jù)庫結(jié)構(gòu)的映射
為了在XML和數(shù)據(jù)庫之間傳輸數(shù)據(jù),需要在文檔結(jié)構(gòu)和數(shù)據(jù)庫結(jié)構(gòu)之間進(jìn)行相互的映射。這樣的映射通常分為兩大類: 模板驅(qū)動和模式驅(qū)動。

5.2.1 模板驅(qū)動的映射
在以模板驅(qū)動的映射中,沒有預(yù)先定義文檔結(jié)構(gòu)和數(shù)據(jù)庫結(jié)構(gòu)之間的映射關(guān)系 ,而是使用將命令語句內(nèi)嵌入模板的方法,讓數(shù)據(jù)傳輸中間件來處理該模板。例如,考慮下面的模板(注意該模板并不適用任何實際的產(chǎn)品),在<SelectStmt>元素中內(nèi)嵌了SELECT語句:

  <?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>

當(dāng)數(shù)據(jù)傳輸中間件處理到該文檔時,每個SELECT語句都將被各自的執(zhí)行結(jié)果所替換,得到下面的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>
這種以模板驅(qū)動的映射可以相當(dāng)?shù)撵`活。例如,有些產(chǎn)品可以允許你在任何結(jié)果集合中替換你想要的內(nèi)容(包括在SELECT中使用參數(shù)),而不是象上面的例子中簡單地格式化結(jié)果。另外它還支持使用編程來進(jìn)行構(gòu)造,例如循環(huán)和條件判斷結(jié)構(gòu)。還有一些還支持SELECT語句的參數(shù)化,例如通過HTTP來傳遞參數(shù)。
目前,以模板驅(qū)動的映射只支持從一個關(guān)系型數(shù)據(jù)庫轉(zhuǎn)換成XML文檔的情況。

5.2.2 模型驅(qū)動的映射
在以模型驅(qū)動的映射中,利用XML文檔結(jié)構(gòu)對應(yīng)的數(shù)據(jù)模型顯式或隱式地將映射成數(shù)據(jù)庫的結(jié)構(gòu),而且反之亦然。它的缺點(diǎn)是靈活性不夠,但是卻簡單易用,這是因為它是基于具體的數(shù)據(jù)模型來進(jìn)行映射的,通常能夠為用戶實現(xiàn)很多地轉(zhuǎn)換工作。由于將數(shù)據(jù)從數(shù)據(jù)庫轉(zhuǎn)換成XML的結(jié)果依照了單個模型, 因此通常在這種方式下通常結(jié)合XSL來提供模板驅(qū)動的系統(tǒng)中所具有的靈活性。

在XML文檔中的數(shù)據(jù)視圖通常有兩種模型:表格模型和特定數(shù)據(jù)對象模型。有時候也可能會出現(xiàn)其他的模型。例如,通過采用ID和IDREF屬性,一個XML文檔可以用來一個指定的圖形。不過,很多現(xiàn)有的中間件并不支持這些模型。

5.2.2.1 表格模型

許多中間件軟件包都采用表格模型在XML和關(guān)系型數(shù)據(jù)庫之間進(jìn)行轉(zhuǎn)換。它把XML的模型看成是一個單獨(dú)的表格或者是一系列的表格。也就是說,XML的文檔的結(jié)構(gòu)和下面的例子相類似,其中在單個表格的情況下,<database>并不出現(xiàn):

  <database>
   <table>
     <row>
      <column1>...</column1>
      <column2>...</column2>
      ...
     </row>
     ...
   </table>
   ...
  </database>

其中的術(shù)語"table"可理解為單個的結(jié)果集(當(dāng)從數(shù)據(jù)庫向XML中轉(zhuǎn)換數(shù)據(jù)時),或者是一個單獨(dú)的表格或可更新的視圖(當(dāng)從XML向數(shù)據(jù)庫轉(zhuǎn)換數(shù)據(jù)時)。如果數(shù)據(jù)需要來自多個結(jié)果集(當(dāng)數(shù)據(jù)來自數(shù)據(jù)庫中時)或者與僅僅表達(dá)成一系列表格的集合(當(dāng)轉(zhuǎn)換數(shù)據(jù)到數(shù)據(jù)庫時)相比,XML的文檔包含有更深層次的嵌套元素,那么類似的轉(zhuǎn)換幾乎是不可能的。

5.2.2.2 特定數(shù)據(jù)對象模型

XML文檔中第二種普遍的數(shù)據(jù)模型是特定數(shù)據(jù)對象的樹型結(jié)構(gòu)。在該模型中,元素類型通常對應(yīng)對象,而XML中的內(nèi)容模型、屬性和PCDATA則對應(yīng)對象的屬性。這種模型直接映射成面向?qū)ο蟮臄?shù)據(jù)庫和層次型數(shù)據(jù)庫,當(dāng)然借助于傳統(tǒng)的對象-關(guān)系映射技術(shù)和SQL 3對象視圖也可以映射成關(guān)系數(shù)據(jù)庫。要注意的是,這種模型并不是文檔對象模型(DOM)。DOM是對文檔本身進(jìn)行建模,而不是對文檔中的數(shù)據(jù)。如6.1.2小節(jié)所述,DOM用來在關(guān)系型數(shù)據(jù)庫的基礎(chǔ)上建立內(nèi)容管理系統(tǒng)。

例如,上面的銷售定單文檔就可以看作是由五個類所組成的樹型結(jié)構(gòu)。如下面的視圖所示,包括Orders, SalesOrder, Customer, Line和Part類:

            Orders
             |
           SalesOrder
          /  |         Customer  Line  Line
             |   |
            Part  Part

當(dāng)把一個XML文檔建模為一棵特定數(shù)據(jù)對象樹時,就沒有必要要求元素一定要對應(yīng)于對象。例如,如果一個元素只包含PCDATA,如銷售定單文檔中的CustName元素,它可以當(dāng)作一個屬性進(jìn)行處理,因此屬性只包含單一的、標(biāo)量型數(shù)值。類似的,有時將混合元素或元素內(nèi)容模型化成屬性也是非常有用的。一個現(xiàn)成的例子就是在銷售定單文檔中對Description元素的處理:盡管它在XHTML的格式中有混合內(nèi)容,但是將Description元素看作單個的屬性會更有用些,因為它的組成部分本身并沒有什么意義。

5.3 數(shù)據(jù)類型、空值、字符集合和其它
本節(jié)將探討一些有關(guān)來自數(shù)據(jù)庫的XML文檔的存儲問題。通常,你決定不了你選擇的中間件是如何解決這些問題的,但是你最好應(yīng)該意識到這些問題的存在,因為這有助于你正確選擇你的中間件。

5.3.1 數(shù)據(jù)類型
XML不支持任何有實際意義的數(shù)據(jù)類型。除了未析實體,所有XML文檔中的數(shù)據(jù)都被當(dāng)成文本來對待,即便它能夠用其他的數(shù)據(jù)類型(如日期或者整數(shù))來表示。通常,數(shù)據(jù)轉(zhuǎn)換中間件將把XML文檔中的文本轉(zhuǎn)換成其它數(shù)據(jù)庫中的數(shù)據(jù)類型,反之亦然。然而,特定的數(shù)據(jù)類型所識別的文本格式是有限制的,例如受到提供的JDBC Driver所支持的數(shù)據(jù)類型的限制。在這些眾多的數(shù)據(jù)類型中,日期類型通常會導(dǎo)致麻煩。不同國際地區(qū)的數(shù)字格式的差異也可能產(chǎn)生問題。

5.3.2 二進(jìn)制數(shù)據(jù)
通常有兩種方法將二進(jìn)制數(shù)據(jù)保存到XML文檔中的:未析實體和Base64編碼處理(一種MIME編碼方法,可以將二進(jìn)制數(shù)據(jù)映射成US-ASCII的子集)。 對于關(guān)系型數(shù)據(jù)庫,這兩種方法都可能存在問題,因為從數(shù)據(jù)庫中保存和檢索二進(jìn)制數(shù)據(jù)的規(guī)則非常的嚴(yán)格,這樣對會導(dǎo)致中間件出現(xiàn)問題。

另外,并沒有一種標(biāo)準(zhǔn)的符號用來說明一個XML文檔中的元素包含有Base64編碼數(shù)據(jù),從而使得中間件可能根本就不能夠識別這種編碼。最后,在存儲數(shù)據(jù)到數(shù)據(jù)庫時,可能會忽略與未析實體或Base64編碼元素相關(guān)的符號。所以,如果對你而言二進(jìn)制數(shù)據(jù)非常重要的話,請務(wù)必要確認(rèn)你的中間件是否支持二進(jìn)制數(shù)據(jù)。

5.3.3 空值
在數(shù)據(jù)庫世界中,空值(null)數(shù)據(jù)意味著數(shù)據(jù)不存在值。但是這與一個值為0的數(shù)字或長度為0的字符串有很大的區(qū)別。例如,假設(shè)你的數(shù)據(jù)來自一個氣象站, 如果氣象站的溫度計出了毛病讀不出溫度值,那么你的數(shù)據(jù)庫中將存儲一個null值而不是一個0。顯然,值為0完全是另外一回事了。

XML中空值概念的支持可以通過設(shè)置可選的元素類型或?qū)傩詠韺崿F(xiàn)。如果元素類型或?qū)傩灾禐閚ull,XML只要在文檔不包含該元素或者屬性就可以了。但是對數(shù)據(jù)庫而言,空的元素或包含0長度字符串的屬性并不是空值null:它們的值為長度為0的字符串。

當(dāng)在XML文檔和數(shù)據(jù)庫結(jié)構(gòu)之間相互映射過程中,你必須特別注意那些可選的元素類型或?qū)傩允欠駥?yīng)于數(shù)據(jù)庫中的空值項。如果不這么做的話,很可能出現(xiàn)插入錯誤(當(dāng)將數(shù)據(jù)轉(zhuǎn)換到數(shù)據(jù)庫中時)或者無效文檔錯誤(當(dāng)將數(shù)據(jù)從數(shù)據(jù)庫讀出時)。


因為同樣要用符號空值,XML中相對與數(shù)據(jù)庫而言更為靈活。具體來講,許多XML用戶很可能包含空字符串的空元素或?qū)傩允强罩?。這個時候你必須考慮如何選擇合適的中間件來解決這個問題。一些中間件可以讓用戶選擇在XML文檔中定義用什么來組成空值。

5.3.4 字符集
根據(jù)定義,除了一些控制字符,XML文檔能夠包含任何的Unicode字符。但是不幸的是,許多數(shù)據(jù)庫都限制或則不支持Unicode,而且需要一些特殊的配置才能夠處理非ASCII編碼的字符數(shù)據(jù)。如果你的數(shù)據(jù)包含了非ASCII字符,那么務(wù)必要核實你的數(shù)據(jù)庫和中間件是否能夠處理這些字符。

5.3.5 處理指令
處理指令并不屬于XML文檔中的“數(shù)據(jù)”部分,因此目前許多中間件可能不能正常的處理。問題是,尤其是在將XML文檔結(jié)構(gòu)嚴(yán)格映射成數(shù)據(jù)庫結(jié)構(gòu)時,處理指令通常是很難處理的,因為它們可以虛擬地出現(xiàn)在文檔的任何位置。因此,中間件就很難判斷將它們保存到什么位置以及在什么時候檢索讀取出來。如果處理指令和文檔的循環(huán)回復(fù)("round-tripping")對你而言是非常重要的話,就務(wù)必檢查你的中間件是如解決這個問題的。

5.3.6 存儲標(biāo)記
在4.2.2 小節(jié)中提到,有時候?qū)鼗蛘呋旌蟽?nèi)容的元素不作進(jìn)一步的解析而直接保存到數(shù)據(jù)庫中是非常有用的。最常見的方法是簡單的把這個標(biāo)記本身直接保存到數(shù)據(jù)庫中。不幸的是,當(dāng)從數(shù)據(jù)庫中檢索數(shù)據(jù)時將產(chǎn)生問題:不可能判斷數(shù)據(jù)庫中的標(biāo)記到底是真的標(biāo)記還是代表了標(biāo)記字符的實體,如由lt和gt轉(zhuǎn)義的字符。

例如,下面的description元素:

  <description>
   <b>Confusing example:</b> <foo/>
  </description>

在數(shù)據(jù)庫中存儲為:

  <b>Confusing example:</b> <foo/>

這時數(shù)據(jù)庫就不能判斷<b>和<foo>是標(biāo)記還是文本。有幾種可能的解決方法,如以一定的方式來標(biāo)志標(biāo)記或者對非標(biāo)記的標(biāo)記字符使用實體。但是這時你要格外注意這樣的方式是否和使用這些的數(shù)據(jù)的其它應(yīng)用兼容。例如,如果你想查詢數(shù)據(jù)庫中的小于號("<")和 lt實體("<")時就要特別留心。

5.4 從數(shù)據(jù)庫的結(jié)構(gòu)生成DTD及其互逆過程
在XML文檔和數(shù)據(jù)庫之間轉(zhuǎn)換數(shù)據(jù)時,一個普遍問題是:如何從數(shù)據(jù)庫的結(jié)構(gòu)(Schema)生成XML的DTD,如果從XML的DTD產(chǎn)生數(shù)據(jù)庫的結(jié)構(gòu)。簡而言之,這是非常直接的操作,但是產(chǎn)生的結(jié)果通常離許多用戶的期望值還有一些距離。

(還要注意這通常是一次性操作,而大多數(shù)應(yīng)用,尤其是所有的垂直性應(yīng)用都結(jié)合了已知的DTD和關(guān)系型Schema的集合。顯而易見的特例是在關(guān)系數(shù)據(jù)庫中存儲隨機(jī)XML文檔或者將關(guān)系型數(shù)據(jù)發(fā)布為XML文檔的工具;而在后面的情況中,DTD的作用并不明顯。)

對于元素類型中每個有單一數(shù)值的屬性和只包含有PCDATA內(nèi)容的子元素類型在該ta ble中新建立一列(字段)。如果子元素類型或則屬性是可選的,讓該字段允許為空。對于每個有多值的屬性或則多僅含有PCDATA內(nèi)容的子元素類型,再建立一個分開的 table來保存他們的值,通過它們的父表的主關(guān)鍵字連接到父表。 對于每個子元素,這些子元素本身還有元素或則混合內(nèi)容,使用父表中的關(guān)鍵字將父元素表連接到子元素表中。 而下面則是一個從關(guān)系數(shù)據(jù)庫的結(jié)構(gòu)生成XML文檔的過程(簡化過的): 對每個table,新建一個元素。 對表中的每列,建立一個屬性或則只含PCDATA的子元素對每個包含有在主鍵/外鍵關(guān)鍵字關(guān)系中主鍵值的列,新建一個子元素。

 

例如,下面的過程(經(jīng)簡化)說明了如何從一個DTD生成一個關(guān)系型結(jié)構(gòu):

對于每種包含元素或者混合內(nèi)容的元素類型,新建一個表格和一個主鍵字段。
對于每個包含混合內(nèi)容的元素類型,創(chuàng)建一個單獨(dú)的表格,其中存放未析數(shù)據(jù),通過父元素主鍵鏈接到父表格。
對于此元素類型的每個單值屬性和只包含未析數(shù)據(jù)內(nèi)容、只出現(xiàn)一次的子元素,在該表格中創(chuàng)建一個字段。如果元素類型或者屬性是可選的,可以讓設(shè)置該字段為空值。
對于每個多值屬性和多次出現(xiàn)的子元素,創(chuàng)建一個單獨(dú)的表格來存儲數(shù)值,并且通過父元素主鍵鏈接到父表格。
對每個有元素或者混合內(nèi)容的子元素,通過父元素主鍵將父元素表格和子元素表格相連接。
下面的過程(經(jīng)簡化)說明了如何從一個關(guān)系型的結(jié)構(gòu)生成一個DTD:

對于每個表格,新建一個元素;
對于表格中的每個字段,新建一個屬性或者是只包含未析數(shù)據(jù)的子元素;
對于每個表格字段中提供主鍵的主鍵/外鍵的關(guān)系都新建一個子元素。
不幸的是,這些過程還存在著一些缺陷。例如,DTD中沒有方法預(yù)先準(zhǔn)確地規(guī)定數(shù)據(jù)類型或者字段長度。

因為任何的預(yù)先定義(例如通過讀取一個示例文檔)在讀取其它“類型”的文檔或者其他文檔中包含有超過字長內(nèi)容的文檔時就會產(chǎn)生錯誤。(長久之策是使用XML schema文檔的數(shù)據(jù)類型。)簡單來說,當(dāng)從一關(guān)系型結(jié)構(gòu)生成DTD時,是沒有辦法預(yù)先判斷子元素“應(yīng)該”出現(xiàn)的順序或者字段(如數(shù)據(jù)庫內(nèi)部的行標(biāo)識)是否該進(jìn)行完全轉(zhuǎn)換。在以上兩種情況中都可能產(chǎn)生命名的沖突。

盡管有這樣那樣的缺陷,但是這些方法仍然能夠很好地奠定在關(guān)系型結(jié)構(gòu)和DTD之間互相轉(zhuǎn)換的起點(diǎn)?!?br>
 
 
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
基于XML的數(shù)據(jù)庫總體分析
XML和數(shù)據(jù)庫之間相互的映射
XML與數(shù)據(jù)庫
XML解析 DOM(文檔對象模型)與 SAX(XML簡易應(yīng)用應(yīng)用程序編程接口)_VICTO...
xml中該使用屬性還是元素
系統(tǒng)架構(gòu)師學(xué)習(xí)筆記(一)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服