999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于模型映射方法實現XML與關系數據的相互轉換

2014-09-24 12:09:51張屹
軟件工程 2014年6期

張屹

摘 要:基于模型映射方法可以獨立于XML文檔的DTD或Schema,在關系型數據庫中設計固定的關系模式用于存儲XML文檔。采用Dietz編碼方法對XML文檔中的元素進行編碼,通過編碼值對反應元素之間的祖先/后裔關系,并在關系表中存儲元素的Dietz編碼值,并依此作為依據設計算法將存儲于關系數據庫中的XML文檔進行還原。

關鍵詞:模型映射;關系數據庫;XML;Dietz編碼

中圖分類號:TP311.1 文獻標識碼:A

Implementation of Mutual Conversion Between XML and RDBMS

Based on Model Mapping Method

ZHANG Yi

(Library of Tianjin Medical University,Tianjin 30070,China)

Abstract:Model-based mapping method can be independent of the XML document DTD or Schema.This paper design a fixed relational pattern in order to store XML documents based on model mapping method.Firstly elements in XML are encoded by Dietz coding method.The pair of encoded value expressed ancestor/descendant relationships of elements.RDBMS stores these values.Algorithm can restore XML documents which store in RDBMS based on Dietz coding values.

Keywords:model mapping;RDBMS;XML;dietz encoding method

1 引言(Introduction)

可擴展的標識語言XML(Extensible Markup Language)與傳統的關系數據明顯不同,SQL Server、Oracle等數據庫管理系統為關系數據提供了數據存儲、查詢以及分析這些功能支持,而XML僅用于存儲數據。XML是一種半結構化數據,由于其自身結構特點導致對于XML數據不能方便的進行數據查詢和更新操作,如何有效的對XML進行查詢和存儲成為XML研究領域的重要研究方向。

關系數據庫技術是目前應用最為廣泛且技術成熟的數據存儲和處理技術,它為數據提供了數據定義、數據操縱以及完整性約束的支持,因此使用關系表存儲XML文檔是一種較為理想的解決方案。關系表是一種二維表結構,而XML文檔是樹形結構,兩者在數據結構上存在差異,如何實現這兩種數據結構的相互轉化是目前相關研究工作的熱點,本文提出了獨立于XML文檔DTD或Schema的模型映射存儲方法,采用固定的關系模式存儲XML文檔并且保存文檔中元素結點的編碼值。

2 相關研究(Related works)

相關研究成果將XML映射為關系模式進行存儲分為兩類方法:模型映射(Model-Mapping)和結構映射(Structure-Mapping)[1]。結構映射方法中,需要將XML Schema(或DTD)映射為關系模式,再將XML文檔存儲在相應的關系模式中,文獻[2-4]介紹了如何根據XML文檔DTD或模式映射為關系模式存儲XML。使用結構映射方法,關系表之間的參照完整性關系可以反映元素之間的祖先/后裔關系,通過關系表之間的連接操作可以將關系數據還原為原先的XML文檔。由于關系模式依賴于XML文檔的結構,映射的關系模式依照XML文檔結構的變化而發生變化。模型映射方法獨立于XML文檔的結構,Xpev[5]系統是一種典型的模型映射方法。采用固定的關系模式存儲XML,但是缺點在于由于使用不同的關系表存儲XML文檔樹不同類型的結點就無法反應文檔中元素之間的祖先/后裔關系,進而無法將存儲好的文檔進行還原。

3 關系數據庫存儲和還原XML文檔(Store/restore

XML in RDBMS)

3.1 Dietz編碼標記XML文檔元素

本文所提出的方法是一種模型映射方法,與以往的研究成果相比有點在于:(1)采用固定的關系模式存儲XML文檔,不依賴于文檔結構,能夠存儲不同結構的XML;(2)使用Dietz編碼[6]這種區間編碼方式對XML文檔中元素進行編碼并存儲,在關系表中也能反應所存儲元素的祖先/后裔關系;(3)通過關系表保存的區間編碼所反映元素之間的祖先/后裔關系可以將關系數據還原為XML文檔,克服了以往模型映射方法所存儲XML文檔無法進行還原的問題。

定義1 XML文檔表示為樹型結構,文檔樹中的每個元素結點被賦予一個二元組編碼值對,分別代表元素先序遍歷和后序遍歷值。由于文檔樹的每個元素結點u在先序遍歷(后序遍歷)序號中必然出現在它的后裔元素結點v之前(之后),因此,元素u和v之間是祖先/后裔關系,當且僅當pre(u)

圖1 XML文檔示例

Fig.1 XML document demo.

圖2 XML文檔元素Dietz編碼

Fig.2 Encoding elements in XML by Dietz method

3.2 關系數據庫存儲XML文檔

設計固定結構關系模式即采用模型映射方法來存儲 XML 文檔。本文根據XPath數據模型和XML文檔的編碼方法設計出一種全新的模型映射方法。

表Document存儲的是數據庫中需要保存的XML文檔的文件名。表Element、Attribute和Text分別保存的是數據庫當前存儲XML文檔元素、屬性、文本這三種類型的結點。屬性ElementPre和ElementPost用于表示元素的Dietz編碼值對,由于XML文檔中元素至多有一個父元素,因此屬性ParentPre表示當前元素父元素的先序編碼。表Element中屬性TagName表示元素標記名。表Attribute和表Text同樣還要要保存當前元素的屬性名、屬性值以及元素文本內容。

圖3 存儲XML文檔的關系模式

Fig.3 Relational pattern of storing XML

算法1:關系數據庫存儲XML文檔

輸入:XML文檔

StoreXMLDoc(XMLDoc)//該函數用來描述存儲XML文檔的算法

① 獲取XML文檔或文檔片段根元素getRootElement(XMLDoc);

② 對當前元素進行Dietz編碼DietzEncode(RootElement);

③ 判斷當前結點是否包含子結點

if(RootElement.haschild){

if(child instance of Text)// 如果為Text,在表Text保存該結點以及當前元素Dietz編碼值

else if(child instance of Attribute)// 子節點類型如果為Attribute,在表Attribute保存該結點以及當前元素Dietz編碼值

else StoreXMLDoc(Element)//子結點類型如果為Element,以當前元素的子元素為參數遞歸調用函數StoreXMLDoc()

}

else

InsertElement(EncodePair, Element); //如當前元素無子結點,在表Element中保存該元素以及該元素的Dietz編碼值對

3.3 關系數據還原為XML文檔

關系模式中存儲了當前元素及其父元素的Dietz編碼值,兩組編碼值之間通過參照完整性關系來反映元素結點之間的父子關系。首先構造XML文檔根元素結點,再根據當前元素結點的先序編碼在Element表中查找屬性ParentPre取值與之相對應的元組,將這些元組構造為已構造好元素的子元素,遞歸的執行以上過程直到無法繼續構造出子元素為止。這種方法能夠使還原出來的XML文檔與原文檔一致。

算法2:關系數據庫還原XML文檔

輸入:關系數據

輸出:XML文檔

ConstructXMLDoc()//還原XML文檔{

RootElement = new Element(TagName);//當前元組屬性TagName的取值,構造XML文檔根元素

XMLDocument = new Document(RootElement);//根據該根元素構造XML文檔

ConstructAttribute(ElementPre);//根據當前元組屬性ElementPre的取值,構造當前根元素的屬性

ConstructText(ElementPre);//根據當前元組屬性ElementPre的取值,構造當前根元素的文本

ChildElementList=RootElement.getElementPre();//查找以根元素為父元素的元組集合

for(i=0;i

ChildElement=new Element(ChildElementList.get(i).getTagName());

ConstructAttribute(ChildElementList.get(i).getElementPre());

ConstructText(ChildElementList.get(i).getElementPre());

ChildElementSet=RecursiveConstruct(ChildElement);//當前元組為參數調用遞歸函數RecursiveConstruct(),構造當前元素的子元素集

XMLDocument.getRootElement().addContent(ChildElement);//將構造的元素集添加為當前元素的子元素,形成XML文檔

}

Output(XMLDocument);//輸出XML文檔;

}

Element RecursiveConstruct(CurrentElement){ //遞歸函數是用來構造當前元素的子元素

ChildElementList(CurrentElement.getElementPre());

for(i=0;i< ChildElementList.size();i++){

ConstructAttribute(ChildElementList.get(i).getElementPre());

ConstructText(ChildElementList.get(i).getElementPre());

CurrentElement.addContent(RecursiveConstruct(ChildElementList.get(i)));//遞歸調用RecursiveConstruct()將構造的元素集添加為當前元素的子元素

}

4 結論(Conclusion)

文章所提出的方法獨立于文檔結構采用固定關系模式存儲XML文檔,同時克服以往模型映射方法中無法還原出所存儲的XML文檔的缺點。通過在關系模式中存儲元素的Dietz編碼值對形成的參照完整性關系來反映元素之間的父子關系。通過關系表之間的連接操作能夠將存儲在關系數據庫中的XML文檔還原出來。

參考文獻(References)

[1] 萬常選,劉云生.基于關系數據庫的XML數據管理[J].計算機

科學,2003,30(8):64-68.

[2] 周傲英,等.基于關系的XML數據存儲[J].計算機應用,2000,

20(9):9-12.

[3] 楊健,雄前心.XML文檔架構與關系數據模型間的映射研究

[J].計算機工程與應用,2004,40(27):169-172.

[4] 劉偉.基于schema的XML模式與關系模式映射算法的研究[J].

計算機應用與軟件,2006,23:113-115.

[5] 秦杰,楊樹強,竇文華.一種基于模型映射的XML文檔存儲模

型[J].計算機工程與科學,2005,27(11):12-14.

[6] Dietz P F. Maintaining Order in a Linked List [C].In: Lewis H

Retal Eds. Proceedings of the 14th Annual ACM Symposium on

Theory of Computing (STOC'82).San Francisco,California,

USA. May 5-7,1982.New York: ACM Press,1982:122-127.

作者簡介:

張 屹(1983-),男,碩士,助理工程師.研究領域:軟件

工程.

表Document存儲的是數據庫中需要保存的XML文檔的文件名。表Element、Attribute和Text分別保存的是數據庫當前存儲XML文檔元素、屬性、文本這三種類型的結點。屬性ElementPre和ElementPost用于表示元素的Dietz編碼值對,由于XML文檔中元素至多有一個父元素,因此屬性ParentPre表示當前元素父元素的先序編碼。表Element中屬性TagName表示元素標記名。表Attribute和表Text同樣還要要保存當前元素的屬性名、屬性值以及元素文本內容。

圖3 存儲XML文檔的關系模式

Fig.3 Relational pattern of storing XML

算法1:關系數據庫存儲XML文檔

輸入:XML文檔

StoreXMLDoc(XMLDoc)//該函數用來描述存儲XML文檔的算法

① 獲取XML文檔或文檔片段根元素getRootElement(XMLDoc);

② 對當前元素進行Dietz編碼DietzEncode(RootElement);

③ 判斷當前結點是否包含子結點

if(RootElement.haschild){

if(child instance of Text)// 如果為Text,在表Text保存該結點以及當前元素Dietz編碼值

else if(child instance of Attribute)// 子節點類型如果為Attribute,在表Attribute保存該結點以及當前元素Dietz編碼值

else StoreXMLDoc(Element)//子結點類型如果為Element,以當前元素的子元素為參數遞歸調用函數StoreXMLDoc()

}

else

InsertElement(EncodePair, Element); //如當前元素無子結點,在表Element中保存該元素以及該元素的Dietz編碼值對

3.3 關系數據還原為XML文檔

關系模式中存儲了當前元素及其父元素的Dietz編碼值,兩組編碼值之間通過參照完整性關系來反映元素結點之間的父子關系。首先構造XML文檔根元素結點,再根據當前元素結點的先序編碼在Element表中查找屬性ParentPre取值與之相對應的元組,將這些元組構造為已構造好元素的子元素,遞歸的執行以上過程直到無法繼續構造出子元素為止。這種方法能夠使還原出來的XML文檔與原文檔一致。

算法2:關系數據庫還原XML文檔

輸入:關系數據

輸出:XML文檔

ConstructXMLDoc()//還原XML文檔{

RootElement = new Element(TagName);//當前元組屬性TagName的取值,構造XML文檔根元素

XMLDocument = new Document(RootElement);//根據該根元素構造XML文檔

ConstructAttribute(ElementPre);//根據當前元組屬性ElementPre的取值,構造當前根元素的屬性

ConstructText(ElementPre);//根據當前元組屬性ElementPre的取值,構造當前根元素的文本

ChildElementList=RootElement.getElementPre();//查找以根元素為父元素的元組集合

for(i=0;i

ChildElement=new Element(ChildElementList.get(i).getTagName());

ConstructAttribute(ChildElementList.get(i).getElementPre());

ConstructText(ChildElementList.get(i).getElementPre());

ChildElementSet=RecursiveConstruct(ChildElement);//當前元組為參數調用遞歸函數RecursiveConstruct(),構造當前元素的子元素集

XMLDocument.getRootElement().addContent(ChildElement);//將構造的元素集添加為當前元素的子元素,形成XML文檔

}

Output(XMLDocument);//輸出XML文檔;

}

Element RecursiveConstruct(CurrentElement){ //遞歸函數是用來構造當前元素的子元素

ChildElementList(CurrentElement.getElementPre());

for(i=0;i< ChildElementList.size();i++){

ConstructAttribute(ChildElementList.get(i).getElementPre());

ConstructText(ChildElementList.get(i).getElementPre());

CurrentElement.addContent(RecursiveConstruct(ChildElementList.get(i)));//遞歸調用RecursiveConstruct()將構造的元素集添加為當前元素的子元素

}

4 結論(Conclusion)

文章所提出的方法獨立于文檔結構采用固定關系模式存儲XML文檔,同時克服以往模型映射方法中無法還原出所存儲的XML文檔的缺點。通過在關系模式中存儲元素的Dietz編碼值對形成的參照完整性關系來反映元素之間的父子關系。通過關系表之間的連接操作能夠將存儲在關系數據庫中的XML文檔還原出來。

參考文獻(References)

[1] 萬常選,劉云生.基于關系數據庫的XML數據管理[J].計算機

科學,2003,30(8):64-68.

[2] 周傲英,等.基于關系的XML數據存儲[J].計算機應用,2000,

20(9):9-12.

[3] 楊健,雄前心.XML文檔架構與關系數據模型間的映射研究

[J].計算機工程與應用,2004,40(27):169-172.

[4] 劉偉.基于schema的XML模式與關系模式映射算法的研究[J].

計算機應用與軟件,2006,23:113-115.

[5] 秦杰,楊樹強,竇文華.一種基于模型映射的XML文檔存儲模

型[J].計算機工程與科學,2005,27(11):12-14.

[6] Dietz P F. Maintaining Order in a Linked List [C].In: Lewis H

Retal Eds. Proceedings of the 14th Annual ACM Symposium on

Theory of Computing (STOC'82).San Francisco,California,

USA. May 5-7,1982.New York: ACM Press,1982:122-127.

作者簡介:

張 屹(1983-),男,碩士,助理工程師.研究領域:軟件

工程.

表Document存儲的是數據庫中需要保存的XML文檔的文件名。表Element、Attribute和Text分別保存的是數據庫當前存儲XML文檔元素、屬性、文本這三種類型的結點。屬性ElementPre和ElementPost用于表示元素的Dietz編碼值對,由于XML文檔中元素至多有一個父元素,因此屬性ParentPre表示當前元素父元素的先序編碼。表Element中屬性TagName表示元素標記名。表Attribute和表Text同樣還要要保存當前元素的屬性名、屬性值以及元素文本內容。

圖3 存儲XML文檔的關系模式

Fig.3 Relational pattern of storing XML

算法1:關系數據庫存儲XML文檔

輸入:XML文檔

StoreXMLDoc(XMLDoc)//該函數用來描述存儲XML文檔的算法

① 獲取XML文檔或文檔片段根元素getRootElement(XMLDoc);

② 對當前元素進行Dietz編碼DietzEncode(RootElement);

③ 判斷當前結點是否包含子結點

if(RootElement.haschild){

if(child instance of Text)// 如果為Text,在表Text保存該結點以及當前元素Dietz編碼值

else if(child instance of Attribute)// 子節點類型如果為Attribute,在表Attribute保存該結點以及當前元素Dietz編碼值

else StoreXMLDoc(Element)//子結點類型如果為Element,以當前元素的子元素為參數遞歸調用函數StoreXMLDoc()

}

else

InsertElement(EncodePair, Element); //如當前元素無子結點,在表Element中保存該元素以及該元素的Dietz編碼值對

3.3 關系數據還原為XML文檔

關系模式中存儲了當前元素及其父元素的Dietz編碼值,兩組編碼值之間通過參照完整性關系來反映元素結點之間的父子關系。首先構造XML文檔根元素結點,再根據當前元素結點的先序編碼在Element表中查找屬性ParentPre取值與之相對應的元組,將這些元組構造為已構造好元素的子元素,遞歸的執行以上過程直到無法繼續構造出子元素為止。這種方法能夠使還原出來的XML文檔與原文檔一致。

算法2:關系數據庫還原XML文檔

輸入:關系數據

輸出:XML文檔

ConstructXMLDoc()//還原XML文檔{

RootElement = new Element(TagName);//當前元組屬性TagName的取值,構造XML文檔根元素

XMLDocument = new Document(RootElement);//根據該根元素構造XML文檔

ConstructAttribute(ElementPre);//根據當前元組屬性ElementPre的取值,構造當前根元素的屬性

ConstructText(ElementPre);//根據當前元組屬性ElementPre的取值,構造當前根元素的文本

ChildElementList=RootElement.getElementPre();//查找以根元素為父元素的元組集合

for(i=0;i

ChildElement=new Element(ChildElementList.get(i).getTagName());

ConstructAttribute(ChildElementList.get(i).getElementPre());

ConstructText(ChildElementList.get(i).getElementPre());

ChildElementSet=RecursiveConstruct(ChildElement);//當前元組為參數調用遞歸函數RecursiveConstruct(),構造當前元素的子元素集

XMLDocument.getRootElement().addContent(ChildElement);//將構造的元素集添加為當前元素的子元素,形成XML文檔

}

Output(XMLDocument);//輸出XML文檔;

}

Element RecursiveConstruct(CurrentElement){ //遞歸函數是用來構造當前元素的子元素

ChildElementList(CurrentElement.getElementPre());

for(i=0;i< ChildElementList.size();i++){

ConstructAttribute(ChildElementList.get(i).getElementPre());

ConstructText(ChildElementList.get(i).getElementPre());

CurrentElement.addContent(RecursiveConstruct(ChildElementList.get(i)));//遞歸調用RecursiveConstruct()將構造的元素集添加為當前元素的子元素

}

4 結論(Conclusion)

文章所提出的方法獨立于文檔結構采用固定關系模式存儲XML文檔,同時克服以往模型映射方法中無法還原出所存儲的XML文檔的缺點。通過在關系模式中存儲元素的Dietz編碼值對形成的參照完整性關系來反映元素之間的父子關系。通過關系表之間的連接操作能夠將存儲在關系數據庫中的XML文檔還原出來。

參考文獻(References)

[1] 萬常選,劉云生.基于關系數據庫的XML數據管理[J].計算機

科學,2003,30(8):64-68.

[2] 周傲英,等.基于關系的XML數據存儲[J].計算機應用,2000,

20(9):9-12.

[3] 楊健,雄前心.XML文檔架構與關系數據模型間的映射研究

[J].計算機工程與應用,2004,40(27):169-172.

[4] 劉偉.基于schema的XML模式與關系模式映射算法的研究[J].

計算機應用與軟件,2006,23:113-115.

[5] 秦杰,楊樹強,竇文華.一種基于模型映射的XML文檔存儲模

型[J].計算機工程與科學,2005,27(11):12-14.

[6] Dietz P F. Maintaining Order in a Linked List [C].In: Lewis H

Retal Eds. Proceedings of the 14th Annual ACM Symposium on

Theory of Computing (STOC'82).San Francisco,California,

USA. May 5-7,1982.New York: ACM Press,1982:122-127.

作者簡介:

張 屹(1983-),男,碩士,助理工程師.研究領域:軟件

工程.

主站蜘蛛池模板: 亚洲一区毛片| 国产美女91视频| 五月天婷婷网亚洲综合在线| 中文字幕乱码二三区免费| 日本妇乱子伦视频| a色毛片免费视频| 日本手机在线视频| 99激情网| 热九九精品| 91丝袜美腿高跟国产极品老师| 国产在线精品人成导航| 国产福利在线免费| 99视频在线观看免费| 一本久道久久综合多人| 国内精品久久人妻无码大片高| 成人夜夜嗨| 全部免费特黄特色大片视频| 日本免费a视频| 成年片色大黄全免费网站久久| 男女猛烈无遮挡午夜视频| 国产玖玖玖精品视频| 美女被操91视频| 国产在线视频欧美亚综合| 黄色网址手机国内免费在线观看| 黄色污网站在线观看| 日本高清免费不卡视频| 色婷婷综合在线| 国产精品网址在线观看你懂的| 在线日韩日本国产亚洲| 欧美福利在线观看| 日韩在线第三页| 亚洲黄色成人| 美女毛片在线| 免费无码AV片在线观看国产| 91精品网站| 亚洲伊人天堂| 久久精品66| 日本免费福利视频| 国产亚洲精品无码专| 国语少妇高潮| 找国产毛片看| 国产精品片在线观看手机版| 国产成人精品高清不卡在线| 亚洲va在线观看| 99在线免费播放| 亚洲永久色| 国产日韩欧美视频| 91尤物国产尤物福利在线| 综合亚洲网| 三级国产在线观看| 毛片手机在线看| 中文字幕久久波多野结衣| 久久这里只有精品8| 国产成人综合日韩精品无码不卡| 91麻豆国产在线| 色综合中文字幕| 日本午夜影院| 国产va在线| 少妇露出福利视频| 国产精品偷伦视频免费观看国产| 在线中文字幕日韩| 国产欧美日韩va| 亚洲一区二区日韩欧美gif| 国产亚洲欧美日韩在线一区二区三区| 婷婷综合缴情亚洲五月伊| 欧美一区二区精品久久久| 国产SUV精品一区二区6| 中文字幕无码制服中字| 久久久久国产精品嫩草影院| 欧美爱爱网| 制服丝袜一区| 国产成人三级在线观看视频| 动漫精品啪啪一区二区三区| 日韩一区二区三免费高清 | 国产一区在线视频观看| 麻豆国产精品| 亚洲精品视频免费| 国产精品真实对白精彩久久| 中国一级特黄视频| 亚洲第一极品精品无码| 无码福利视频| 国产成人8x视频一区二区|