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