專利名稱:一種支持xml數(shù)據(jù)動態(tài)更新的編碼方法
技術(shù)領(lǐng)域:
本發(fā)明屬于XML格式數(shù)據(jù)處理技術(shù)領(lǐng)域,涉及一種支持XML數(shù)據(jù)動態(tài)更新的編碼方法。
背景技術(shù):
由于具有半結(jié)構(gòu)性、開放性、異構(gòu)性、可擴展性、靈活性等特點,XML已經(jīng)成為互聯(lián)網(wǎng)上數(shù)據(jù)表示和交換的事實標(biāo)準(zhǔn)。隨著網(wǎng)絡(luò)技術(shù)的迅速發(fā)展,越來越多的數(shù)據(jù)采用XML格式存儲,如何快速有效地存儲XML數(shù)據(jù),并提供高效的XML數(shù)據(jù)查詢處理,已成為當(dāng)前研究的一個熱點。互聯(lián)網(wǎng)應(yīng)用對用XML格式表示和存儲數(shù)據(jù)的需求不斷增加,XML數(shù)據(jù)存儲一般通過對XML樹結(jié)構(gòu)按特定規(guī)則進行編碼來實現(xiàn)。通過給XML樹中的每個節(jié)點分配一個隱含位置關(guān)系的編碼,就可以直接比較兩個節(jié)點編碼來確定它們之間的結(jié)構(gòu)關(guān)系。W3C工作組針對XML數(shù)據(jù)查詢開發(fā)了 XPath和XQuery查詢語言,其共同特征是通過路徑表達式來實現(xiàn)XML文檔查詢。執(zhí)行路徑查詢的主要技術(shù)是結(jié)構(gòu)連接,即確定兩個節(jié)點之間的結(jié)構(gòu)關(guān)系(祖先后裔關(guān)系或父子關(guān)系等)。而節(jié)點之間結(jié)構(gòu)關(guān)系的確定主要依賴于有效的XML樹節(jié)點編碼方法。XML編碼就是按照一定規(guī)則給XML文檔樹中每個節(jié)點分配一個隱含位置關(guān)系的編碼,在不遍歷XML文檔樹的前提下通過比較兩個節(jié)點的編碼直接判斷兩個節(jié)點之間是否存在父子、祖先-后裔、兄弟、前驅(qū)、后繼等結(jié)構(gòu)關(guān)系。目前與XML數(shù)據(jù)存儲與編碼的研究成果比較多,其中主要有兩大類方法基于區(qū)間的編碼和基于路徑的編碼。其中,基于區(qū)間的編碼方案利用XML文檔有序的特點,根據(jù)每一個元素節(jié)點在原XML文檔中出現(xiàn)的順序給每一個元素節(jié)點賦予一個編碼;而基于路徑的編碼方案則是利用XML文檔嵌套的特點,根據(jù)XML文檔嵌套結(jié)構(gòu),給文檔根節(jié)點及從文檔根節(jié)點開始所能到達的每條路徑的其他節(jié)點賦予一個編碼。XML動態(tài)性是指對XML文檔的插入、刪除和更新操作的支持。由于XML文檔的刪除和更新操作不會涉及對已有XML節(jié)點編碼的改變,因此對于XML編碼機制來說,動態(tài)性就是能為新插入的節(jié)點分配合法的編碼。完全支持動態(tài)更新的XML編碼是指在任意位置插入一個新節(jié)點時,可以得到一個合法的編碼,而不用修改已存在的任何節(jié)點編碼。事實上,對編碼支持動態(tài)更新的研究可以轉(zhuǎn)化為研究如何在兩個值之間插入一個中間值,使得這個中間值不但能保持既有的大小順序,而且在插入這個中間值后不會引起對其他已存在值的重新分配。在已公布的動態(tài)編碼方法中,壓縮動態(tài)四級字符串算法(簡稱CDQQ是最優(yōu)秀的,但是CDQS使用遞歸的方法生成節(jié)點編碼,需要在編碼前得到編碼所要表示的范圍,然后遞歸地生成第1/3和第2/3處的編碼,在性能和編碼空間存儲上均存在有明顯的缺陷。
發(fā)明內(nèi)容
為解決上述問題,本發(fā)明的目的在于提供一種支持XML數(shù)據(jù)動態(tài)更新的編碼方法,以提高編碼的效率,并降低編碼的存儲空間成本。
為實現(xiàn)上述目的,本發(fā)明的技術(shù)方案為一種支持XML數(shù)據(jù)動態(tài)更新的編碼方法,為XML樹中的每個節(jié)點分配一個隱含位置關(guān)系的編碼,以直接比較兩個節(jié)點編碼來確定它們之間的結(jié)構(gòu)關(guān)系;以父節(jié)點的編號為前綴,加上該節(jié)點在本層的唯一層編碼構(gòu)成節(jié)點的編號,而當(dāng)根節(jié)點沒有父節(jié)點時,其編碼為1 ;對于新插入的節(jié)點n,當(dāng)η作為葉節(jié)點的子節(jié)點插入時,η的層編碼為2 ;而當(dāng)η作為非葉節(jié)點的孩子節(jié)點插入時,分為最左插入、中間插入和最右插入,根據(jù)該三種不同的情況由擴展字節(jié)進制編碼動態(tài)插入算法生成新的節(jié)點編碼。進一步地,每個子節(jié)點的擴展字節(jié)進制編碼為父節(jié)點編碼后接255作為段分隔符連接層編碼,最左子節(jié)點的層編碼為2,其他子節(jié)點的層編碼為其左兄弟節(jié)點層編碼加1。進一步地,對于新插入的節(jié)點η,當(dāng)η作為非葉節(jié)點的最左子節(jié)點插入時,η的層編碼為將η右兄弟節(jié)點的層編碼在第一個非1節(jié)之后截斷,并將最右節(jié)減1。進一步地,對于新插入的節(jié)點η,當(dāng)η作為非葉節(jié)點的中間節(jié)點插入時,η的層編碼為從左至右逐節(jié)比較η的左右兄弟節(jié)點的層編碼,直到在某一節(jié)上不相等,如果左右兄弟節(jié)點的層編碼在此節(jié)相差大于1,將左兄弟節(jié)點層編碼在此節(jié)加1并舍去其后所有節(jié)。進一步地,對于新插入的節(jié)點η,當(dāng)η作為非葉節(jié)點的中間節(jié)點插入時,η的層編碼為從左至右逐節(jié)比較η的左右兄弟節(jié)點的層編碼,直到在某一節(jié)上不相等,如果左右兄弟節(jié)點的層編碼在此節(jié)相差等于1,并且右兄弟層編碼沒有結(jié)束,則將右兄弟節(jié)點層編碼的這一節(jié)減1并舍去其后所有節(jié);而如果左右兄弟節(jié)點的層編碼在此節(jié)相差等于1并且左兄弟層編碼沒有結(jié)束,則將左兄弟節(jié)點層編碼的下一節(jié)加1并舍去其后所有節(jié)。進一步地,對于新插入的節(jié)點η,當(dāng)η作為非葉節(jié)點的最右子節(jié)點插入時,η的層編碼為η左兄弟節(jié)點層編碼的第一節(jié)加1并舍去其他節(jié)。本發(fā)明支持XML數(shù)據(jù)動態(tài)更新的編碼方法,其能保持和其他節(jié)點之間的位置關(guān)系,且不會引起已有節(jié)點編碼的改變。一方面提高了編碼的效率,另一方面降低了編碼的存儲空間成本。
圖1是本發(fā)明靜態(tài)擴展字節(jié)編碼前綴編碼示意圖。圖2是本發(fā)明擴展字節(jié)編碼動態(tài)編碼分配示意圖。
具體實施例方式為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點更加清楚明白,以下結(jié)合附圖及實施例,對本發(fā)明進行進一步詳細說明。應(yīng)當(dāng)理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。在本發(fā)明實施例的描述中,為便于理解,首先作如下定義字節(jié)碼邏輯編碼中每個字節(jié)碼的取值范圍為“0”,“1”,. . . “2Μ”,“255”;物理編碼中每個符號由8個二進制位即一個字節(jié)表示,分別為“00000000”,... “11111111”。為了不產(chǎn)生混淆,在本發(fā)明實施例中將十進制表示上為多位的一位字節(jié)碼用中括號括起來, 如[10] [255] 96是四位字節(jié)碼“ 10”,“255”,“9”,“6”組成的一串編碼。節(jié)編碼節(jié)編碼由除0和[255]以外的一位以上字節(jié)碼構(gòu)成,從左至右稱為從高位到低位。運算關(guān)系加1(+1)運算,在最低位按整數(shù)加1運算處理,如果結(jié)果為[255]則將該位設(shè)為1并向高位進1 ;減1(-1)運算,其為加1(+1)運算的逆運算;大于( > )關(guān)系,設(shè) a是字節(jié)碼,則a+1 > a,并具有傳遞性質(zhì);小于( < )關(guān)系,設(shè)a是字節(jié)碼,則< a,并具有傳遞性質(zhì)。段編碼段編碼由節(jié)分隔符0( 二進制表示為“00000000”)連接的多個節(jié)組成。本發(fā)明支持XML數(shù)據(jù)動態(tài)更新的編碼方法,通過給XML樹中的每個節(jié)點分配一個隱含位置關(guān)系的編碼,就可以直接比較兩個節(jié)點編碼來確定它們之間的結(jié)構(gòu)關(guān)系,其中,節(jié)點的編號是以父節(jié)點的編號為前綴,加上該節(jié)點在本層的唯一層編碼組成;對于新插入的節(jié)點n,當(dāng)η作為葉節(jié)點m的子節(jié)點插入時,η的層編碼為2 ;而當(dāng)η作為非葉節(jié)點m的孩子節(jié)點插入時,分為最左插入、中間插入和最右插入,根據(jù)不同的情況由擴展字節(jié)進制編碼動態(tài)插入算法生成一個新的節(jié)點編碼,該編碼不但能保持和其他節(jié)點之間的位置關(guān)系,又不會引起已有節(jié)點編碼的改變。當(dāng)根節(jié)點沒有父節(jié)點時,其編碼為1 ;每個子節(jié)點的EBCL編碼為父節(jié)點編碼后接 [255]作為段分隔符連接層編碼,最左子節(jié)點的層編碼為“2”,其他子節(jié)點的層編碼為其左兄弟節(jié)點層編碼加1。對于新插入的節(jié)點n,當(dāng)η作為非葉節(jié)點m的子節(jié)點插入時,最左插入、中間插入和最右插入的幾種情況如下當(dāng)η作為非葉節(jié)點m的最左子節(jié)點插入時,η的層編碼為將η右兄弟節(jié)點的層編碼在第一個非“1”節(jié)之后截斷,并將最右節(jié)減1,如果結(jié)果等于1則擴展一個新的節(jié)[2Μ];當(dāng)η作為非葉節(jié)點m的中間節(jié)點插入時,η的層編碼為從左至右逐節(jié)比較η的左右兄弟節(jié)點的層編碼,直到在某一節(jié)上不相等,如果左右兄弟節(jié)點的層編碼在此節(jié)相差大于1,將左兄弟節(jié)點層編碼在此節(jié)加1并舍去其后所有節(jié);如果左右兄弟節(jié)點的層編碼在此節(jié)相差等于1并且右兄弟層編碼沒有結(jié)束,將右兄弟節(jié)點層編碼的這一節(jié)減1并舍去其后所有節(jié);如果左右兄弟節(jié)點的層編碼在此節(jié)相差等于1并且左兄弟層編碼沒有結(jié)束,將左兄弟節(jié)點層編碼的下一節(jié)加1并舍去其后所有節(jié);如果左右兄弟節(jié)點的層編碼在此節(jié)相差等于1并且都已結(jié)束,則在左兄弟節(jié)點層編碼后擴展一個新的節(jié)[2Μ];當(dāng)η作為非葉節(jié)點m的最右子節(jié)點插入時,η的層編碼為η左兄弟節(jié)點層編碼的第一節(jié)加1并舍去其他節(jié)。在本發(fā)明實施例中,EBCL編碼由段分隔符[255] ( 二進制“11111111”)連接的多個段編碼構(gòu)成。段編碼大小關(guān)系判斷方法為由左至右分節(jié)判斷每個字節(jié)碼的大小,但實際上由于節(jié)分隔符是0,所以可以直接按照二進制的字典序判斷段編碼的大小。而EBCL編碼的大小關(guān)系判斷方法為由左至右分段判斷每個段編碼的大小。如設(shè)有兩個EBCL編碼a 和b,a和b的大小關(guān)系判定方法為從左至右比較a、b每個段編碼ai、bi,如果ai <bi則a < b ;如果ai > bi則a > b ;如果ai = = bi則繼續(xù)向右比較直至a或b結(jié)束,若a先結(jié)束則£1<13,若13先結(jié)束則13<£1。如果一直到a和b結(jié)束都有ai ==bi,則a==b。EBCL
編碼關(guān)系判定算法如下
5int relationJudge(a, b){ int i=l;
while(a未結(jié)束&& b未結(jié)束){ if(ai<bi)//a<b,返回-1 return -1;
else if (ai > bi) //a>b ,返回 1 return 1;
i++;//a==b繼續(xù)比較 }
if (a結(jié)束&&b結(jié)束) return 0; //a==b,返回 0 0結(jié)束;)仏<1),返回-1 return -1; else
return 1; }在本發(fā)明實施例中,EBCL靜態(tài)編碼是在XML文檔載入階段為XML樹中的每個節(jié)點賦予一個惟一的EBCL編碼,用映射表示為{XML節(jié)點IXML文檔對應(yīng)的XML樹} — {EBCL編碼}。其編碼規(guī)則如下根節(jié)點沒有父節(jié)點,其編碼為1 ;每個子節(jié)點的EBCL編碼為父節(jié)點編碼后接[255]作為段分隔符連接自編碼,最左子節(jié)點的自編碼為“2”,其他子節(jié)點的自編碼為其左兄弟節(jié)點自編碼加1。如圖1所示,根節(jié)點一共有353個子節(jié)點,最左子節(jié)點的自編碼為2,其余節(jié)點的自編碼從左至右分別為3,...,[253],[254], 11,...,1 [100]o其中,靜態(tài)EBCL前綴編碼生成的算法如下輸入已經(jīng)編碼的節(jié)點E,輸出以E為根的子樹編碼。
EBCL—Tree(E) { selfCode=2; /*最左子節(jié)點的自編碼為2*/ /*對E的所有子節(jié)點從左到右順序編碼*/ for (int i = 0; i < E.ChildCount; i++ ) { /*iChild是節(jié)點E的第i個子節(jié)點*/ iChild = E.getChild[i];
/*用段分隔符連接父編碼和自編碼形成全編碼*/ iChild.label=E.label @ selfLabel; /*自編碼加1,生成下一個節(jié)點的自編碼*/ selfLabel=addOne(selfLabel);
/*遞歸調(diào)用EBCL—Tree對iChild的子節(jié)點進行編碼*/ EBCLTree(iChild);XML動態(tài)性是指對XML文檔的插入、刪除和更新操作的支持。由于XML文檔的刪除和更新操作不涉及XML節(jié)點編碼的改變,因此對于XML樹編碼機制來說,動態(tài)性就是能支持 XML節(jié)點的插入。新插入節(jié)點時,按照節(jié)點插入的位置可以分為左端插入,中間插入,右端插入三種情況。由于插入時父節(jié)點已知,故只需要根據(jù)其插入位置計算相應(yīng)的自編碼,再和父節(jié)點編碼連接就形成新節(jié)點的EBCL編碼。按照插入的類型可以分為單個節(jié)點插入和子樹插入,在 EBCL編碼中,子樹插入可以轉(zhuǎn)換為先插入子樹的根節(jié)點,再調(diào)用靜態(tài)EBCL算法生成其他節(jié)點的編碼。如圖2所示,其示出了在最左節(jié)點之前,兩個節(jié)點之間以及在最右節(jié)點之后插入新節(jié)點的示例,其中虛線節(jié)點代表動態(tài)插入的新節(jié)點。左端插入指在最左節(jié)點之前插入一個新的節(jié)點,設(shè)最左節(jié)點的自編碼為a,新節(jié)點自編碼為從左至右分段掃描a,如果a有多個節(jié),則只保留第一個非空節(jié)而將其他節(jié)舍去, 這樣可以使得編碼長度最??;如果a只有一個節(jié)并且a > 1,則新編碼為a-Ι ;如果a = 2, 新編碼為10 [2 ],這里使用[254]的目的是方便在這個節(jié)點之前再插入新節(jié)點。其中,左端插入新節(jié)點的算法如下輸入最左節(jié)點的自編碼a,在自編碼為a的節(jié)點前插入一個新的節(jié)點,給新節(jié)點分配自編碼b。
7insertBefore(a){
if (a有多個節(jié))
b=a的第一個非空節(jié);
else if (a > 2)
b=a-l;
else
b=10[254]; }
權(quán)利要求
1.一種支持XML數(shù)據(jù)動態(tài)更新的編碼方法,其特征在于為XML樹中的每個節(jié)點分配一個隱含位置關(guān)系的編碼,以直接比較兩個節(jié)點編碼來確定它們之間的結(jié)構(gòu)關(guān)系;以父節(jié)點的編號為前綴,加上該節(jié)點在本層的唯一層編碼構(gòu)成節(jié)點的編號,而當(dāng)根節(jié)點沒有父節(jié)點時,其編碼為1 ;對于新插入的節(jié)點n,當(dāng)η作為葉節(jié)點的子節(jié)點插入時,η的層編碼為2 ; 而當(dāng)η作為非葉節(jié)點的孩子節(jié)點插入時,分為最左插入、中間插入和最右插入,根據(jù)該三種不同的情況由擴展字節(jié)進制編碼動態(tài)插入算法生成新的節(jié)點編碼。
2.如權(quán)利要求1所述支持XML數(shù)據(jù)動態(tài)更新的編碼方法,其特征在于每個子節(jié)點的擴展字節(jié)進制編碼為父節(jié)點編碼后接255作為段分隔符連接層編碼,最左子節(jié)點的層編碼為2,其他子節(jié)點的層編碼為其左兄弟節(jié)點層編碼加1。
3.如權(quán)利要求2所述支持XML數(shù)據(jù)動態(tài)更新的編碼方法,其特征在于對于新插入的節(jié)點η,當(dāng)η作為非葉節(jié)點的最左子節(jié)點插入時,η的層編碼為將η右兄弟節(jié)點的層編碼在第一個非1節(jié)之后截斷,并將最右節(jié)減1。
4.如權(quán)利要求2所述支持XML數(shù)據(jù)動態(tài)更新的編碼方法,其特征在于對于新插入的節(jié)點η,當(dāng)η作為非葉節(jié)點的中間節(jié)點插入時,η的層編碼為從左至右逐節(jié)比較η的左右兄弟節(jié)點的層編碼,直到在某一節(jié)上不相等,如果左右兄弟節(jié)點的層編碼在此節(jié)相差大于1, 將左兄弟節(jié)點層編碼在此節(jié)加1并舍去其后所有節(jié)。
5.如權(quán)利要求2所述支持XML數(shù)據(jù)動態(tài)更新的編碼方法,其特征在于對于新插入的節(jié)點η,當(dāng)η作為非葉節(jié)點的中間節(jié)點插入時,η的層編碼為從左至右逐節(jié)比較η的左右兄弟節(jié)點的層編碼,直到在某一節(jié)上不相等,如果左右兄弟節(jié)點的層編碼在此節(jié)相差等于1, 并且右兄弟層編碼沒有結(jié)束,則將右兄弟節(jié)點層編碼的這一節(jié)減1并舍去其后所有節(jié);而如果左右兄弟節(jié)點的層編碼在此節(jié)相差等于1并且左兄弟層編碼沒有結(jié)束,則將左兄弟節(jié)點層編碼的下一節(jié)加1并舍去其后所有節(jié)。
6.如權(quán)利要求2所述支持XML數(shù)據(jù)動態(tài)更新的編碼方法,其特征在于對于新插入的節(jié)點η,當(dāng)η作為非葉節(jié)點的中間節(jié)點插入時,η的層編碼為從左至右逐節(jié)比較η的左右兄弟節(jié)點的層編碼,直到在某一節(jié)上不相等,如果左右兄弟節(jié)點的層編碼在此節(jié)相差等于1 并且都已結(jié)束,則在左兄弟節(jié)點層編碼后擴展一個新的節(jié)254。
7.如權(quán)利要求2所述支持XML數(shù)據(jù)動態(tài)更新的編碼方法,其特征在于對于新插入的節(jié)點η,當(dāng)η作為非葉節(jié)點的最右子節(jié)點插入時,η的層編碼為η左兄弟節(jié)點層編碼的第一節(jié)加1并舍去其他節(jié)。
全文摘要
本發(fā)明公開了一種支持XML數(shù)據(jù)動態(tài)更新的編碼方法,通過給XML樹中的每個節(jié)點分配一個隱含位置關(guān)系的編碼,以直接比較兩個節(jié)點編碼來確定它們之間的結(jié)構(gòu)關(guān)系;以父節(jié)點的編號為前綴,加上該節(jié)點在本層的唯一層編碼構(gòu)成節(jié)點的編號,而當(dāng)根節(jié)點沒有父節(jié)點時,其編碼為1;對于新插入的節(jié)點n,當(dāng)n作為葉節(jié)點的子節(jié)點插入時,n的層編碼為2;而當(dāng)n作為非葉節(jié)點的孩子節(jié)點插入時,分為最左插入、中間插入和最右插入,根據(jù)該三種不同的情況由擴展字節(jié)進制編碼動態(tài)插入算法生成新的節(jié)點編碼。本發(fā)明不但能保持和其他節(jié)點之間的位置關(guān)系,又不會引起已有節(jié)點編碼的改變。一方面提高了編碼的效率,另一方面降低了編碼的存儲空間成本。
文檔編號G06F17/30GK102446218SQ20111038064
公開日2012年5月9日 申請日期2011年11月25日 優(yōu)先權(quán)日2011年11月25日
發(fā)明者余勝, 侯宏侖, 吳明暉, 孫霖, 陳天洲, 霍梅梅 申請人:浙江大學(xué)城市學(xué)院