XML完成異構數(shù)據(jù)庫間轉換的完成與區(qū)分(轉)
發(fā)表時間:2023-08-19 來源:明輝站整理相關軟件相關文章人氣:
[摘要]XML實現(xiàn)異構數(shù)據(jù)庫間轉換的實現(xiàn)與分析 類型: XML/Biztalk 收錄時間: 2002-4-8 9:20:00 XML中一種擴展的標記語言,它具有很好的擴展性標記.本文通過XML實現(xiàn)不同數(shù)據(jù)...
XML實現(xiàn)異構數(shù)據(jù)庫間轉換的實現(xiàn)與分析
類型: XML/Biztalk 收錄時間: 2002-4-8 9:20:00
XML中一種擴展的標記語言,它具有很好的擴展性標記.本文通過XML實現(xiàn)不同數(shù)據(jù)庫的定義,實現(xiàn)對XML數(shù)據(jù)庫的訪問和異構數(shù)據(jù)庫之間的互訪.
關鍵詞:XML異構數(shù)據(jù)庫信息交換數(shù)據(jù)庫訪問
1引言
XML(ExtensibleMarkupLanguage)它是由W3C組織于1998年2月
制定的一種通用語言規(guī)范,是SGML的簡化子集,專門為Web應用程序而設計.XML作為一種可擴展性標記語言,其自描述性使其非常適用于不同應用間的數(shù)據(jù)交換,而且這種交換是不以預先規(guī)定一組數(shù)據(jù)結構定義為前提.XML最大的優(yōu)點是它對數(shù)據(jù)描述和數(shù)據(jù)傳送能力,因此具備很強的開放性.為了使基于XML的業(yè)務數(shù)據(jù)交換成為可能,就必須實現(xiàn)數(shù)據(jù)庫的XML數(shù)據(jù)存取,并且將XML數(shù)據(jù)同應用程序集成,進而使之同現(xiàn)有的業(yè)務規(guī)則相結合.開發(fā)基于XML的動態(tài)應用,如動態(tài)信息發(fā)布、動態(tài)數(shù)據(jù)交換等,前提是必須有支持XML的數(shù)據(jù)庫支持.XML提供描述不同類型數(shù)據(jù)的標準格式--例如:約會記錄、購買定單、數(shù)據(jù)庫記錄、圖形、聲音等--并且可一致而正確地解碼、管理和顯示信息.XML一開始就建構在Unicode(統(tǒng)一碼)之上,提供了對多語種的支持,具有世界通用性.
2XML與數(shù)據(jù)庫的結合
XML數(shù)據(jù)源有多種多樣,根據(jù)具體的應用,大概可分為下面三種:一種是XML純文本文檔;第二種是關系型數(shù)據(jù)庫;第三種則來源于其他各種應用數(shù)據(jù),如郵件、目錄清單、商務報告等.其中,第一種來源,即XML純文本文檔是最基本的也是最為簡單的,將數(shù)據(jù)存儲于文件中,其最大的優(yōu)點在于可以直接方便地讀取,或者加以樣式信息在瀏覽器中顯示,或者通過DOM接口編程同其他應用相連.第二種數(shù)據(jù)來源是對第一種來源的擴展,目的是便于開發(fā)各種動態(tài)應用,其優(yōu)點則在于通過數(shù)據(jù)庫系統(tǒng)對數(shù)據(jù)進行管理,然后在利用服務器端應用(如ASP、JSP、Servlet)等進行動態(tài)存取.這種方式最適合于當前最為流行的基于三層結構的應用開發(fā).第三種數(shù)據(jù)由于來源廣泛,因此需要具體情況具體對待.本文的分析主要針對前兩種數(shù)據(jù)來源進行分析.
對于XML文檔,可以通過DOM(DocumentObjectModel)讀取XML文檔中的節(jié)點,是最基本也是最底層的XML存取技術.DOM是W3C的一種技術標準,實際上是提供一組API來存取XML數(shù)據(jù).DOM可以通過JavaScript,VBScript等腳本程序來實現(xiàn),也可通過C++、Java等高級語言來實現(xiàn).
其次,也可通過DSO(DataSourceObject)進行XML的數(shù)據(jù)綁定可以方便地將XML節(jié)點同HTML標記捆綁,從XML文檔中讀取或寫入數(shù)據(jù),就象訪問MicrosoftAccess或MicrosoftSQLServer一樣;而HTTP+SQL是Microsoft新近提出的SOAP方案的核心,其基本原理是通過基于HTTP協(xié)議的URL方式直接訪問SQLSERVER數(shù)據(jù)庫,并返回以XML或HTML數(shù)據(jù)格式的文檔.
XML數(shù)據(jù)庫又分為兩種:一種是以XML原始格式存儲的數(shù)據(jù)庫我們稱為"native-XML數(shù)據(jù)庫";另一種是以XML格式存入和導出,且它本身又是一個數(shù)據(jù)庫,我們稱為"XML-enabled數(shù)據(jù)庫".
2.1native-XML數(shù)據(jù)庫
對于native-XML數(shù)據(jù)庫的訪問,我們可以通過XQL語言來完成.通過XQL我們可以對一個或多個XML文件進行查詢,它返回一個封裝在根元素(sql:result)的節(jié)點集,這個節(jié)點集也是一個XML文件.
2.2XML-enabled數(shù)據(jù)庫
因為數(shù)據(jù)是以XML格式存入和導出,且它本身又是一個數(shù)據(jù)庫,這就涉及到異構數(shù)據(jù)庫間的互訪問題.XML提供了一種連接關系數(shù)據(jù)庫和面向對象數(shù)據(jù)庫以及其他數(shù)據(jù)庫系統(tǒng)之間的訪問技術,也就是說我們可以先對關系數(shù)據(jù)庫和面向對象數(shù)據(jù)庫以及其他數(shù)據(jù)庫系統(tǒng)進行訪問,然后生成XML文件,再將文件存入數(shù)據(jù)庫或作其他處理.
3使用JSP連接數(shù)據(jù)庫并進行查詢生成XML文檔
我們有許多方法可做到連接數(shù)據(jù)庫并進行查詢,生成XML文檔.以下是通過JSP技術對SQLServer存儲的XML文檔進行查尋并提取這些文檔,然后將其傳送給用戶.(SQLServer數(shù)據(jù)庫本身就支持XML格式.對于不支持XML的數(shù)據(jù)庫,您可以將XML文檔存儲為字符大對象(CLOB),并以文本塊的方式檢索文檔.)Java語言應用程序的開發(fā)者提供了一個通用的SQL數(shù)據(jù)庫訪問和存儲結構,即JDBC,它是一種用于數(shù)據(jù)庫訪問的應用程序編程接口(API),開發(fā)者可以通過JDBC產品組件之一JDBC-ODBC橋來完成:與數(shù)據(jù)庫建立連接、發(fā)送語句、處理結果等工作.在與數(shù)據(jù)庫建立連接之前,必須將橋驅動程序類sun.jdbc.odbc.JdbcOdbcDriver添加到名為jdbc.drivers的java.lang.System屬性中,或用Java類加載器將其顯式加載.顯式加載代碼如下:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
該驅動程序可用于Oracle、Sybase、等數(shù)據(jù)庫.我們可以用一個簡單的例子來說明如何在用JDBC接口來實現(xiàn)數(shù)據(jù)庫的連接,執(zhí)行一個查詢(其結果為一組XML文檔),分析查詢結果,并將分析過的數(shù)據(jù)寫入輸出流中.以下是與此關系最密切的代碼部分:
注意,在安裝數(shù)據(jù)庫以后,您需要完成以下三件事情才能使此代碼工作:
首先,將DbOwner、DbUserid和DbPasswd變量改為適合系統(tǒng)的適當值.
//一定要正確更改這三個字符串,否則servlet不會工作.
DbUserid="xxxxxx";
DbPasswd="xxxxxx";
DbOwner="xxxxxx";
<!--使用SQL數(shù)據(jù)庫-->
<!--首先導入一些必要的packages-->
<!--開始導入packages-->
<%@pageinfo="packagedbxml.sax"%>
<%@pageimport="org.xml.sax.*"%>
<%@pageimport="org.xml.sax.InputSource"%>
<%@pageinfo="databasehandler"%>
<%@pageimport="java.io.*"%>
<%@pageimport="java.util.*"%>
<%@pageimport="java.sql.*"%>
<%@pageimport="javax.servlet.*"%>
<%@pageimport="javax.servlet.http.*"%>
<!--導入結束-->
<%
try
{
res.setContentType("text/xml");
//加載使用適合您的系統(tǒng)的驅動程序
//下面的代碼為加載JDBD-ODBC驅動程序
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(Exceptione)
{
System.out.println("Can'tgetthedriver!");
e.printStackTrace();
}
//建立連接
//第二步是用適當?shù)尿寗映绦蜻B接到DBMS,假定已建立源數(shù)據(jù)庫test,在test中已建立表name
Stringurl="jdbc:odbc:test";
Connectioncon=DriverManager.getConnection(url,"administrator","password");
//"administrator","password"是用戶名和口令
//然后創(chuàng)建一個JDBC聲明
Statementstmt=con.createStatement();
//執(zhí)行聲明,顯示結果集。我們從每行取出XML文檔,
//對其進行分析,然后打印DOM樹。當沒有更多的行時,rs.next()返回false。
ResultSetrs=stmt.executeQuery(SQL);
while(rs.next())
{
StringnextOrder=rs.getString(1).trim();
Documentdoc=null;
StringReadersr=newStringReader(nextOrder);
InputSourceiSrc=newInputSource(sr);
try
{
parser.parse(iSrc);
doc=parser.getDocument();
}
catch(Exceptione)
{
System.err.println("Sorry,anerroroccurred:"+e);
}
if(doc!=null)
printDOMTree(doc,out);
}
rs.close();
stmt.close();
con.close();
%>
返回的XML文檔可以通過指定的XML模式來定義,三種模式為:RAW、AUTO、EXPLICIT。還可以用SELECT語句中附加FORXML來返回XML格式數(shù)據(jù)作為對XML模式的一種補充,通過在FORXML中指定DTD或XMLschema來達到對返回XML文檔的格式化.此外我們利用基于XML的UPDATE語句來更新數(shù)據(jù)庫中的記錄,SQLServer支持基于XML的插入、刪除、修改等數(shù)據(jù)庫更新操作.
4XML模式與關系模式的相互轉換
為了完成異構數(shù)據(jù)庫間的通訊,必須實現(xiàn)RDMS→XML→RDMS的轉換.一個具體的XML模式到關系模式的數(shù)據(jù)轉換需要涉及較為復雜的XML格式分析處理及相應的數(shù)據(jù)庫操作及有效性校驗.我們通過對XML的數(shù)據(jù)模型與關系模型的特征的比較,認為兩者轉換的實質是(1)從XML中的數(shù)據(jù)(存在方式可以是Content、屬性值、元素名等)到關系模式中字段的映射;(2)從XML中數(shù)據(jù)的相互位置關系到關系模式中元組與元組的關系及元組與字段的關系的映射.XML模式與關系模式的轉換的核心與實質就是按XPDL編寫的轉換規(guī)則和轉換規(guī)則的執(zhí)行解釋方法,下面就依次分別介紹從XML模式到關系模式的轉換規(guī)則的組成部分和執(zhí)行方法,以及從關系模式到XML模式的轉換規(guī)則的組成部分和執(zhí)行方法.從XML模式到關系模式轉換的轉換規(guī)則腳本:由關系模式的定義和XML模式到關系模式轉換規(guī)則的定義組成;從關系模式到XML模式轉換的轉換規(guī)則腳本:由關系模式的定義和關系模式到XML模式轉換規(guī)則的定義組成.
4.1XML模式到關系模式轉換
(1)關系模式定義
下面是一個關系模式定義的例子
<DataSchemaDefinition>
<DataSourceid="iCategoryData"type="ODBC"sourcename="iCatSRC"username="sa"password=""/>
<DataSchema>
<Entityid="category"datasource="iCategoryData">
<Structure>
<Fieldid="nodeid"type="char"length="10"cannull="no"primary_key="yes"/>
…
</Structure>
<Constrain>
<Referencefield="fathernodeid"refentity="category"reffield="nodeid">
<ExceptionValuevalue="0"/>
</Reference>
…
</Constrain>
</Entity>
…
</DataSchema>
</DataSchemaDefinition>
一個關系模式的定義分兩部分:數(shù)據(jù)源(DataSource)定義和實體(包括關系實體)的定義。數(shù)據(jù)源的定義不外乎ODBC/JDBC/BDE等幾種,定義它的目的在于轉換程序的跨平臺的通用性。實體定義包含兩部分:結構定義和約束定義。結構定義類似關系數(shù)據(jù)庫的表定義,包含對每個字段的類型、長度等的定義。約束定義則主要包含對字段的外鍵和引用的約束定義。
(2)XML模式到關系模式轉換規(guī)則(X2RConversion)的定義
XML模式到關系模式的轉換的目標,是將某一種XMLSchema定義好的XML文檔中的Content部分、屬性值部分轉換成關系模式中的某個元組的某個字段的值,而將他們之間的位置關系轉換成關系模式中的外鍵等應用關系。
<X2RConversion>
<Entrance>
<Recordentity="category"id="st_category"path=".department">
<Defaultfield="fathernodeid"value="0"/>
<Nodepath="#id"field="nodeid"/>
…
<Referencefield="rootnodeid"reftype="entity"refvalue="category[nodeid]"refpos="0"/>
<Recordentity="category"id="run_category"path=".department">
<Nodepath="#id"field="nodeid"/>
…
<Referencefield="fathernodeid"reftype="entity"refvalue="category[nodeid]"refpos="-2"/>
…
</Record>
…
</Record>
</Entrance>
</X2RConversion>
轉換的基本算法是遍歷等待轉換的XML文檔的DOM樹,對于每個結點而言,從根到該結點的路徑作為其轉換標識.每一個轉換入口是一個轉換標識后綴,當某一轉換入口轉換標識后綴匹配當前結點的轉換標識,則啟動當前轉換入口對應的轉換規(guī)則.所有的轉換入口都定義在Entrance元素內.每一個轉換規(guī)則都是由一個Record元素開始的,一個Record元素的下層元素表示了其對應的元組的新記錄的創(chuàng)建、數(shù)據(jù)的轉換規(guī)則及其關聯(lián)元組的的新記錄的創(chuàng)建、數(shù)據(jù)的轉換規(guī)則,也就是說Record元素是可嵌套的.
此外,轉換還將遵循以下原則:任意兩個Record轉換實例的轉換位置所對應的元素絕不相同,但被Node標定的元素并不受該限制,也就是說在轉換算法中只記住每個Record實例的執(zhí)行位置;而在同層規(guī)則執(zhí)行順序上,是按Default元素、Node元素、Reference元素、Record元素的次序的,一個次序在后的有效操作是可以覆蓋次序在前的有效操作的.
4.2關系模式到XML模式轉換
(1)關系模式到XML模式的轉換規(guī)則(R2XConversion)的定義
從關系模式到XML模式的轉換,實質上是一個將一個預先定義好的視圖運行,并將當前視圖內容轉化成XML格式顯示.在具體實現(xiàn)上,我們是將格式和視圖定義融合在一起.在關系模式到XML模式的轉換中,關系模式定義段中的entity可以對應一個SQL查詢語句,也就是使用SQL語句代替原先在id中指明的表名,所有的數(shù)據(jù)準備基本在關系模式定義段已經完成.下面是一個關系模式到XML模式的轉換規(guī)則的示例,它的執(zhí)行是通過深度遍歷轉換規(guī)則,逐個分枝拓展創(chuàng)建,并最終完成整個XML文檔DOM樹的創(chuàng)建.同樣,其中僅支持一條路徑擴展出的子樹中的相對位置的關聯(lián)轉化,其具體結構與前面類似這里就不贅述.
5結束語
目前數(shù)據(jù)庫已不再僅僅局限于存儲數(shù)據(jù),而是向著更深層次、更多樣化發(fā)展,它已經廣泛運用于OLAP、OLTP、數(shù)據(jù)倉庫、數(shù)據(jù)挖掘、移動計算、嵌入式計算和Web應用等諸多方面.現(xiàn)在,數(shù)據(jù)庫技術也已經深入到各行各業(yè),尤其在媒體、金融、交通、商業(yè)等領域得到了廣泛應用.本文則著重講解了對XML數(shù)據(jù)庫的訪問技術和異構數(shù)據(jù)庫之間通過轉換成XML實現(xiàn)互訪.我們有理由相信,XML同數(shù)據(jù)庫的相結合將隨著XML技術的發(fā)展,會實現(xiàn)更強大的功能.
參考文獻
[1]http://www.xmlsoftware.com/
[2]楊鈺,盧銀娟,趙昊彤等,JSP網(wǎng)絡開發(fā)技術.人民郵電出版社
[4]http://www.microsoft.com/xml/xsl/msxsl-f.htm
[5]http://www.51xml.com/forum/search_forum_xml.xml
[6]MichaelMorrison,etal.XML揭秘---入門-應用-精通.清華大學出版社,2000.8