DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> 使XML本地化和關系化
使XML本地化和關系化
編輯:XML詳解     
Oracle XML DB提供本地化格式和關系數據庫訪問。

  XML正快速地成為企業間數據交換的首選語言。然而,大多數企業把它們的數據存儲在如Oracle9i數據庫那樣的關系數據庫中。那麼你怎樣將分層次的、以文檔為中心的XML和表格式的面向集合的關系數據庫連接起來?你是把XML文檔作為文件存儲在文件系統中?還是把XML文檔分開,把數據存儲在關系數據庫中?在兩種方法間進行選擇時需要根據你使用數據的方式進行權衡。但如果你不必進行選擇呢?如果你可以同時使用兩種方法,你會如何做呢?你可以使用Oracle9i數據庫第2版中叫做XML DB知識庫(XML DB Repository)的新特性。

  XML DB知識庫說明

  Oracle XML DB既不是一個單獨的產品也不是一個你必須安裝的單獨選項。Oracle XML DB指的是在直接內置於Oracle9i數據庫的XML特性和技術的集合。其中一個關鍵特性就是XML DB知識庫。這個知識庫使你能夠在Oracle9i數據庫第2版中直接存儲XML文檔。一旦你的XML文檔存儲在該知識庫中,你就能夠以XML為中心的方式或以關系為中心的方式訪問XML數據。

  要把XML數據存儲在你的數據庫中,你只需簡單地使用FTP、HTTP或WebDAV等所有行業標准的協議寫一個XML文檔文件即可。而從數據庫中獲取XML數據就像執行一個SQL查詢或使用上述協議之一讀文件一樣簡單。

  場景設置

  假設你正在銷售獨立藝術家制作的CD。你需要和主要的音樂商店、在線站點和藝術家自身交換信息。你已經開發了用來描述CD內容的如清單1所示的XML文檔格式,現在想利用XML DB 知識庫把信息存儲在數據庫中。你想通過SQL輕松地訪問數據並輕松地訪問本地XML文檔。簡而言之,你希望數據既具有關系特性又具有層次特性。在這篇文章中,我是你的DBA,實現它是我的工作。

  注冊XML模式

  我的第一步是使用XML DB知識庫注冊你的XML模式。當我注冊一個XML模式時,該知識庫創建能夠保存那個模式實例的對象類型和對象表。下面對通過SQL*Plus執行的dbms_xmlschema.registerURI的調用從http://gennick.com/cd.xsd獲取如清單2中所示的XML模式,然後注冊它:

BEGIN
dbms_XMLschema.registerURI(
'cd.xsd',
'http://gennick.com/cd.xsd');
END;
/

注意:我除了需要對各種模式對象類型的CREATE權限外,為了注冊模式和創建這篇文章中的例子我還需要ALTER SESSION和QUERY REWRITE權限。

  清單3顯示了由於注冊CD模式而創建的一些結構和對象。一個名字是CD331_TAB的XML表被創建來保存模式的實例:在知識庫中的每個CD文檔將由這個表中的一行來表示。我可以通過查詢USER_XML_TABLES數據字典視圖得到XML表的一個列表。在這個例子中,我簡單地在模式注冊前後查詢視圖然後查找新的表名。CD331_TAB中的每一行將包含一個CD327_T類型的實例,這個類型對應於我們的XML模式來創建的。XML文檔的第一層元素被表示為CD327_T類型的屬性,屬性名和XML字段名相匹配。例如,該對象類型中的Title字段直接對應於XML模式中的Title元素。Songs字段對應於Songs元素。Songs是XML模式中的一個復雜元素,同樣地它被映射到另一個對象類型"Songs328_T"。如果我使用SQL*Plus命令DESCRIBE "Songs328_T",並繼續研究Songs字段的定義,我會看到歌曲集合最終被作為一個VARRAY實現,在VARRAY中,每個元素都表示一首歌曲。

  當我注冊一個模式時,我可以控制Oracle9i數據庫生成的對象和類型名;我也可以控制被用來存儲我的XML數據的特定數據類型。可以通過使用XML DB知識庫定義的屬性和oraxdb名字空間的部分注釋XML模式來進行這些控制。當我不提供那些屬性時,Oracle9i數據庫為我生成它們,我可以通過查看存儲在該知識庫中的模式版本來簡單地浏覽Oracle9i數據庫所生成的內容。圖1說明了你如何能夠方便地訪問知識庫數據,這次是通過HTTP,使用一個標准的Web浏覽器來訪問的。圖1顯示了我的知識庫中的CD模式的一部分,你可以看到模式注釋,它們全都以"oraxdb"開始。注意,URL使用8080端口,它是知識庫使用的默認HTTP端口。

  默認情況下,注冊模式時創建的全部對象將屬於注冊模式的用戶所有。在這個例子中,我擁有清單3中的表和類型以及其他與該CD模式相關的所有對象。因為是我注冊了那個模式,所以任何我保存到知識庫中的XML文件(是該CD模式的實例)將被拆開然後存儲在CD331_TAB表中。該模式和注冊是特定於我的。其他用戶保存的CD文件將不會被存儲在我的表中。你可以對dbms_XMLschema.register模式使用一個可選參數,來創建一個影響所有用戶的全局模式,以便所有用戶都可以把CD文檔保存到該表中。

  創建XML文件夾

  如果要把CD XML文檔存儲在XML DB知識庫中,我就需要一個存放它們的文件夾。要創建一個文件夾,我作為SYSTEM用戶登錄到Oracle並執行清單4中的PL/SQL塊。調用dbms_xdb.createfolder創建名為/CD的第一層文件夾。PL/SQL塊然後使用dbms_xdb.setAcl過程創建把所有文件夾權限賦予擁有者(也就是SYSTEM用戶)、把讀權限賦予其他所有用戶的訪問控制列表(ACL)。下一步為了把文件夾的擁有者由SYSTEM改變為GENNICK,需要對資料庫的RESOURCE_VIEW調用UPDATE語句。在文件夾創建後,提交是重要的;直到你提交後,該文件夾才對其他會話可見。現在我可以作為GENNICK使用FTP或WebDAV連接並把XML文件保存到/CD文件夾中。

保存XML文檔

  一旦我注冊了模式然後創建一個文件夾來保存我的XML文檔,把文檔保存到知識庫就像拷貝文件那樣簡單。清單5顯示了一個拷貝(清單1中所示的)LegendsOfTheGreatLakes.XML文件到知識庫的FTP會話。FTP open命令使用的端口2100是知識庫為FTP會話使用的默認端口。注意,我可以不使用FTP,而是像以前那樣在WebDAV和Windows Web文件夾簡單地使用Windows拷貝和粘貼操作。

使XML本地化和關系化圖片1 更多內容請看XML詳解  開發應用專題,或

  使用RESOURCE_VIEW

  你應該知道的一個重要視圖是名為RESOURCE_VIEW的視圖。RESOURCE_VIEW視圖為你所訪問的知識庫中的每個文檔和文件夾返回一行。例如,通過執行下面的查詢你可以得到/CD文件夾下所有XML文檔的一個列表。

SELECT any_path
FROM resource_vIEw
WHERE under_path(res,'/CD')=1
AND extractValue(res,
'/Resource/ContentType')='text/XML';

ANY_PATH
-------------------------------
/CD/Gospel/NothingLess.XML
/CD/LegendsOfTheGreatLakes.XML

  上面顯示的新的UNDER_PATH函數使你能夠測試一個給定的知識庫資源是否在你指定的文件夾(或路徑)中。在這個例子中,我使用該函數把查詢結果限定在/CD文件夾及其子文件夾的資源中。通過使用對基本表所創建的一個層次式域索引可以使對RESOURCE_VIEW視圖進行的基於路徑的查詢更高效。這個索引是該知識庫的一部分;你不用創建它。

使XML本地化和關系化圖片2

圖1:XML DB知識庫中示例CD模式的一部分

資源視圖中的RES字段並不代表資源自身,而只是代表資源的元數據。對RES字段運用新的extractValue函數檢查每個資源的內容類型。因此查詢的結果被進一步地限制到指向XML文檔的路徑。'/Resource/ContentType'語法代表XPath表示法。XPath是指定XML文檔各部分的標准表示法;你將在許多對XML數據的查詢中使用它。

  給定一個資料庫路徑,你可以使用新的XDBUriType對象類型檢索全部或部分基本XML文檔。清單6顯示兩個查詢。第一個查詢是對以上代碼的擴展,使用XDBUriType來檢索/CD文件夾下的所有XML文檔。為了只提取CD標題,清單6中的第二個查詢進行了進一步的改進,把標准的XPath語法附加到URL的末端。

  對知識庫數據的關系訪問

  也可以通過直接訪問基本表來訪問知識庫中的XML數據。我注冊CD模式時創建的基本表是CD331_TAB。你可以直接對這個表編寫查詢語句,但這些查詢必須是支持XML的。要簡化通過設計用於關系數據的報表工具訪問XML數據,你可以創建一個如清單7中所示的視圖。除了視圖,清單7還對藝術家名字創建了一個索引。視圖和索引使我能夠有效地執行諸如下面的標准關系查詢:

  SELECT title
  FROM cd_master
  WHERE artist='Carl Behrend';

  更新XML數據

  不幸的是,因為在cd_master視圖中的所有字段都是基於SQL函數的,所以該視圖不能被更新。然而,可以更新知識庫中的XML數據;我只需要如下所示更新注冊模式時所創建的基本表:

UPDATE CD331_TAB cd
SET VALUE(cd) = updateXML(
value(cd),
'/CD/Website/text()',
'http://greatlakeslegends.com/
legends.htm');

  注意這個新的updateXML函數中的XPath語法的使用。路徑'/CD/Website/text()'說明我要更新CD文檔的Website元素的文本。updateXML的第三個參數為那個文本指定新值。這是一個恰當的更新,並非常高效。XML DB知識庫並不需要重建被改變的整個XML文檔。因為模式被注冊了,所以XML DB知識庫能夠以在底層對象結構只有Website屬性被觸及的方式重寫這個查詢。

  結論

通過使用XML DB知識庫,你可以把XML文檔存儲在數據庫中,並使用標准的互聯網協議訪問那些文檔。同時,你還可以使用標准的關系查詢訪問相同的XML文檔或是那些文檔的部分。你沒有XML數據和關系數據,只有數據。"XML"和"關系"只是查看數據的不同范例。通過把數據從范例中分離出來,Oracle9i保護你最重要的資產之一--數據--免受范例改變的影響。

  Jonathan Gennick (Jonathan@Gennick.com) 是一個經驗豐富的Oracle DBA和Oracle認證專家(OCP)。他目前以寫作為生,最近剛剛完成《Oracle SQL*Plus袖珍參考手冊第二版》(Oracle SQL*Plus Pocket Reference,Second Edition 2002年O'Reilly & Associates出版一書。

 

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved