国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

XML與對(duì)象關(guān)系模型之間的轉(zhuǎn)換*

2019-06-25 06:03:20陸安江
通信技術(shù) 2019年6期
關(guān)鍵詞:列表文檔約束

周 游,陸安江

(貴州大學(xué),貴州 貴陽(yáng) 550025)

0 引 言

XML是一種廣泛用來(lái)描述不同數(shù)據(jù)類型以及異構(gòu)關(guān)系數(shù)據(jù)庫(kù)的可擴(kuò)展標(biāo)記語(yǔ)言,并在異構(gòu)關(guān)系數(shù)據(jù)庫(kù)之間的轉(zhuǎn)換過(guò)程發(fā)揮橋梁作用[1-3]。為了更好的應(yīng)用和開發(fā)基于關(guān)系模型的數(shù)據(jù)庫(kù)系統(tǒng),為了實(shí)現(xiàn)數(shù)據(jù)共享,開發(fā)了許多轉(zhuǎn)換算法和方法。文獻(xiàn)[4]提出一種轉(zhuǎn)換方法,可以實(shí)現(xiàn)XML到word之間的轉(zhuǎn)換,同時(shí)也可以實(shí)現(xiàn)word到XML之間的轉(zhuǎn)換;文獻(xiàn)[5]通過(guò)Java可以實(shí)現(xiàn)從word文本到XML文本之間的轉(zhuǎn)換;文獻(xiàn)[6]提出一種基于XML文檔為中間件,利用ASP+XML技術(shù),使用基于模型驅(qū)動(dòng)的方法來(lái)映射XML與關(guān)系數(shù)據(jù)庫(kù)數(shù)據(jù)之間的關(guān)系,然后借助SQL實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)換。本文提出一種基于文檔類型定義(DTD)的XML模式轉(zhuǎn)換為對(duì)象關(guān)系模型模式的可逆轉(zhuǎn)換方法。

1 準(zhǔn)備工作

在這一部分,我們將對(duì)在本文中使用到的術(shù)語(yǔ)、定義、符號(hào)以及用法進(jìn)行介紹。對(duì)于對(duì)象關(guān)系模型的結(jié)構(gòu)組成成分,通過(guò)文獻(xiàn)[7-10]可概括為以下四個(gè)部分:

(1)對(duì)象類型或具有屬性的用戶定義類型(UTD);

(2)對(duì)象表、泛型類型以及繼承;

(3)對(duì)象的集合或引用的集合;

(4)對(duì)象的引用或類型引用。

對(duì)于XML文檔模型,我們采用<>來(lái)表示,以“<”開始,以“>”停止,則可通過(guò)式(1)中的符號(hào)來(lái)對(duì)使用其屬性和內(nèi)容模型的XML元素進(jìn)行定義[11]。那么,對(duì)于XML文檔中的元素A,它的定義就可以通過(guò)A給出。如式(1)所示:

通過(guò)文獻(xiàn)[11]可知在式(1)中:(1)::=符號(hào)表示被定義為;(2)A表示元素的名稱;(3)N表示元素A的內(nèi)容模型;(4)Attrs表示元素A的屬性列表,即Attrs=Attr1,Attr2,…,Attrm通過(guò)式(1)中對(duì)Attrs(下劃線Attrs)屬性列表的定義,我們可知它可以通過(guò)‘_’和屬性Attri(1≤i≤m)獲得。因此我們可以這樣來(lái)表示Attrs,即Attrs=Attr1,Attr2,...,Attrm= Attr1,Attr2...,Attrm。

接下來(lái)我們對(duì)屬性Attri,即Attri進(jìn)行定義,如式(2)所示:

在式(2)中,(1)Attri表示屬性;(2)ToV表示在XML模型中的屬性類型或其值的列表[12];(3)Dp表示屬性默認(rèn)值,其定義如式(3)所示:

通過(guò)文獻(xiàn)[13]可知在式(3)中,1)|表示或;#REQUIRED表示屬性是必須的;2)#IMPLED表示屬性不是必須的;3)#FIXED value表示屬性是固定的;4)value表示屬性是默認(rèn)的。

通過(guò)對(duì)術(shù)語(yǔ)、定義及符號(hào)的介紹,接下來(lái)我們將介紹XML文檔與對(duì)象關(guān)系模型之間的映射。

2 XML與對(duì)象關(guān)系之間的映射

接下來(lái)我們考慮一個(gè)多態(tài)函數(shù)β,該函數(shù)允許我們將XML schema轉(zhuǎn)換為對(duì)象關(guān)系模型。此函數(shù)將對(duì)象關(guān)系模型中的對(duì)象A與每一個(gè)XML中的元素A進(jìn)行關(guān)聯(lián),因此可以給出對(duì)象類型β(A)的定義,其定義如式(4)所示:

在式(4)中,(1)A(在::=右邊)表示對(duì)象關(guān)系類型中關(guān)聯(lián)到XML文檔中元素A的對(duì)象關(guān)系類型;(2)L表示屬性定義列表。

在這個(gè)列表中的每一個(gè)元素都是對(duì)象類型中屬性的定義,這個(gè)定義可以通過(guò)式(5)得到:

在式(5)中,(1)Attri表示對(duì)象類型屬性;(2)Type表示屬性Attr的類型;(3)M表示值的約束列表。這些約束可以為空(null)、非空(not null)、唯一性(unique)、外鍵約束(foreign key)、以及檢查約束(check)[14]。由巴科斯范式(BNF)可知,用尖括號(hào)(<>)括住表示必選項(xiàng),用方括號(hào)([])括住表示可選項(xiàng)[15]。

接下來(lái)我們看看如何通過(guò)β函數(shù)來(lái)計(jì)算對(duì)象類型“A”的屬性;在式(1)中我們有:A::=〈A;Attrs;N〉。因此可以給出對(duì)象類型的定義,其定義如式(6)所示:

在式(6)中“U”表示聯(lián)合運(yùn)算符;為了能得到對(duì)象類型 A,我們不得不分別計(jì)算 β(Attrs)和 β(N)。

2.1 β(Attrs)的計(jì)算

β(Attrs)是對(duì)象類型的屬性定義列表,β(Attrs)計(jì)算算法流程如圖1所示。

通過(guò)式(2)可知,在XML schema中每個(gè)屬性Attri可以通過(guò)Attri::=〈Attri;ToV;Dp〉得到;因此對(duì)于 β(Attri),我們可以通過(guò) β(Attri)::= β(<Attri;ToV;Dp>)得到。對(duì)于β(<Attri;ToV;Dp>)的值,我們可以通過(guò)式(7)計(jì)算得到:

式(7)中C表示約束。通過(guò)式(7)我們可知,為了求 β(Attri),我們必須計(jì)算 β(ToV),β(Dp)和 C。

圖1 β(Attrs)算法流程

2.2 β(ToV)的計(jì)算

在對(duì)象關(guān)系模型中β(ToV)表示的是屬性Attri類型的值,以及值得約束。我們可以通過(guò)表1得到 β(ToV)。

在表 1中:(1)Varchar(n)表示在數(shù)據(jù)庫(kù)系統(tǒng)里字符串使用類型的標(biāo)準(zhǔn),n表示類型的大??;(2)Varchar(p)表示在對(duì)象關(guān)系型數(shù)據(jù)庫(kù)里值集合的數(shù)據(jù)類型,p表示集合的大??;(3)嵌套表表示的是在關(guān)系型數(shù)據(jù)庫(kù)里使用的數(shù)據(jù)類型,它反映的是大小沒(méi)有限制的值的集合:(4)通過(guò)文獻(xiàn)[16]我們可知Letter和Digit是按以下規(guī)律定義的:Letter::=[A...Za...z].Digit::=[0...9]。

在表1的約束列有:(1)唯一約束(UC)表示在屬性是一個(gè)明確的值;(2)外鍵約束(FKC)表示引用一個(gè)完整性的約束;(3)枚舉約束(ELConstraint)表示具有與指定XML元素的內(nèi)容模型屬性的枚舉值對(duì)應(yīng)的值列表的約束。我們使用LAC 來(lái)表示 (Letter|_)(Letter|_|Digit|:|.|-)。

表1 β(ToV)的計(jì)算

2.3 β(Dp)的計(jì)算

為 了 計(jì) 算 β(Attri), 我 們 不 得 不 計(jì) 算 β(Dp)。β(Dp)的值通常是一個(gè)數(shù)據(jù)庫(kù)約束的列表,通過(guò)表2可以求出 β(Dp)的值。

表2 β(Dp)的計(jì)算

為了更好的理解函數(shù)β,我們看一下下面的列子:

<!ELEMENTcinema(...)>

<!ATTLIST cinema id ID #REQUIRED>

<!ATTLIST cinema popularity CDATA #IMPLIED>

以上定義了id元素,元素cinema有兩個(gè)屬性:cinema和popularity;β(id)=β(〈id;ID;#REQUIRED〉),β(popularity)=β(〈popularity;CDATA;#IMPLED〉)。

我們把函數(shù)β應(yīng)用到cinema可得:

β(cinema)=cinema(β(id),β(popularity)...)

首先,我們計(jì)算β(id),通過(guò)式(2)我們可得:

β(id)=β(<id;ToV;Dp>)

通過(guò)式(7)可得:

β(<id;ToV;Dp>)=<id;β(ToV)-C;β(Dp)+C>

由表1和表2可得:

β(id)=〈id;β(ID)-(LAC+UC)〉;

β(#REQUIRED)+(LAC+UC);

β(#REQUIRED)=not null;

那么

β(id)= <id; varchar; not null +(LAC+UC)>。

接下來(lái)我們計(jì)算 β(popularity),同理可得:β(popularity)=<popularity;varchar;null>。

則cinema的對(duì)象變?yōu)椋?/p>

cinema(〈id; varchar; not null +(LAC+UC)〉;

popularity;varchar;null,...)

通過(guò)以上分析有:XML文檔屬性到對(duì)象屬性的算法(命名為算法2)。具體流程如圖2所示。

圖2 XML文檔屬性到對(duì)象屬性的算法

2.4 β(N)的計(jì)算

通過(guò)式(6)可知:β(A)::=A(β(Attrs)Uβ(N),通過(guò)(1)我們已經(jīng)對(duì)β(Attrs)的計(jì)算進(jìn)行詳細(xì)介紹,為了得到完整的對(duì)象類型的屬性列表,我們必須計(jì)算 β(N)。接下來(lái)展開對(duì) β(N)計(jì)算的介紹。

通過(guò)式(1)有:A::=〈A;Attrs;N〉,其中N表示元素A的內(nèi)容模型,可以為any(該模型包含文本、元素和空格),empty(禁止把文本或者元素作為一個(gè)聲明為空的子元素)和混合模型(包含文本、內(nèi)容和屬性)。接下來(lái)看一個(gè)DTD的列子:

<!ELEMENT cinema (time+)>

<!ELEMENT cinema id ID #REQUIRED category CDATA #IMPLIED>

<!ELEMENT time(date+)>

<!ELEMENT date(move+)>

<!ELEMENT move(move_name,director)>

<!ELEMENT move_name (#PCDTATA)>

<!ELEMENT director(#PCDTATA)>

通過(guò)式(1)可知cinema元素可表示為:

cinema::=<cinema;id,category; time +>。

其中time+為cinema元素N的值;其定義如下:time::=<time;;date +>。

同樣,對(duì)于元素move可以定義為:move::=<move;; move_name, director>?!癿ove_name,director”是move元素N的值。

元素move_name的定義如下:move_name::=<move_name;;#PCDATA>;元素director的定義為:director::=< director;;#PCDATA>。 因 此 move_name和director元素的N值為#PCDATA。

為了使β(N)的計(jì)算更加簡(jiǎn)化,我們利用巴克斯范式(BNF)語(yǔ)法來(lái)對(duì)XML文檔的內(nèi)容模型進(jìn)行求解(其中A是N的元素)。我們稱這種語(yǔ)法為,將語(yǔ)法G與式(1)結(jié)合可得語(yǔ)法G,最終可得β(G)。具體如下所示:

(1)β(A)::=β(ANY);(ANY 指任何數(shù)據(jù)和任何類型)

(2)β(A)::=β(EMPTY);(EMPTY指空的字符串)

(3)β(A)::=(-A-1,A--2):=β(A--1),β(A--2);(A1,A2是用來(lái)區(qū)別’=’左邊和右邊的元素A)

(4)β(A)::=(+,β(A--1),β(A--2);(定義一種可以保存對(duì)象類型 β(-A-1)和 β(A--2)的一般類型)

(5)β(A)::={β(A)};(具有空約束的 β(A)表)

(6)β(A)::={β(A)};(具有非空約束的 β(A)表)

(7)β(A)::=[β(A)];(具有空約束的 β(E)

(8)β(A)::=β(#PCDATD)。

β(#PCDATD)的值通過(guò) β(#PCDATD)::=<value;varchar;””>來(lái)計(jì)算。

為了更好的理解β函數(shù),接下來(lái)看以下列子:

那么move_name是一個(gè)具有屬性命名值得對(duì)象類型,屬性類型是沒(méi)有約束的varchar。

(2)接下來(lái)看一個(gè)復(fù)雜的列子,對(duì)于XML文檔中的move元素我們定義如下所示:

move::=<move;;move_name,director>, 則β(move)=move(β(move_name,director)=move(β(move_name), β(director)。假設(shè)用其值來(lái)代替 β(move_name)和 β(director),那么可得:β(move)=move(move_name(<value;varchar;””>),director(<value;varchar;””>)。

因此,’move’是一個(gè)具有兩個(gè)屬性(move_name和director)的對(duì)象類型,它們中的每一個(gè)都具有一個(gè)與之對(duì)應(yīng)的屬性命值的對(duì)象類型。計(jì)算β(N)可以通過(guò)以下算法(命名為算法3)獲得:

(1)開始;

(2)輸入N,一個(gè)XML文檔元素A的內(nèi)容模型;

(3)在不同的A中隨機(jī)選擇V,使得β(V)在β(N)中;

(4)如果 β(V)不在 V 中,那么通過(guò) β(G)和算法 2 計(jì)算 β(V);

(5)如果沒(méi)有 β(V)在 β(N)中或者在 β(N)中的每一個(gè) β(V)都沒(méi)在 V 中再或者 β(V)=β(E),那么退出循環(huán);否則返回c。

(6)輸β(N),對(duì)象屬性列表;

(7)結(jié)束。

圖3 β(N)計(jì)算流程

3 轉(zhuǎn)換算法

通過(guò)以上的介紹,接下來(lái)我們考慮如何將XML模型轉(zhuǎn)換為對(duì)象關(guān)系模型。為了創(chuàng)建XML文檔到對(duì)象類型的映射,我們從以下兩方面進(jìn)行討論:A)對(duì)象屬性的創(chuàng)建;B)創(chuàng)建與XML schema關(guān)聯(lián)的對(duì)象類型。

3.1 對(duì)象屬性的創(chuàng)建

將對(duì)象屬性的創(chuàng)建函數(shù)命名為COA,COA函數(shù)以一個(gè)屬性作為具有目錄列表的參數(shù),并返回表達(dá)式〈attr;typeOfAttribute;M〉。通過(guò)式(5)可知,該表達(dá)式反映的是對(duì)象關(guān)系模型中屬性的定義。該函數(shù)基于以上定義的β函數(shù)計(jì)算的值,其定義如下所示:

通過(guò)上述定義的β函數(shù)計(jì)算元素x的值;

對(duì)于在 attr 中的每一個(gè) {β(x)},如果與 x 相關(guān)的類型沒(méi)有被創(chuàng)建,那么創(chuàng)建對(duì)象類型x作為不。完整類型;創(chuàng)建一個(gè)列表類型,稱為xs;在attr中用 <”xs”;xs;’’> 來(lái)替換 {β(x)};

對(duì)于在 attr 中的每一個(gè) [β(x)],在 (x(...)添加一個(gè)空約束(null constraint),然后在 attr中用 (x(...))來(lái)替換 [β(x)];

如果與attr相關(guān)的類型沒(méi)有被創(chuàng)建,那么創(chuàng)建一個(gè)對(duì)象類型,稱為attr,返回<”attr”;attr;””>;其中每一個(gè)attr屬性相當(dāng)于目錄列表中的目錄;

對(duì)于形如 x(<value;varchar;””>)模型,創(chuàng)建對(duì)象屬性 (x(...),返回(4);

對(duì)于形如x(y(<value;varchar;””>), f(<value;varchar;””>),…)模型,創(chuàng)建對(duì)象屬性 (x(...),在 attr 中 用 x(<”y”;y;””>,<”f”; f;””>,…)來(lái)替換,返回(4)。

對(duì)于元素 e(...)與正則表達(dá)式(…β(x)…)有關(guān),如果x類型沒(méi)有被創(chuàng)建,那么創(chuàng)建一個(gè)對(duì)象類型,并用〈”x”;refx;〉替換 β(x)。

為了更好的理解上訴定義,接下來(lái)看一個(gè)例子:

<!ELEMENTmove(move_name,director,cite?)>

<!ELEMENT move_name(#PCDAT)>

<!ELEMENTdirector(fn,ln)>

<!ELEMENTfn(#PCDAT)>

<!ELEMENTln(#PCDAT)>

<!ELEMENTcite(move*)>

β(move)可以通過(guò)以下表達(dá)式來(lái)計(jì)算:β(move)=move(β(move_ame),β(director),[β(cite)]); 為 了 創(chuàng) 建對(duì)象屬性,我們不得不分別計(jì)算:β(move_ame),β(director)和 [β(cite)]。

通過(guò)計(jì)算有:β(move_name)=move_name(<value;varchar;””>);

β(director)=director(fn(<value;varchar;””>),ln(<value;varchar;””>);

[β(cite)]的值為 [cite({[β(move)]})]。

則β(move)=move(move_name(<value;varchar;””>),director(fn(<value;varchar;””>), ln(<value;varchar;””>), [cite({β(move)})])。

為了創(chuàng)建move的對(duì)象屬性,我們分別對(duì)move_name(<value;varchar;””>,director(fn(<value;varchar;””>), ln(<value;varchar;””>),[cite({β(move)})]進(jìn)行轉(zhuǎn)換。

首先對(duì) [cite({β(move)})]進(jìn)行轉(zhuǎn)換,為了去掉”{”和”}”,使用步驟(2),可得:{β(move)}通過(guò)<”moves”;moves;””>替換掉,然后我們得到表 達(dá) 式 [cite(<”moves”;moves;null_constrant>)];為了去掉”[”和”]”,使用步驟(3),可得:(cite(<”moves”;moves;null_constrant>);通過(guò)步驟(4)可得:<”cite”;cite;null_constraint>。

其次對(duì)move_name(<value;varchar;””>)進(jìn)行轉(zhuǎn)換,使用步驟(5),可得對(duì)象屬性為:(move_name(<value;varchar;””>), 通 過(guò) 步 驟(4) 可 得 <”move_name”;move_name;””>。

接 下 來(lái) 對(duì) director(fn(<value;varchar;””>),ln(<value;varchar;””>) 進(jìn) 行 轉(zhuǎn) 換, 由 表 達(dá) 式可 知 director屬 x(y(<value;varchar;””>),f(<value;varchar;””>),..)模型,通過(guò)步驟(6)可得:(director(<”fn”;fn;””>, <”ln”;ln;””>)),通過(guò)步驟(4)可得:<”director”;director;””>。

最后,我們可得move表達(dá)式為:move(<”move_name”;move_name;””>,<”director”;-directoe;””>,<”cite”;cite;null_constraint>);對(duì)象屬性表達(dá)式為:<”move”;move;constraint_on(cite)>。

3.2 創(chuàng)建與XML schema關(guān)聯(lián)的對(duì)象類型

與XML schema關(guān)聯(lián)的對(duì)象類型創(chuàng)建方法具體如下所示:

設(shè)y是一個(gè)對(duì)象屬性,通過(guò)對(duì)象屬性的創(chuàng)建可知y的表達(dá)式為:〈”object”;object;constraints〉;然后將其返回〈object;constraints〉(一個(gè)伴有約束的對(duì)象類型)。

通過(guò)上訴方法我們可得〈”moeve”;move;constraint_on(cite)〉的對(duì)象類型為:〈move;constraint_on(cite)〉。

最終轉(zhuǎn)換算法如下所示(見圖4):

(1)開始;

(2)輸入XML文檔,A是XML中的元素;

(3)通過(guò)β(G)計(jì)算元素A的值;

(4)通過(guò)對(duì)象屬性創(chuàng)建函數(shù)計(jì)算元素A的對(duì)象屬性;

(5)通過(guò)與XML schema關(guān)聯(lián)的對(duì)象類型創(chuàng)建方法計(jì)算元素A的對(duì)象類型;

(6)創(chuàng)建一個(gè)對(duì)象列表,命名為:“A_table”,此列表伴有對(duì)象類型A和約束(列表“A_table”是用來(lái)存儲(chǔ)XML文檔內(nèi)容的);

(7)輸出對(duì)象關(guān)系模式;

(8)結(jié)束。

圖4 轉(zhuǎn)換算法流程

基于對(duì)象類型move,我們創(chuàng)建一個(gè)名為Move_table的表,具體如圖5所示。

圖5 Move_table結(jié)構(gòu)

圖5 中:(1)id表 示 一 個(gè) 數(shù) 量 屬 性;(2)move_name表示一個(gè)具有名的屬性對(duì)象;(3)directors表示每個(gè)元素具有fn和ln屬性對(duì)象;(4)cite表示“move”對(duì)類型應(yīng)用的集合。

4 結(jié) 語(yǔ)

在這篇文章里介紹了一種將XML模式轉(zhuǎn)換為對(duì)象關(guān)系模式的方法,同時(shí)也可以將對(duì)象關(guān)系模型轉(zhuǎn)化為XML模型。該方法在處理XML數(shù)據(jù)的時(shí)候可以保護(hù)其數(shù)據(jù)結(jié)構(gòu),同時(shí)也提供一些語(yǔ)義約束;該方法與其他方法相比較,在整合XML元素的時(shí)候僅需較少的對(duì)象列表。

猜你喜歡
列表文檔約束
巧用列表來(lái)推理
有人一聲不吭向你扔了個(gè)文檔
“碳中和”約束下的路徑選擇
學(xué)習(xí)運(yùn)用列表法
擴(kuò)列吧
約束離散KP方程族的完全Virasoro對(duì)稱
基于RI碼計(jì)算的Word復(fù)制文檔鑒別
Persistence of the reproductive toxicity of chlorpiryphos-ethyl in male Wistar rat
適當(dāng)放手能讓孩子更好地自我約束
人生十六七(2015年6期)2015-02-28 13:08:38
不含3-圈的1-平面圖的列表邊染色與列表全染色
渝中区| 开江县| 行唐县| 永年县| 岳池县| 缙云县| 双柏县| 积石山| 桦川县| 天长市| 岳池县| 呈贡县| 泽普县| 琼中| 浪卡子县| 白沙| 大理市| 通道| 错那县| 龙川县| 清流县| 延寿县| 莎车县| 宜阳县| 荃湾区| 长丰县| 云南省| 建湖县| 武鸣县| 新疆| 东方市| 凤阳县| 昭觉县| 台东县| 历史| 五原县| 新泰市| 伊川县| 绍兴县| 恩平市| 富锦市|