專利名稱:可擴展標(biāo)記語言數(shù)據(jù)流壓縮器及其壓縮方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種網(wǎng)絡(luò)環(huán)境中可擴展標(biāo)記語言XML(Extensible Markup Language)數(shù)據(jù)流的壓縮器及其壓縮方法,尤其滿足XML Schema結(jié)構(gòu)約束的XML數(shù)據(jù)流的壓縮器及其壓縮方法;屬于網(wǎng)絡(luò)技術(shù)領(lǐng)域。
背景技術(shù):
XML已經(jīng)成為各種網(wǎng)絡(luò)上各應(yīng)用系統(tǒng)和數(shù)據(jù)源之間數(shù)據(jù)表示和交換的標(biāo)準(zhǔn)。因此越來越多的應(yīng)用系統(tǒng)采用XML作為標(biāo)準(zhǔn)格式來交換數(shù)據(jù)。海量的XML數(shù)據(jù)以流的形式在網(wǎng)絡(luò)上傳輸,如何高效傳輸海量的XML數(shù)據(jù)流成為網(wǎng)絡(luò)上數(shù)據(jù)交換中迫切需要解決的問題,而數(shù)據(jù)壓縮技術(shù)則是提高網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)闹匾侄巍?br>
海量的XML數(shù)據(jù)在網(wǎng)絡(luò)傳輸過程中以流的形式存在,在處理技術(shù)上與靜態(tài)存儲的XML數(shù)據(jù)有很大的不同。XML數(shù)據(jù)流是順序、快速、隨時間變化無法預(yù)測并且海量的形式連續(xù)到達的XML數(shù)據(jù)序列,這就導(dǎo)致要求XML數(shù)據(jù)流的處理無法保存已經(jīng)處理過的數(shù)據(jù),只能掃描數(shù)據(jù)一遍?,F(xiàn)有的XML的壓縮方法均無法適應(yīng)XML數(shù)據(jù)流的傳輸環(huán)境。
基于XML數(shù)據(jù)自身特點,目前出現(xiàn)了多種XML數(shù)據(jù)壓縮的算法,這些算法主要目的是減少XML文檔中的冗余信息,從而減少文檔的存儲空間代價和傳輸代價。其中,典型的系統(tǒng)包括XMill系統(tǒng)Dan Suc iu在XMill系統(tǒng)提出了XML數(shù)據(jù)的壓縮算法,該方法將數(shù)據(jù)和結(jié)構(gòu)分離,將同一種元素的數(shù)據(jù)匯總壓縮存放,這種方法的壓縮率較高,本質(zhì)上是一種無損的壓縮算法;但是,Xmill系統(tǒng)以整個XML文檔作為壓縮粒度,如果希望對于數(shù)據(jù)進行查詢,則只能解壓縮全部數(shù)據(jù);同樣,我們在壓縮數(shù)據(jù)之上,不能執(zhí)行類似創(chuàng)建視圖等有意義的操作;XGrind系統(tǒng)XGrind系統(tǒng)最大特點是在壓縮數(shù)據(jù)之上支持查詢,XGrind系統(tǒng)的壓縮粒度是XML數(shù)據(jù)中的元素/屬性,壓縮數(shù)據(jù)中保持原有XML數(shù)據(jù)的結(jié)構(gòu),在查詢過程中,支持部分解壓縮數(shù)據(jù)回答查詢。
XPress系統(tǒng)XPress系統(tǒng)最大特點是采用一種數(shù)字編碼方式壓縮XML數(shù)據(jù),而這種數(shù)字編碼方式能夠方便地描述XML的樹狀結(jié)構(gòu),和XGrind系統(tǒng)一樣,XPress系統(tǒng)支持壓縮數(shù)據(jù)之上的查詢,系統(tǒng)能夠局部解壓縮回答用戶查詢。
但是,XGrind系統(tǒng)和XPress系統(tǒng)一樣,需要對XML數(shù)據(jù)流掃描兩遍,第一遍中獲取XML數(shù)據(jù)的統(tǒng)計信息,根據(jù)頻率構(gòu)造字典表,然后在第二遍中進行數(shù)據(jù)壓縮;而網(wǎng)絡(luò)的流環(huán)境中,XML數(shù)據(jù)流是順序的海量的不斷到達的XML序列,壓縮器無法將整個XML序列全部保存下來,進行掃描壓縮;處理過的XML序列不會再重新回到壓縮器中,因此,壓縮器對XML流只能處理一次。XML數(shù)據(jù)流之上完成的XPath查詢處理同樣需要滿足上述要求。根據(jù)上述分析,XMill系統(tǒng)、XGrind系統(tǒng)和XPress系統(tǒng)均無法適應(yīng)數(shù)據(jù)流環(huán)境中的要求。
發(fā)明內(nèi)容
本發(fā)明所要解決的一個技術(shù)問題是提供一種XML數(shù)據(jù)流壓縮器,對網(wǎng)絡(luò)數(shù)據(jù)交換中傳輸海量的XML數(shù)據(jù)流進行壓縮,以減少網(wǎng)絡(luò)傳輸流量,提高XML數(shù)據(jù)流處理效率,滿足數(shù)據(jù)流應(yīng)用系統(tǒng)的要求。
本發(fā)明所要解決的另一個技術(shù)問題是提供一種XML數(shù)據(jù)流壓縮方法,適應(yīng)網(wǎng)絡(luò)XML數(shù)據(jù)流環(huán)境的傳輸與查詢處理需求,基于單遍掃描的XML數(shù)據(jù)流。
本發(fā)明所述的XML數(shù)據(jù)流壓縮器,包括Schema分析單元、SAX解析單元和壓縮單元;所述的Schema分析單元接收輸入的XML數(shù)據(jù)流的滿足的XML Schema,根據(jù)該Schema對XML數(shù)據(jù)流經(jīng)過SAX解析單元解析后的事件序列出現(xiàn)的頻率和元素類型進行分析;所述的SAX解析單元用于將輸入的XML數(shù)據(jù)流解析成SAX事件序列,輸入到壓縮單元;所述的壓縮單元根據(jù)Schema分析單元的分析結(jié)果,完成對SAX事件序列的壓縮,輸出壓縮數(shù)據(jù)流。
本發(fā)明的XML數(shù)據(jù)流的壓縮方法,包括如下步驟步驟一、接收輸入的XML數(shù)據(jù)流的滿足的XML Schema,根據(jù)該Schema對XML數(shù)據(jù)流經(jīng)過SAX解析單元解析后的事件序列出現(xiàn)的頻率和元素類型進行分析;步驟二、將輸入的XML數(shù)據(jù)流解析成SAX事件序列,輸入到壓縮單元;步驟三、根據(jù)Schema分析單元的分析結(jié)果,完成對SAX事件序列的壓縮和數(shù)據(jù)流數(shù)據(jù)部分的壓縮,輸出壓縮數(shù)據(jù)流。
本發(fā)明基于XML Schema,通過分析XML Schema,獲取全部的元素事件序列,根據(jù)元素定義,估算元素事件序列的頻率,產(chǎn)生壓縮編碼;首次提出了XML數(shù)據(jù)流的壓縮方法,滿足了信息系統(tǒng)之間基于XML數(shù)據(jù)高速傳輸與查詢處理的需求,并且在壓縮中保持了XML數(shù)據(jù)流原有的結(jié)構(gòu)壓縮結(jié)構(gòu)部分和數(shù)據(jù)部分的順序,因此,本發(fā)明的壓縮數(shù)據(jù)之上支持部分解壓縮數(shù)據(jù)回答XPath查詢。
圖1是XML數(shù)據(jù)流壓縮在整個數(shù)據(jù)流處理中的位置;圖2是本發(fā)明XML數(shù)據(jù)流壓縮器的示意圖;圖3是本發(fā)明XML數(shù)據(jù)流壓縮器事件序列表產(chǎn)生模塊的示意圖;圖4是本發(fā)明構(gòu)造元素事件序列圖的實例之一;圖5是本發(fā)明構(gòu)造元素事件序列圖的實例之二;圖6是本發(fā)明構(gòu)造元素事件序列圖的實例之三;圖7是本發(fā)明確定XML Schema高度的示意圖;圖8是本發(fā)明確定的Huffman編碼示意圖;圖9是本發(fā)明XML壓縮方法的示意圖;圖10是本發(fā)明構(gòu)造元素事件序列圖的流程圖;圖11是本發(fā)明構(gòu)造子元素事件序列圖的流程圖;圖12是本發(fā)明子元素事件序列圖和父元素事件序列圖合并的流程圖;圖13是本發(fā)明獲取事件序列的流程圖;圖14是本發(fā)明進行Huffman編碼碼表的流程圖。
具體實施例方式
本發(fā)明XML數(shù)據(jù)流壓縮在整個數(shù)據(jù)流處理中的位置,如圖1所示,本發(fā)明所要進行壓縮的XML數(shù)據(jù)流,首先要經(jīng)過SAX解析器,產(chǎn)生SAX解析事件的序列,然后再完成對SAX事件序列的壓縮形成在網(wǎng)絡(luò)中傳輸?shù)腟AX壓縮事件流;對該壓縮流進行局部解壓縮后,就可以提供各種XML的應(yīng)用(如Xpath處理器)。
根據(jù)網(wǎng)絡(luò)XML數(shù)據(jù)流的要求,壓縮器及其采用的壓縮方法必須單遍掃描數(shù)據(jù)流,完成數(shù)據(jù)流的壓縮;并且壓縮數(shù)據(jù)中保持原有的XML元素的順序。為了在一次壓縮過程中獲得盡可能高的壓縮編碼效率,必須對XML序列中元素事件序列的出現(xiàn)頻率進行合理的估計。
XML Schema作為XML的結(jié)構(gòu)約束,已經(jīng)得到越來越廣泛的應(yīng)用。在XML數(shù)據(jù)流所滿足的XML Schema中包括所有XML數(shù)據(jù)流中元素類型的定義。所以在數(shù)據(jù)流處理之前,可以分析XML Schema,獲取XML數(shù)據(jù)流中出現(xiàn)的結(jié)構(gòu)事件序列,估算XML元素事件序列的頻率,進而確定元素事件序列的編碼,完成XML數(shù)據(jù)流的壓縮。這樣雖然不如先進行一遍掃描獲得的元素事件序列頻率準(zhǔn)確,但是這種方法不需要掃描XML數(shù)據(jù)流就可以獲得相對準(zhǔn)確的元素事件序列頻率,壓縮過程可以只進行一遍掃描,適合網(wǎng)絡(luò)的XML流環(huán)境。這是本發(fā)明的基本出發(fā)點。
如果采用上述方式獲取XML序列的頻率信息,在XML數(shù)據(jù)流執(zhí)行壓縮之前,需要在數(shù)據(jù)源和數(shù)據(jù)目標(biāo)之間傳遞XML數(shù)據(jù)流所滿足的XML Schema,由于XML Schema是描述XML數(shù)據(jù)流的元數(shù)據(jù)(描述數(shù)據(jù)的數(shù)據(jù)),其大小遠遠小于數(shù)據(jù)流數(shù)據(jù)本身,傳遞XMLSchema的代價可以在整個壓縮過程中忽略。
本發(fā)明XML數(shù)據(jù)流壓縮器,包括Schema分析單元、SAX解析單元和壓縮單元;所述的Schema分析單元接收輸入的XML數(shù)據(jù)流的滿足的XML Schema,根據(jù)該Schema對XML數(shù)據(jù)流經(jīng)過SAX解析單元解析后的事件序列出現(xiàn)的頻率和元素類型進行分析;所述的SAX解析單元用于將輸入的XML數(shù)據(jù)流解析成SAX事件序列,輸入到壓縮單元;所述的壓縮單元根據(jù)Schema分析單元的分析結(jié)果,完成對SAX事件序列的壓縮,輸出壓縮數(shù)據(jù)流。
XML數(shù)據(jù)流中的信息,可以分為結(jié)構(gòu)部分和數(shù)據(jù)部分。在SAX事件解析中,startElement,EndElement事件來表達XML數(shù)據(jù)流中的結(jié)構(gòu)信息。以背景技術(shù)中的XML數(shù)據(jù)流的片段為例,StarteElement(book),Startelement(title),endelement(title),Startelement(author),endelement(author),endElement(book),屬于結(jié)構(gòu)部分的數(shù)據(jù),Text(“Database Principle”)和Text(“Ullman”)屬于數(shù)據(jù)部分的數(shù)據(jù)。由于XML是自描述數(shù)據(jù),存在大量的結(jié)構(gòu)冗余,結(jié)構(gòu)部分的壓縮是本發(fā)明的重點。
根據(jù)以上的分析,本發(fā)明根據(jù)SAX解析器的輸出,按照結(jié)構(gòu)部分和數(shù)據(jù)部分分別壓縮,輸出的壓縮數(shù)據(jù)中保持壓縮前結(jié)構(gòu)和數(shù)據(jù)序列順序。
如果是數(shù)據(jù)部分,則采用傳統(tǒng)的基于數(shù)據(jù)類型的壓縮算法,按照數(shù)值數(shù)據(jù)類型和字符數(shù)據(jù)類型分別采取不同的壓縮算法,如數(shù)據(jù)增量壓縮算法或Lempel-Ziv等壓縮算法,元素的數(shù)據(jù)類型信息通過XML Schema的解析信息獲取。
對于結(jié)構(gòu)部分,在保持原有的XML事件序列前提下,分析發(fā)現(xiàn)每兩個數(shù)據(jù)事件(如背景技術(shù)XML數(shù)據(jù)流片斷中的TEXT事件)間的結(jié)構(gòu)事件總是從一個endelement()開始到一個startelement()結(jié)束,如背景技術(shù)XML數(shù)據(jù)流片斷中的endelement(title),startelement(author)。對于XML數(shù)據(jù)流,數(shù)據(jù)事件間的這種endelement()...startelement()結(jié)構(gòu)事件是結(jié)構(gòu)部分的主體,而endelement()...startelement()可能出現(xiàn)的序列和頻率卻可以通過XML Schema預(yù)測出來,并且該endelement()...startelement()與數(shù)據(jù)部分事件相間出現(xiàn),不會由于分開壓縮而改變XML數(shù)據(jù)流的序列順序;因此,本發(fā)明對所有可能出現(xiàn)的endelement()...startelement()類型根據(jù)它們出現(xiàn)的頻率,給出相應(yīng)的Huffman編碼;可能出現(xiàn)的頻率越高,其對應(yīng)的Huffman編碼的碼長越小。
事件序列表中的事件序列通過分析XML Schema來枚舉,根據(jù)估算的頻率分配優(yōu)化的編碼。如果在XML Schema中存在遞歸定義,則我們只能枚舉部分的事件序列,因此,事件序列表需要在數(shù)據(jù)壓縮過程中動態(tài)維護。我們分析XML Schema產(chǎn)生事件序列表,在XML數(shù)據(jù)流壓縮過程中,檢查XML Schema預(yù)測的事件序列表中是否出現(xiàn)該序列,如果出現(xiàn),則輸出事件序列的編號;如果沒有找到,則將事件序列增加到事件序列表中,同時輸出新增的事件序列。
預(yù)先構(gòu)造元素事件序列編碼表的另一個優(yōu)勢是提高壓縮處理效率。由于元素事件序列編碼表是在數(shù)據(jù)流處理之前,通過分析XML Schema獲取,這樣避免了在數(shù)據(jù)流處理過程中頻繁增加元素事件序列編碼表的內(nèi)容,提高了數(shù)據(jù)流的處理效率。
基于以上數(shù)據(jù)部分與結(jié)構(gòu)部分分別壓縮的設(shè)計,如圖2所示,本發(fā)明的壓縮單元包括事件序列壓縮模塊和數(shù)據(jù)壓縮模塊;SAX解析的結(jié)構(gòu)部分輸入事件序列壓縮模塊,由事件序列壓縮模塊通過Schema分析單元獲得事件序列碼表,完成對結(jié)構(gòu)部分的壓縮;SAX解析的數(shù)據(jù)部分輸入數(shù)據(jù)壓縮模塊,由數(shù)據(jù)壓縮模塊通過Schema分析單元獲得數(shù)據(jù)的類型,根據(jù)預(yù)先設(shè)定的對該類型的壓縮方式,完成對數(shù)據(jù)部分的壓縮。
由于經(jīng)過不同模塊壓縮后的數(shù)據(jù)要共用同一數(shù)據(jù)鏈路進行傳輸,并且即使是相同的模塊進行壓縮也可能輸出不同的結(jié)果,所以不同類型的壓縮數(shù)據(jù)必須分別標(biāo)記出來。本發(fā)明采用前導(dǎo)編碼的方式加以標(biāo)記,便于解碼端進行解碼。
事件序列壓縮模塊根據(jù)SAX解析后產(chǎn)生的事件流中的結(jié)構(gòu)信息,查找事件序列編碼表中對應(yīng)的編碼,如果查找到,則輸出事件序列編碼,前導(dǎo)控制編碼為1;如果沒有查找到,則向事件序列編碼表中追加事件序列,同時輸出事件序列,前導(dǎo)編碼為0111;數(shù)據(jù)壓縮模塊根據(jù)SAX解析后產(chǎn)生的事件流中的數(shù)據(jù)信息,從Schema解析器中獲取當(dāng)前元素的類型信息,根據(jù)不同的數(shù)據(jù)類型采取不同的壓縮方法;數(shù)據(jù)部分中的不同種類壓縮數(shù)據(jù)也通過前導(dǎo)編碼,便于解壓縮過程的執(zhí)行。
對于數(shù)值類型,由于最大的可能是數(shù)值本身的長度要大于數(shù)值之間的差值的長度,因此,如果數(shù)據(jù)是數(shù)值類型,則比較當(dāng)前值和上一次保存值之間的差別,如果之間的差別大于256(8位,lbyte),則直接輸出當(dāng)前值,前導(dǎo)編碼為010;如果之間的差別小于256,則輸出增量數(shù)據(jù),前導(dǎo)編碼是000;對于字符類型,通過數(shù)據(jù)字典編碼表來實現(xiàn)。如果在壓縮過程中數(shù)據(jù)是字符數(shù)據(jù),則首先檢查數(shù)據(jù)字典表中是否存在對應(yīng)的編碼,如果存在,則輸出數(shù)據(jù)字典表編碼,前導(dǎo)編碼為0110;如果字典表中不存在對應(yīng)的編碼,則追加當(dāng)前數(shù)據(jù)到字典表中,同時輸出當(dāng)前數(shù)據(jù),前導(dǎo)編碼001;對于其他類型的處理方法與以上的兩種方法基本相同,首先通過相應(yīng)的碼表進行編碼,然后輸出編碼及前導(dǎo)編碼,這里不在贅述。
本發(fā)明所述的對XML數(shù)據(jù)流的SAX解析是一種XML數(shù)據(jù)處理領(lǐng)域的必備的和通常的技術(shù),關(guān)于SAX解析單元的結(jié)構(gòu)和解析方法可以參見有關(guān)文獻?;驈腦ML的專業(yè)網(wǎng)站xml.apache.org/xerces-j獲得。
下面對Schema分析單元及其采用的算法進行詳細描述。
Schema分析單元,如圖2所示,包括Schema解析模塊、事件序列編碼產(chǎn)生模塊和事件序列碼表存儲模塊;XML數(shù)據(jù)流所滿足XML Schema輸入到Schema解析模塊,由Schema解析模塊完成Schema的解析后,輸出到事件序列編碼產(chǎn)生模塊;事件序列編碼產(chǎn)生模塊根據(jù)Schema的解析的結(jié)果,生成事件序列碼表,將碼表輸出到事件序列碼表存儲模塊;事件序列碼表存儲模塊用于存儲事件序列碼表,與壓縮模塊相連,使得壓縮模塊在執(zhí)行壓縮過程中可以獲取該碼表。
XML Schema也是一個XML文檔,所以對它的處理仍就需要首先對XML Schema進行解析,獲得目錄樹結(jié)構(gòu)。由于XML Schema是完全接收后再進行解析,所以XML Schema的解析采用通常的方法。關(guān)于XML Schema的解析可以參考網(wǎng)址http//www.w3.org/XML/Schema。
在整個XML數(shù)據(jù)流的壓縮過程中,分析XML Schema所產(chǎn)生的編碼碼表都必須存在,所以Schema分析單元中包括一個事件序列碼表存儲模塊,該模塊與壓縮單元中的事件序列壓縮模塊和數(shù)據(jù)壓縮模塊都可以進行交互,以完成整個編碼過程。
事件序列編碼產(chǎn)生模塊,如圖3所示,包括事件序列圖產(chǎn)生模塊、獲取元素事件序列模塊和Huffman編碼模塊;所述的事件序列圖產(chǎn)生模塊根據(jù)XML Schema產(chǎn)生反映XML數(shù)據(jù)流SAX解析元素事件序列的事件序列圖;所述的獲取元素事件序列模塊根據(jù)事件序列圖產(chǎn)生模塊生成的事件序列圖獲取XML結(jié)構(gòu)事件序列及相應(yīng)的頻率權(quán)重;所述的Huffman編碼模塊根據(jù)獲取元素事件序列模塊獲取的XML結(jié)構(gòu)事件序列的類型及相應(yīng)的頻率權(quán)重,形成事件序列的Huffman編碼。
XML Schema中元素是通過子元素的正則表達式定義,正則表達式中支持’.’連接操作符號,’*’閉包操作符號,’|’選擇操作符號,直接分析正則表達式,很難完備地獲取元素事件序列由于正則表達式可以等價完備地轉(zhuǎn)換為自動機,可以采取有向圖的形式來表示自動機,從而表達正則表達式所定義的XML Schema中的元素,而計算機在處理有向圖的方面,存在大量已有算法,所以本發(fā)明采用了構(gòu)造事件序列圖的方法,來快速、準(zhǔn)確地完成Schema的分析。
事件序列圖產(chǎn)生模塊完成分析XML Schema的定義,產(chǎn)生XML元素事件序列圖,便于系統(tǒng)找到事件序列;獲取元素事件序列模塊根據(jù)元素事件序列的特點,在元素事件序列圖中找到所有可能的元素事件序列,并估算序列的頻率;Huffman編碼模塊根據(jù)已有的元素事件序列和序列的估算的頻率,構(gòu)造序列的Huffman編碼。
所述的元素事件序列圖,結(jié)構(gòu)如圖4-圖6所示,如果Y表示XML Schema中所有出現(xiàn)的元素名稱,計算機中定義XML Schema元素事件序列圖G=(N,E,W),其中,N表示節(jié)點集合,邊集合E=Estart∪Eend∪Eempty,Estart表示元素的startElement事件,Eend表示元素的endElement事件,Eempty表示空事件,其中每個元素屬于Y;W是E集合到自然數(shù)的映射,表明邊的權(quán)重。給定任何一個元素,限定Estart的權(quán)重和Eend的權(quán)重是相等的。
根據(jù)元素之間的定義連接不同的邊,邊就是表示元素事件,邊的連接序列表示元素的事件序列,邊的權(quán)重與邊可能出現(xiàn)的頻率相對應(yīng),權(quán)重越高,對應(yīng)的頻率越高。
在XML Schema中,可以限定一個元素僅僅存在一個定義,如果存在兩個或多個定義,可以使用“|”操作符號連接不同定義,合并不同的定義為一個定義。根據(jù)XML Schema規(guī)范,給定元素定義表達為正則表達式P,P所生成的所有語言為L,定義正則表達式P的初始子元素集合I為L中所有元素序列中出現(xiàn)的初始元素的集合;定義正則表達式E的終止子元素集合E為L中所有元素序列中出現(xiàn)的終止元素的集合。例如,正則表達式(A|B)*C生成的字符串包括AC,BC,C,ABC,...所以,正則表達式(A|B)*C的初始元素集合包括A,B,C,終止元素集合包括C。正則表達式(A|B)C*所生成字符串包括A,B,AC,BC...,所以正則表達式(A|B)C*的初始元素集合包括A,B,終止元素集合包括A,B,C。
由于XML是樹狀數(shù)據(jù),元素定義嵌套的情況廣泛存在,即定義中還包括定義,比如定義的正則表達式為R=AC*,再定義A=K|B。本發(fā)明采用了層層剝離的方法來構(gòu)造元素事件序列圖,首先構(gòu)造子元素的元素事件序列圖,然后,合并子元素事件序列圖到父元素事件序列圖,從而構(gòu)造整個XML Schema所對應(yīng)的事件圖框架。如果元素p通過元素s來定義,則p所定義的元素事件序列圖是父元素事件序列圖,s所定義的元素事件序列圖是子元素事件序列圖。
設(shè)子元素為K,K的startElement和endElement邊的權(quán)重為W,本發(fā)明首先構(gòu)建k所對應(yīng)元素事件序列圖的開始節(jié)點StartNode,連接StartNode到K的初始子元素集合的StartElement邊的起點;建立結(jié)束節(jié)點endNode,連接K的終止子元素集合的endElement邊的終點到endNode;然后,遞歸分析K的定義,如果是E1.E2類型,則EndELement(a)的終點連接StartElement(b)的起始點,a是E1的終止子元素集合的任意元素,b是E2的初始元素集合的任意元素;如果是E1|E2類型,則StartElement(a)和StartElement(b)的起點合并,EndElement(c)和EndELment(d)終點合并,a是E1的初始元素集合的任意元素,b是E2初始元素集合的任意元素,c是E1終止元素集合的任意元素,d是E2終止元素集合的任意元素;如果是(E1)*,則EndElement(a)的終點連接StartElement(b)的起點連接,a是E1的終止元素集合的任意元素,b是E1的初始元素集合的任意元素,El中的任意元素所對應(yīng)的StartElement邊和endElement邊的權(quán)重等于w+1。
(E1)*表示E1可以重復(fù)多次,對次數(shù)并沒有限制。因為(E1)*是可以重復(fù)的,所以對E1的邊代表的元素事件序列可能出現(xiàn)的頻率會高,如果E1中包含了另一個帶有’*’的正則表達式,如E1=E2(E3)*,則E3的邊所代表的結(jié)構(gòu)事件出現(xiàn)的頻率會高于E1的邊代表的,所以E3對應(yīng)的Huffman編碼的級別應(yīng)該高,或者說所對應(yīng)碼長應(yīng)該比E1對應(yīng)Huffman碼短。對于XML數(shù)據(jù)流而言,如果重復(fù)的情況并不多,則滿足該Schema的XML數(shù)據(jù)流不會很大,采用哪種編碼方式的結(jié)果相差不多;如果重復(fù)的情況很多,則本發(fā)明的這種編碼方式會顯示出強大的優(yōu)勢。雖然本發(fā)明的編碼方式不是最佳的編碼方式(最佳的編碼是掃描整個XML數(shù)據(jù)流,獲得真正的頻率,而不是估計),但是本發(fā)明通過Schema對結(jié)構(gòu)序列作出了最符合可能出現(xiàn)的情況的編碼,在滿足數(shù)據(jù)流處理要求的情況下,實現(xiàn)了海量的XML數(shù)據(jù)流的合理壓縮。
子元素的事件序列圖構(gòu)造完成以后,合并子元素事件序列圖到父元素事件序列圖,完成整個事件序列圖的構(gòu)造。首先,按構(gòu)建子元素事件序列圖的方法構(gòu)造父元素事件序列圖;如果父元素為e,定位父元素事件序列圖中的startElement(e)和endElement(e);斷開父圖中startElement(e)和endElement(e)的連接;連接startElement(e)的終點到子圖的startNode節(jié)點;連接子圖的endNode節(jié)點到父圖endElement(e)的起點;檢查父圖和子圖是否存在相同的邊,如果存在,則刪除子圖的startElement(k)(假定startElement(k)重復(fù)),并對元素事件序列圖進行調(diào)整。
對于以上的過程,也可以用以下嚴(yán)謹(jǐn)?shù)拿枋?.初始化構(gòu)造圖G=(N,E,W),其中,圖G中包含兩條邊,e1和e2,e1標(biāo)記為startElement(root),權(quán)重為1,e1標(biāo)記為endElement(root),權(quán)重為1,e1的終點指向e2的初始點。Root是XML的根元素。
2.掃描XML Schema定義,定位當(dāng)前XML Schema元素事件序列圖中startElement(e)邊和endElement(e)邊,當(dāng)前startElement(e)和endElement(e)的權(quán)重為K3.根據(jù)元素e的定義,構(gòu)造元素e的事件序列子圖,假定定義中包括n個不同元素,則初始化構(gòu)造子圖的起始點startNode和終止點endNode,構(gòu)造2n條邊,分別標(biāo)記為元素的startElement和endElement事件。
獲取元素定義e的初始子元素集合S,和終止子元素集合K;假定元素s屬于初始子元素集合S,則連接startNode到startElement(s)的起始點;假定元素k屬于終止子元素集合K,則連接endElement(k)終止點到endNode;處理元素e的定義3.1如果定義中存在E1.E2的情況,E1,E2是元素定義中的子表達式,E1的終止子元素集合為SE1,E2的初始子元素集合為KE2,對于任意a∈SE1,b∈SE2,將endElement(a)邊的終止結(jié)點和startElement(b)邊起始節(jié)點合并起來;3.2如果定義中存在E1|E2的情況,E1,E2是元素定義中的子表達式,E1的終止子元素集合為SE1,E1的初始子元素集合為KE1,E2的終止子元素集合為sE2,E2的初始子元素集合為KE1,對于任意a∈SE1,b∈SE2,將endElement(a)邊的終止結(jié)點和endElement(b)邊的終止結(jié)點合并;對于任意c∈KE1,d∈KE2,將startElement(c)邊的起始結(jié)點和startElement(b)邊的起始結(jié)點合并;3.3如果定義中存在(E1)*的情況,E1是元素定義中的子表達式,E1的初始子元素集合為SE1,E1的終止子元素集合為KE1,對于任意a∈SE1,則連接endElement(a)邊的終止節(jié)點和元素startElement(a)事件邊的起始節(jié)點,并且,對于E1表達式中的所有元素q,StartElement(q)的權(quán)重是k+1,endElement(q)的權(quán)重是k+1。
3.4如果e是原子元素,則構(gòu)造空轉(zhuǎn)換邊從e的startElement邊的終點到endElmenet邊的起點。,3.5重復(fù)3.1到3.4,直到所有的表達式獲得處理。
4.合并元素e所構(gòu)造的子圖到父圖父圖中斷開startElement(e)和endElement(e)的連接,父圖中startElement(e)終點連接到子圖定義的起始點startNode,子圖定義的終點endNode指向父圖中endElement(e)邊的起始點。
如果在子圖中出現(xiàn)了父圖中標(biāo)記相同的邊startElement(d)和endElement(d),則刪除子圖中startElement(d)和endElement(d),將子圖中startElement(d)邊的起始點連接標(biāo)記為空的邊到父圖中startElement(d)元素的起始點,父圖startElement(d)的邊終止點連接標(biāo)記為空的邊到子圖中startElement(d)終止點;將子圖中endElement(d)起始點的邊連接標(biāo)記為空的邊到父圖中endElement(d)的起始點,將父圖中endElement(d)的終止點連接標(biāo)記為空的邊到子圖的endElement(d)的終止節(jié)點。
5.重復(fù)2-4步,直到所有的元素定義處理完畢為止;通過具體的實例來說明元素事件序列圖的構(gòu)造,如圖4所示,元素的定義的正則表達式為R=AC*;A=String,C=String,A,C是簡單元素,start(A)和end(A)之間和start(C)和end(C)之間直接相連,C*表示C可以重復(fù)多次,所以end(C)和start(C)之間,通過空事件邊ε連接。end(A)與start(C)之間與end(C)與end(R)之間可以有ε也可以沒有,并沒有什么區(qū)別。這樣就得到了R=AC*的元素事件序列圖,所有滿足R=AC*定義的XML數(shù)據(jù)流中的所有的結(jié)構(gòu)部分序列都可以從該圖中獲得。
圖5所示的Schema的正則表達式為R=AC*,A=K|B|String,C=String,B=String;由于K與B是邏輯“或”的關(guān)系,根據(jù)上面的處理方法,start(K)和start(B)應(yīng)該有相同的開始結(jié)點,end(K)和end(A)應(yīng)該有相同的終止結(jié)點;合并父圖和子圖時,打開R=AC*中start(A)和end(A),和子圖中的start(A)和end(A)分別連接;然后刪去重復(fù)的start(A)和end(A)就得到了該正則表達式的元素事件序列圖。
圖6的正則表達式中存在遞歸,情況稍微復(fù)雜;其正則表達式為R=AC*,A=K|B,K=AB|String,C=String,B=String。按照上文的方法首先處理R=AC*,A=K|B,然后建立元素K的元素事件序列圖,由于K中的子元素A和B都是父元素事件序列圖中已經(jīng)存在的,所以,我們刪除子圖中元素A和B的相關(guān)邊。在圖6中,t1相當(dāng)于子元素事件序列圖中startElement(A)的起始點和整個子圖的startNode,t2相當(dāng)于endElement(A)終止點和startElement(B)的起點,t3相當(dāng)于endElement(B)的終點和整個子圖的endNode。刪除元素A和B之后,父圖中startELement(K)的終點連接空轉(zhuǎn)換到t1,t1連接空轉(zhuǎn)換到父圖startElement(a)的起點,父圖中endElement(A)終點連接空轉(zhuǎn)換到t2,t2連接空轉(zhuǎn)換到父圖的startElement(B)的起點,父圖中endElement(B)的終點連接空轉(zhuǎn)換到t3,t3連接空轉(zhuǎn)換到父圖的endElement(K)。上述連接操作的目的是保證在SAX解析中出現(xiàn)的所有元素事件序列都可以以圖中邊連接序列的形式出現(xiàn)。
根據(jù)以上的構(gòu)造過程,XML Schema元素事件序列圖具有如下的性質(zhì)一是XMLSchema元素事件序列圖中不存在兩條標(biāo)記相同的邊。每個XML Schema元素事件序列圖的構(gòu)造過程中,不包含重復(fù)標(biāo)記的邊;在子元素的元素事件序列圖和父元素的元素事件序列圖的合并過程中,去掉了重復(fù)的邊;二是如果在最終的XML Schema元素事件序列圖中,如果出現(xiàn)startElement(e)和endElement(e)連接的情況,則元素e一定是簡單元素;三是對于滿足XML Schema的XML文檔中出現(xiàn)的任意元素序列,都可以在XML Schema元素事件序列圖找到對應(yīng)邊的連接序列。
獲得元素事件序列圖后,就可以根據(jù)元素事件序列圖的性質(zhì),在獲取元素事件序列模塊中分析元素事件序列圖。根據(jù)SAX解析器的特性,元素事件的結(jié)構(gòu)序列都是從某個原子元素的endElement事件開始,到另一個原子元素的startElement終止。所謂的原子元素是指元素定義中通過基本數(shù)據(jù)類型,而不是通過其他元素來定義的元素,也稱為簡單元素。
分析XML Schema元素事件序列圖,找到在XML數(shù)據(jù)流中可能出現(xiàn)的元素事件序列;但是,如果在XML Schema定義中存在遞歸,則這個序列可能是無限長的,所以需要給出非遞歸XML Schema中包含的序列長度的最大值,同時將它作為遞歸XML Schema中預(yù)先計算的序列長度的一個上限。
對于給定XML Schema,標(biāo)記XML Schema的根元素r的高度為h(r)=1;如果元素s是元素p的子元素,則h(s)=h(p)+1;每個元素僅僅標(biāo)記一次,則XML Schema所有元素的最大高度值稱為XML Schema的高度。
根據(jù)上述KML Schema高度的定義,可知定義為R=AC*,A=K|B,K=AB的XML Schema高度為3,標(biāo)記序列如圖7所示。
由于在壓縮過程中必須保持?jǐn)?shù)據(jù)流中數(shù)據(jù)部分和結(jié)構(gòu)部分的順序,在結(jié)構(gòu)部分中不包含數(shù)據(jù)信息,所以,結(jié)構(gòu)序列結(jié)束于原子元素的startElement事件,開始于原子元素的endElement事件。在結(jié)構(gòu)序列之間,包括了對于XML數(shù)據(jù)部分的壓縮。結(jié)構(gòu)序列的壓縮,即原子元素的endElement事件到原子元素的startElement事件的壓縮是本發(fā)明的壓縮重點,而這種序列的長度,對于非遞歸XML Schema來講,是和XML Schema高度是相關(guān)的。
可以證明在XML Schema不存在遞歸的情況下,能夠找到的XML數(shù)據(jù)流中兩個數(shù)據(jù)元素間最長元素事件序列的長度是XML Schema高度的2倍。對于遞歸XML Schema來講,可能存在長度無限的元素事件序列。本發(fā)明中,可以將預(yù)先計算的結(jié)構(gòu)序列的長度限制在XML Schema高度的2倍。這種序列長度可以滿足非遞歸XML Schema的要求。如果在遵從遞歸XML Schema的XML文件中,出現(xiàn)了大于XML Schema高度2倍的結(jié)構(gòu)序列,則需要在壓縮過程中動態(tài)產(chǎn)生(序列不在碼表中的情況)。由于即使是遞歸的XML Schema出現(xiàn)大于XML Schema高度2倍的結(jié)構(gòu)序列的概率也是很小的,所以以上的處理方式是合適的。
分析元素事件序列圖,具體包括首先,定位XML Schema元素事件序列圖中標(biāo)記所有原子元素endElement的邊和根元素的startElement邊,由于這個邊是結(jié)構(gòu)序列的起點,結(jié)構(gòu)序列的終點是原子元素的startElement的邊或者是根元素的endElement邊。獲取元素事件序列方法是,從所有原子元素的endElement的邊和根元素的startElement邊出發(fā),搜索所有可能的滿足條件的邊的序列。中間形成的序列結(jié)果通過隊列保存,逐步增長序列,直到該序列的最后一條邊是原子元素的startElement邊,或者是根元素的endElement邊,或者序列中所包含的元素個數(shù)超過XML Schema高度的兩倍。
具體的搜索方法是確定元素事件序列s的最后邊1,在元素事件序列圖中直接找到或通過空轉(zhuǎn)換找到1的下一條邊k,將k增加到s中,來增長元素事件序列。
可以用隊列來存儲獲取的序列和需要編碼的序列,以上的處理過程包括初始化隊列Q為所有原子節(jié)點的endElement邊和根元素的startElement邊,并且初始化輸出結(jié)果集合F為空;然后,取出Q隊列中的某序列s,在隊列中刪除序列s;如果序列的長度大于2H,則F=F+{s};否則,判斷序列的終點是某個原子元素的startElement邊,或是根元素endElement邊,如果是,則F=F+{s};重新從隊列Q中取出下一個元素;如果是復(fù)雜元素,確定序列s的最后邊1,在元素事件序列圖中直接找到或者通過空轉(zhuǎn)移找到1的下一條邊的集合B,對于任意b屬于B,構(gòu)造新的序列s+b,加入隊列Q中;下面給出算法的一個具體實現(xiàn)步驟的描述定位XML Schema元素事件序列圖中標(biāo)記所有原子元素endElement的邊和根節(jié)點的startElement邊,增加到隊列Q中;
元素事件序列集合為F;XML Schema的高度為HWhile(Q不為空)<pre listing-type="program-listing"> 取元素事件序列1=e1,e2,...eI; If 1包含的元素超過2H, Then F=F+{1}; Else{令1的最后一條邊為last If last所對應(yīng)的元素不是復(fù)雜元素,并且last邊是該元素的 startElement邊,或者last是根元素的endElement邊 Then F=F+{1′) If last是復(fù)雜元素, then{集合B是last在元素事件序列圖中的下一條 邊的集合 K={s+b|b屬于B} Q=Q+K } } } Q=Q-{1} } Return F</pre>可以證明,上述算法獲取了包含了所有有效的長度不大于2H的元素事件序列。如果XML Schema中不包含遞歸,則元素事件序列最長為2H,而算法獲取了包含所有有效長度不大于2H的元素序列,所以算法能夠獲取非遞歸XML Schema中所有出現(xiàn)的元素事件序列。
例元素事件序列產(chǎn)生器分析圖6中元素事件序列如果將startElement(A)簡記為<A>,把endElement(A)簡記為</A>,則產(chǎn)生的序列為1.</C><C>權(quán)重為2,其余序列的權(quán)重為12.<R><A>
3.<R><A><B>
4.<R><A><K><A>
5.<R><A><K><A><B>
6.<R><A><K><A><K><A>
7.</A><B>
8.</A><C>
9.</B></A><B>
10.</B></A><C>
11.</B></K></A><B>
12.</B></K></A><C>
13.</B></K></K></A><B>
14.</B></K></K></A><C>
15.</B></K></K></K></A><C>
16.</B></K></K></K></K></A>
17.</B></K></K></K></K></K>
18.</C></R>
下一步,需要估算元素事件序列出現(xiàn)的頻率?,F(xiàn)在給出關(guān)于被壓縮XML數(shù)據(jù)的一個假定,如果XML Schema定義中出現(xiàn)’*’操作符號(表示元素序列的任意多次重復(fù)),則在對應(yīng)的XML文檔中,上述元素序列的確會有大量的重復(fù)。我們這個假設(shè)是基于如果XML文檔的體積很大,則必然是’*’操作符號作用的結(jié)果;如果假設(shè)不成立,則XML文檔的體積有限,數(shù)據(jù)壓縮的必要性也不明顯。
在XML Schema元素事件序列圖的定義過程中,注意到元素事件序列圖中的邊的權(quán)重是和元素定義中的’*’操作符號相關(guān)的,根據(jù)我們上文的假設(shè)和XML Schema的構(gòu)造過程,XML Schema中的’*’的操作符號能夠提高元素事件序列的權(quán)重,所以,本文利用邊的權(quán)重來估算元素事件序列的頻率。給定元素事件序列L=e1e2...e2,則整個元素序列的權(quán)重取決于整個序列中頻率最小的元素的頻率,即weight(L)=min(weight(e1),...weight(en))。我們可以根據(jù)權(quán)重劃分不同的序列集合。我們假定集合M中存放所有權(quán)重為K的元素事件序列,集合N中存放所有權(quán)重為K+1的元素事件序列,則集合M的所有序列出現(xiàn)的頻率之和等于集合N中任意一個元素序列出現(xiàn)的頻率。根據(jù)這一頻率分布,我們可以采用Huffman編碼的思想構(gòu)造元素事件序列編碼。
在構(gòu)造編碼樹的過程中,如果兩個元素事件序列的頻率相同,則我們按照字母順序,指定兩個元素事件序列在樹中的相對位置。這樣做的目的是確保在數(shù)據(jù)目標(biāo)能夠重復(fù)編碼樹的構(gòu)建過程,避免從數(shù)據(jù)源傳遞編碼樹信息到數(shù)據(jù)目標(biāo),減少網(wǎng)絡(luò)傳輸代價。
構(gòu)造Huffman編碼碼表,包括如下過程首先根據(jù)每個序列,分別構(gòu)造節(jié)點,節(jié)點標(biāo)記為序列名稱;如果XML Schema存在遞歸,則預(yù)留事件序列編碼個數(shù)為1,其權(quán)重為1;按照節(jié)點所標(biāo)記的序列名稱的權(quán)重排序;設(shè)定權(quán)重w=1;獲取權(quán)重為w的序列集合S;當(dāng)前權(quán)重為w的序列集合,連同權(quán)重為w-1所產(chǎn)生二叉樹的根節(jié)點r(如果存在),作為二叉樹的葉節(jié)點,構(gòu)造二叉樹;反復(fù)執(zhí)行,直到所有的事件序列處理完畢;開始產(chǎn)生編碼,如果集合為空,則自根節(jié)點開始,按照左子樹標(biāo)記1,右子樹標(biāo)記0,遞歸循環(huán)標(biāo)記二叉樹,輸出葉結(jié)點和葉結(jié)點所對應(yīng)的編碼。如果按照上例的元素事件序列編號,則元素事件編碼如圖8所示,下標(biāo)的編號是元素事件編號。
本發(fā)明所述的XML數(shù)據(jù)流的壓縮方法,如圖9所示,包括如下步驟步驟一、接收輸入的XML數(shù)據(jù)流的滿足的XML Schema,根據(jù)該Schema對XML數(shù)據(jù)流經(jīng)過SAX解析單元解析后的事件序列出現(xiàn)的頻率和類型進行分析;步驟二、將輸入的XML數(shù)據(jù)流解析成SAX事件序列,輸入到壓縮單元;步驟三、根據(jù)Schema分析單元的分析結(jié)果,完成對SAX事件序列的壓縮,輸出壓縮數(shù)據(jù)流。
所述的步驟三中對SAX解析的結(jié)構(gòu)部分和SAX解析的數(shù)據(jù)部分分別采用不同的壓縮方法進行壓縮。
對于SAX解析的數(shù)據(jù)部分中數(shù)值類型,比較當(dāng)前值和上一次保存值之間的差別,如果之間的差別大于256(8位,lbyte),則直接輸出當(dāng)前值,如果之間的差別小于256,則輸出增量數(shù)據(jù)。
對于SAX解析的數(shù)據(jù)部分中的字符類型,檢查動態(tài)建立的數(shù)據(jù)字典碼表中是否存在對應(yīng)的編碼,如果存在,則輸出數(shù)據(jù)字典表編碼;如果字典表中不存在對應(yīng)的編碼,則追加當(dāng)前數(shù)據(jù)到字典表中,同時輸出當(dāng)前數(shù)據(jù)。
所述的步驟三中,采用不同的前導(dǎo)編碼將進行壓縮的壓縮模塊和壓縮方式標(biāo)記出來,使解碼端可以方便進行解碼。
對于結(jié)構(gòu)部分,根據(jù)SAX解析后產(chǎn)生的事件流中的結(jié)構(gòu)信息,查找事件序列編碼表中對應(yīng)的編碼,如果查找到,則輸出事件序列編碼,前導(dǎo)控制編碼為1;如果沒有查找到,則向事件序列編碼表中追加事件序列,同時輸出事件序列,前導(dǎo)編碼為0111;對于數(shù)據(jù)部分,根據(jù)SAX解析后產(chǎn)生的事件流中的數(shù)據(jù)信息,從Schema解析器中獲取當(dāng)前元素的類型信息,根據(jù)不同的數(shù)據(jù)類型采取不同的壓縮方法;如果數(shù)據(jù)是數(shù)值類型,則比較當(dāng)前值和保存值之間的差別,如果之間的差別大于256,則直接輸出當(dāng)前值,前導(dǎo)編碼為010;如果之間的差別小于256,則輸出增量數(shù)據(jù),前導(dǎo)編碼是000;如果數(shù)據(jù)是字符數(shù)據(jù),則檢查數(shù)據(jù)字典表中是否存在對應(yīng)的編碼,如果存在,則數(shù)據(jù)字典表編碼,前導(dǎo)編碼為0110;如果字典表中不存在對應(yīng)的編碼,則追加當(dāng)前數(shù)據(jù)到字典表中,同時輸出當(dāng)前數(shù)據(jù),前導(dǎo)編碼001。
所述的步驟一,包括步驟10、接收XML數(shù)據(jù)流所滿足XML Schema,完成Schema的解析;步驟11、根據(jù)Schema的解析的結(jié)果,獲取可能的序列,估計其出現(xiàn)的頻率,根據(jù)序列的頻率構(gòu)造Huffman碼表。
所述的步驟11中,采用構(gòu)造元素事件序列圖的方式獲取可能的序列及其出現(xiàn)的頻率,包括步驟110、根據(jù)XML Schema產(chǎn)生反映XML數(shù)據(jù)流之間元素關(guān)系的XML Schema元素事件序列圖;步驟111、根據(jù)事件序列圖獲取XML結(jié)構(gòu)事件序列的類型及相應(yīng)的頻率權(quán)重;步驟112、根據(jù)獲取元素事件序列模塊獲取的XML結(jié)構(gòu)事件序列的類型及相應(yīng)的頻率權(quán)重,形成Huffman碼表。
由于計算機對于向圖分析的優(yōu)勢,所以采用構(gòu)造向圖是本發(fā)明分析XML Schema的正則表達式的首選方法,可以獲得極高的效率。
構(gòu)造元素事件序列圖,如圖10所示,包括如下步驟步驟A、構(gòu)造每個子元素的元素事件序列圖;步驟B、合并子元素事件序列圖到父元素事件序列圖。
具體構(gòu)造子元素A的元素事件序列圖,如圖11所示,包括如下步驟設(shè)分析的元素為K,權(quán)重為W,步驟A1、分析Schema的元素定義的正則表達式;步驟A2、建立開始節(jié)點StartNode,連接StartNode到K的初始子元素集合的StartElement邊的起點;步驟A3、建立結(jié)束節(jié)點endNode,連接K的終止子元素集合的endElement邊的終點到endNode;步驟A4、遞歸分析K的定義,如果是E1.E2類型,則EndELement(a)的終點連接StartElement(b)的起始點,a是E1的終止子元素集合的任意元素,b是E2的初始元素集合的任意元素;否則,執(zhí)行下一步;步驟A5、如果是E1|E2類型,則StartElement(a)和StartElement(b)的起點合并,EndElement(c)和EndELment(d)終點合并,a是E1的初始元素集合的任意元素,b是E2初始元素集合的任意元素,c是E1終止元素集合的任意元素,d是E2終止元素集合的任意元素;否則,執(zhí)行下一步;
步驟A6、如果是(E1)*,則EndElement(a)的終點指向StartElement(b)的起點連接,a是E1的終止元素集合的任意元素,b是E1的初始元素集合的任意元素,E1中的任意元素StartElement邊和endElement邊的權(quán)重等于w+1。否則,執(zhí)行下一步;步驟A7、如果K是原子元素,則構(gòu)建空轉(zhuǎn)換連接startElement邊的終點到endElement邊的起點步驟A8、重新執(zhí)行步驟A4,直到完成K的定義的分析。
所述的步驟A4中,遞歸分析K的定義是指采用層層剝離的方法,先從最內(nèi)層分析起,如果發(fā)現(xiàn)一個定義元素關(guān)系的符號“.”,“|”或“*”就將符號的左右兩側(cè)整體看成是兩個元素,即A4-A6步驟中的E1和E2,分析完后再分析左右兩側(cè)是不是已經(jīng)是簡單元素了,如果不是,繼續(xù)分析直到符號“.”,“|”或“*”的左右兩端是簡單元素,不在包含有定義元素關(guān)系的符號。一般定義中“.”經(jīng)常省略。
分析符號定義內(nèi)層的層次,可以采用分級的方法如果包含括號,則括號內(nèi)為內(nèi)層定義,第一級;如果包含“*”,則“*”的定義為第二級,其余為第三級。如果幾個定義元素關(guān)系的符號,是相同級別,則可以從左到右來依次分析。
所述的步驟B,如圖12所示,設(shè)子圖對應(yīng)的正則表達式是對父圖中元素e的定義,包括步驟B1、按構(gòu)建子元素事件序列圖的方法構(gòu)造父元素事件序列圖;步驟B2、定位父元素事件序列圖中startElement(e)和endElement(e);步驟B3、斷開父圖中startElement(e)和endElement(e)的連接;步驟B4、連接startElement(e)的終點到子圖的startNode節(jié)點;步驟B5、連接子圖的endNode節(jié)點到父圖endElement(e)的起點;步驟B6、檢查父圖和子圖是否存在相同的邊,如果存在,則刪除子圖中相同的邊,并對元素事件序列圖進行調(diào)整。
對于本步驟來說,B6進行調(diào)整時,必須保證所有父圖或子圖包括的邊必須出現(xiàn),且相同的邊只能出現(xiàn)一次,這是該步驟的要求,通過ε連接完全可以達到這一目的。所以B6中,如果情況允許,刪除子圖中同樣出現(xiàn)在父圖中的邊,并對元素事件序列圖進行調(diào)整也同樣完全可行。
從元素事件序列圖中,獲取元素事件序列及權(quán)重,包括步驟C1、定位XML Schema元素事件序列圖中標(biāo)記所有原子元素endElement的邊和根元素的startElement邊;
步驟C2、得到所有可能的序列及權(quán)重,序列的權(quán)重表明了序列可能出現(xiàn)的概率的高低。
本發(fā)明采用隊列來保存獲得的可能的序列,當(dāng)然也可以采用其他的數(shù)據(jù)結(jié)構(gòu),處理的方法相同。至于序列的權(quán)重,根據(jù)得到的序列中權(quán)重最小的邊的權(quán)重就是整個序列的權(quán)重。
所述的步驟C1,包括如下過程從所有原子元素的endElement的邊和根元素的startElement邊出發(fā),搜索所有可能的滿足條件的邊的序列;中間產(chǎn)生的序列通過隊列保存,逐步增長序列長度,直到該路徑的最后一條邊是原子元素的startElement邊,或者是根元素的endElement邊,或者路徑中所包含的元素個數(shù)超過XML Schema高度的兩倍。
具體的搜索方法是確定當(dāng)前序列s最后一條邊e,在元素事件序列圖中直接獲取或者通過空轉(zhuǎn)換獲取e的下一條邊n,將n增加到s中,這樣逐步增長搜索序列,直到滿足要求為止。
所述的步驟C2,如圖13所示,包括步驟C21、初始化輸出結(jié)果集合F為空;步驟C22、從Q隊列取出Q中的某序列s;步驟C23、在隊列中刪除序列;步驟C24、判斷序列s是否滿足元素事件序列;如果滿足,則添加到F中;否則對s進行處理后,再從隊列中取出下一個序列,直到處理完Q中的所有序列。
所述的步驟C24,判斷序列s是否滿足元素事件序列,包括判斷序列的終點是某個原子元素的startElement邊,或是根元素endElement邊,如果是,則將s添加到F中,即F=F+{s};判斷終點元素是否是復(fù)雜元素,如果是,表明序列還不能滿足中止條件,需要繼續(xù)向下搜索。搜索的方法是確認(rèn)序列s的最后邊1,在元素事件序列圖中找到1下一條邊的集合B,對于任意b屬于B,構(gòu)造新的序列s+b,加入隊列Q中。通過這種方法,逐步增長序列,直到元素事件序列滿足條件為止。
為了處理遞歸定義,對序列的處理在所述的步驟C24之前還包括如果序列的長度大于2H,則將s添加到F中,即F=F+{s};否則執(zhí)行下一步。
根據(jù)序列的權(quán)重構(gòu)造Huffman編碼的方法有很多,下面給出一種采用構(gòu)造二叉樹的方式,獲取序列的Huffman編碼的實例。
所述的步驟112,獲取序列的Huffman編碼,如圖14所示,包括
步驟D1、根據(jù)每個序列,分別構(gòu)造節(jié)點,節(jié)點標(biāo)記為序列名稱;步驟D2、按照節(jié)點所標(biāo)記的序列名稱的權(quán)重排序,如果XML Schema中存在遞歸,則增加預(yù)留元素事件編碼,標(biāo)記為空,權(quán)重為1;步驟D3、設(shè)定權(quán)重W=1;步驟D4、獲取權(quán)重為W的序列集合S;如果S不為空,則執(zhí)行步驟D5;如果為空,則執(zhí)行步驟D7;步驟D5、獲取權(quán)重為W-1所產(chǎn)生二叉樹的根節(jié)點r;所有屬于S的節(jié)點,連同二叉樹的根節(jié)點r作為二叉樹的葉節(jié)點,構(gòu)造二叉樹;步驟D6、W=W+1,重新執(zhí)行步驟D4;步驟D7、自根節(jié)點開始,按照左樹標(biāo)記1,右樹標(biāo)記0,遞歸循環(huán)標(biāo)記標(biāo)記二叉樹;步驟D8、輸出葉節(jié)點和葉節(jié)點所對應(yīng)的編碼。
根據(jù)以上的敘述,得到了預(yù)測最為合理的對XML數(shù)據(jù)流進行一次掃描壓縮的XML流結(jié)構(gòu)序列的事件序列表。依據(jù)該表,就對SAX解析器解析的XML數(shù)據(jù)流的結(jié)構(gòu)部分進行壓縮,獲得較高的壓縮比率;并且由于在整個XML流的壓縮過程中,保持了XML流的順序,所以可以支持部分解壓縮回答Xpath查詢。
在解壓縮端,XML壓縮數(shù)據(jù)流解壓縮器,包括Schema分析單元、解壓縮單元和SAX還原單元;所述的Schema分析單元接收輸入的XML數(shù)據(jù)流所滿足的XML Schema,根據(jù)該Schema對XML數(shù)據(jù)流經(jīng)過SAX解析單元解析后的事件序列出現(xiàn)的頻率和類型進行分析;所述的解壓縮單元接收XML壓縮流,根據(jù)Schema分析單元的分析結(jié)果,完成對SAX事件序列的解壓縮,輸出SAX事件序列;所述的SAX還原單元用于將輸入SAX事件序列的還原成XML數(shù)據(jù)流,并輸出。
XML壓縮數(shù)據(jù)流的解壓縮方法,包括如下步驟步驟一、接收輸入的XML數(shù)據(jù)流的滿足的XML Schema,根據(jù)該Schema對XML數(shù)據(jù)流經(jīng)過SAX解析單元解析后的事件序列出現(xiàn)的頻率和類型進行分析;步驟二、根據(jù)Schema分析單元的分析結(jié)果,完成對XML壓縮數(shù)據(jù)流的解壓縮,得到SAX事件序列;步驟三、將得到的SAX事件序列還原成XML流,并輸出。
經(jīng)過本發(fā)明壓縮器/壓縮方法壓縮的XML數(shù)據(jù)流的解壓縮的過程,完全是壓縮過程的逆過程,這里不在贅述。這里要說明的是,一般如果進行Huffman編碼的碼表較小,可以采用直接傳遞碼表的方法,使解壓縮端得到用于解壓縮的碼表。但是,由于本發(fā)明的XML序列較多,碼表很大;如果采用傳遞碼表的方法,效率太低;所以本發(fā)明采用了傳遞Schema的方式,解壓縮端采用與壓縮端同樣的方式生成相同的碼表,進行解壓縮。
解壓縮后的XML流,提供給XML各種XML應(yīng)用,完成相應(yīng)的功能。如果XML應(yīng)用只請求部分的XML流中的數(shù)據(jù),由于壓縮流保持了XML流的順序,可以只進行部分解壓縮來回答請求。
本發(fā)明開創(chuàng)性的提出了網(wǎng)絡(luò)中廣泛應(yīng)用的XML流的壓縮方法,解決了網(wǎng)絡(luò)中XML傳輸?shù)幕A(chǔ)問題,并且本發(fā)明是一種無損的壓縮方法,在壓縮中保持了XML流的順序,創(chuàng)造性的提出了利用計算機圖形處理的強大功能處理XML Schema,獲得XML流的結(jié)構(gòu)序列及出現(xiàn)頻率,具有極為重大的意義和非常廣闊的應(yīng)用前景。
最后所應(yīng)說明的是以上實施例僅用以說明而非限制本發(fā)明的技術(shù)方案,盡管參照上述實施例對本發(fā)明進行了詳細說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解依然可以對本發(fā)明進行修改或者等同替換,而不脫離本發(fā)明的精神和范圍的任何修改或局部替換,其均應(yīng)涵蓋在本發(fā)明的權(quán)利要求范圍當(dāng)中。
權(quán)利要求
1.一種XML數(shù)據(jù)流壓縮器,其特征在于包括Schema分析單元、SAX解析單元和壓縮單元;所述的Schema分析單元接收輸入的XML數(shù)據(jù)流所滿足的XML Schema,根據(jù)該Schema對XML數(shù)據(jù)流經(jīng)過SAX解析單元解析后的事件序列出現(xiàn)的頻率和類型進行分析;包括Schema解析模塊、事件序列編碼產(chǎn)生模塊和事件序列碼表存儲模塊;XML數(shù)據(jù)流所滿足XML Schema輸入到Schema解析模塊,由Schema解析模塊完成Schema的解析后,輸出到事件序列編碼產(chǎn)生模塊;事件序列編碼產(chǎn)生模塊根據(jù)Schema的解析的結(jié)果,生成事件序列碼表,將碼表輸出到事件序列碼表存儲模塊;事件序列碼表存儲模塊用于存儲事件序列碼表,與壓縮模塊相連,使得壓縮模塊在執(zhí)行壓縮過程中可以獲取該碼表;所述的SAX解析單元接收輸入的XML數(shù)據(jù)流解析成SAX事件序列,輸入到壓縮單元;所述的壓縮單元包括事件序列壓縮模塊和數(shù)據(jù)壓縮模塊;SAX解析的結(jié)構(gòu)部分輸入事件序列壓縮模塊,由事件序列壓縮模塊根據(jù)Schema分析單元獲得事件序列碼表,完成對結(jié)構(gòu)部分的壓縮;SAX解析的數(shù)據(jù)部分輸入數(shù)據(jù)壓縮模塊,由數(shù)據(jù)壓縮模塊根據(jù)數(shù)據(jù)的類型,完成對數(shù)據(jù)部分的壓縮。
2.根據(jù)權(quán)利要求1所述的XML數(shù)據(jù)流壓縮器,其特征在于所述的數(shù)據(jù)壓縮模塊,對于數(shù)值類型,比較當(dāng)前值和上一次保存值之間的差別,如果之間的差別大于256(8位,1byte),則直接輸出當(dāng)前值,如果之間的差別小于256,則輸出增量數(shù)據(jù);對于字符類型,根據(jù)預(yù)先建立數(shù)據(jù)字典碼表檢查數(shù)據(jù)字典表中是否存在對應(yīng)的編碼,如果存在,則輸出數(shù)據(jù)字典表編碼;如果字典表中不存在對應(yīng)的編碼,則追加當(dāng)前數(shù)據(jù)到字典表中,同時輸出當(dāng)前數(shù)據(jù)。
3.根據(jù)權(quán)利要求1所述的XML數(shù)據(jù)流壓縮器,其特征在于所述的事件序列編碼產(chǎn)生模塊構(gòu)造元素事件序列圖,獲取可能的序列,估算事件序列出現(xiàn)的頻率,按序列的頻率構(gòu)造Huffman碼表;包括事件序列圖產(chǎn)生模塊、獲取元素事件序列模塊和Huffman編碼模塊;所述的事件序列圖產(chǎn)生模塊根據(jù)XML Schema產(chǎn)生反映XML數(shù)據(jù)流的SAX解析的元素事件序列的XML Schema元素事件序列圖;所述的獲取元素事件序列模塊根據(jù)事件序列圖產(chǎn)生模塊生成的事件序列圖獲取XML結(jié)構(gòu)事件序列的類型及相應(yīng)的頻率權(quán)重;所述的Huffman編碼模塊根據(jù)獲取元素事件序列模塊獲取的XML結(jié)構(gòu)事件序列的類型及相應(yīng)的頻率權(quán)重,形成Huffman碼表。
4.一種XML數(shù)據(jù)流的壓縮方法,其特征在于包括如下步驟步驟一、接收輸入的XML數(shù)據(jù)流的滿足的XML Schema,根據(jù)對Schema分析的結(jié)果,獲取XML流中可能出現(xiàn)的序列,估算序列的頻率,按序列的頻率構(gòu)造碼表;步驟二、將輸入的XML數(shù)據(jù)流解析成SAX事件序列,輸入到壓縮單元;步驟三、對于SAX解析的結(jié)構(gòu)部分,根據(jù)Schema分析單元的分析結(jié)果,完成壓縮;對于SAX數(shù)據(jù)部分,根據(jù)數(shù)據(jù)的完成壓縮;并保持與輸入SAX解析事件相同的順序輸出壓縮數(shù)據(jù)流。
5.根據(jù)權(quán)利要求4所述的XML數(shù)據(jù)流壓縮方法,其特征在于所述的步驟一,包括步驟10、根據(jù)XML Schema產(chǎn)生反映XML數(shù)據(jù)流的元素SAX解析事件序列的XMLSchema元素事件序列圖;步驟11、根據(jù)事件序列圖獲取XML結(jié)構(gòu)事件序列及相應(yīng)的頻率權(quán)重;步驟12、根據(jù)獲取元素事件序列模塊獲取的XML結(jié)構(gòu)事件序列及相應(yīng)的頻率權(quán)重,形成Huffman碼表。
6.根據(jù)權(quán)利要求5所述的XML數(shù)據(jù)流壓縮方法,其特征在于所述的步驟10,可以包括步驟A、構(gòu)造每個子元素的元素事件序列圖;步驟B、合并子元素事件序列圖到父元素事件序列圖。所述的步驟A,包括設(shè)分析的元素為K,權(quán)重為W,步驟A1、分析Schema的元素定義的正則表達式,步驟A2、建立開始節(jié)點StartNode,連接StartNode到K的初始子元素集合的StartElement邊的起點;步驟A3、建立結(jié)束節(jié)點endNode,連接K的終止子元素集合的endElement邊的終點到endNode;步驟A4、遞歸分析K的定義,如果是正則表達式連接類型E1.E2,則邊EndELement(a)的終點連接邊StartElement(b)的起始點,a是E1的終止子元素集合的任意元素,b是E2的初始元素集合的任意元素;否則,執(zhí)行下一步;步驟A5、如果是正則表達式選擇類型E1|E2,則邊StartElement(a)和邊StartElement(b)的起點合并,邊EndElement(c)和邊EndElement(d)終點合并,a是E1的初始元素集合的任意元素,b是E2初始元素集合的任意元素,c是E1終止元素集合的任意元素,d是E2終止元素集合的任意元素;否則,執(zhí)行下一步;步驟A6、如果是正則表達式閉包類型(E1)*,則邊EndElement(a)的終點連接StartElement(b)的起點,a是E1的終止元素集合的任意元素,b是E1的初始元素集合的任意元素,E1中出現(xiàn)的任意元素所對應(yīng)的StartElement邊和endElement邊的權(quán)重等于w+1;否則,執(zhí)行下一步;步驟A7、如果K是原子元素,則構(gòu)建空轉(zhuǎn)換連接startElement邊的終點到endElement邊的起點;否則,執(zhí)行下一步;步驟A8、重新執(zhí)行步驟A4,直到完成K的定義的分析。所述的步驟B,包括設(shè)子圖對應(yīng)的正則表達式是父圖中元素e的定義,步驟B1、定位父元素事件序列圖中startElement(e)和endElement(e);步驟B2、斷開父圖中startElement(e)和endElement(e)的連接;步驟B3、連接startElement(e)的終點到子圖的startNode節(jié)點;步驟B4、連接子圖的endNode節(jié)點到父圖endElement(e)的起點;步驟B5、檢查父圖和子圖是否存在相同的邊,如果存在,則刪除子圖中相同的邊,并對元素事件序列圖進行調(diào)整。
7.根據(jù)權(quán)利要求5所述的XML數(shù)據(jù)流壓縮方法,其特征在于所述的步驟11,可以包括步驟C1、定位XML Schema元素事件序列圖中標(biāo)記所有原子元素endElement的邊和根元素的startElement邊;步驟C2、取出所有可能的序列,序列的權(quán)重表明了序列可能出現(xiàn)的概率的高低。所述的步驟C1包括從所有原子元素的endElement的邊和根元素的startElement邊出發(fā),搜索所有可能的滿足條件的邊的序列;通過隊列保存中間結(jié)果,根據(jù)元素事件序列圖逐步增長邊的序列,直到該序列的最后一條邊是原子元素的startElement邊,或者是根元素的endElement邊,或者序列中所包含的元素個數(shù)超過XML Schema高度的兩倍;所述的步驟C2包括步驟C21、初始化輸出結(jié)果集合F為空;步驟C22、從Q隊列取出Q中的某序列s;步驟C23、在隊列中刪除序列;步驟C24、判斷序列s是否滿足元素事件序列的條件;如果滿足,則添加到F中;否則對s進行處理后,再從隊列中取出下一個序列,直到處理完Q中的所有序列。
8.根據(jù)權(quán)利要求5所述的XML數(shù)據(jù)流壓縮方法,其特征在于所述的步驟12,可以采用構(gòu)造二叉樹的方式,構(gòu)造序列的Huffman編碼,包括如下步驟步驟D1、根據(jù)每個序列,分別構(gòu)造節(jié)點,節(jié)點標(biāo)記為序列名稱;步驟D2、按照節(jié)點所標(biāo)記的序列名稱的權(quán)重排序,如果是遞歸XML Schema,則增加預(yù)留事件序列,其標(biāo)記為空,權(quán)重為1;步驟D3、設(shè)定權(quán)重W=1;步驟D4、獲取權(quán)重為W的序列集合S;如果S不為空,則執(zhí)行步驟D5;如果為空,則執(zhí)行步驟D7;步驟D5、如果權(quán)重為W-1的序列產(chǎn)生二叉樹,則獲取根節(jié)點r,連同所有屬于S的節(jié)點r作為二叉樹的葉節(jié)點,構(gòu)造二叉樹;步驟D6、W=W+1重新執(zhí)行步驟D4;步驟D7、自根節(jié)點開始,按照左樹標(biāo)記1,右樹標(biāo)記0,遞歸循環(huán)標(biāo)記二叉樹;步驟D8、輸出葉節(jié)點和葉節(jié)點所對應(yīng)的編碼。
9.一種XML壓縮數(shù)據(jù)流解壓縮器,其特征在于包括Schema分析單元、解壓縮單元和SAX還原單元;所述的Schema分析單元接收輸入的XML數(shù)據(jù)流所滿足的XML Schema,根據(jù)該Schema對XML數(shù)據(jù)流經(jīng)過SAX解析單元解析后的事件序列出現(xiàn)的頻率和類型進行分析;包括Schema解析模塊、事件序列編碼產(chǎn)生模塊和事件序列碼表存儲模塊;XML數(shù)據(jù)流所滿足XML Schema輸入到Schema解析模塊,由Schema解析模塊完成Schema的解析后,輸出到事件序列編碼產(chǎn)生模塊;事件序列編碼產(chǎn)生模塊根據(jù)Schema的解析的結(jié)果,生成事件序列碼表,將碼表輸出到事件序列碼表存儲模塊;事件序列碼表存儲模塊用于存儲事件序列碼表,與壓縮模塊相連,使得壓縮模塊在執(zhí)行壓縮過程中可以獲取該碼表;所述的解壓縮單元所述的壓縮單元包括事件序列解壓縮模塊和解數(shù)據(jù)壓縮模塊;結(jié)構(gòu)壓縮部分輸入事件序列解壓縮模塊,由事件序列解壓縮模塊根據(jù)Schema分析單元獲得的事件序列碼表,完成對結(jié)構(gòu)壓縮部分的解壓縮;數(shù)據(jù)壓縮部分輸入數(shù)據(jù)解壓縮模塊,由數(shù)據(jù)解壓縮模塊根據(jù)數(shù)據(jù)的類型,完成對數(shù)據(jù)壓縮部分的解壓縮;輸出SAX事件序列;所述的SAX還原單元用于將輸入SAX事件序列的還原成XML數(shù)據(jù)流,并提供給XML應(yīng)用。
10.一種XML壓縮數(shù)據(jù)流的解壓縮方法,其特征在于包括如下步驟步驟一、接收輸入的XML數(shù)據(jù)流的滿足的XML Schema,根據(jù)對Schema分析的結(jié)果,獲取XML流中可能出現(xiàn)的序列,估算序列的頻率,按序列的頻率構(gòu)造碼表;步驟二、對于結(jié)構(gòu)壓縮部分,根據(jù)Schema分析單元的分析結(jié)果,完成解壓縮;對于數(shù)據(jù)壓縮部分,根據(jù)數(shù)據(jù)的類型完成相應(yīng)的解壓縮;并保持與輸入的XML壓縮流順序一致,輸出SAX事件序列;步驟三、將SAX事件序列還原成XML流,并提供給XML應(yīng)用。
全文摘要
本發(fā)明公開了一種XML數(shù)據(jù)流的壓縮方法,包括接收輸入的XML數(shù)據(jù)流的滿足的XML Schema,根據(jù)該Schema對XML數(shù)據(jù)流經(jīng)過SAX解析單元解析后的事件序列出現(xiàn)的頻率和類型進行分析;將輸入的XML數(shù)據(jù)流解析成SAX事件序列,輸入到壓縮單元;根據(jù)Schema分析單元的分析結(jié)果,完成對SAX事件序列的壓縮,輸出壓縮數(shù)據(jù)流。本發(fā)明基于XML Schema,通過分析XML Schema,估算元素事件序列的頻率,產(chǎn)生壓縮編碼;首次提出了XML數(shù)據(jù)流的壓縮方法,滿足了信息系統(tǒng)之間基于XML數(shù)據(jù)高速傳輸與查詢處理的需求,支持單遍掃描完成壓縮,并且在壓縮中保持了XML數(shù)據(jù)流原有的結(jié)構(gòu)部分和數(shù)據(jù)部分的順序,因此,本發(fā)明支持部分解壓縮數(shù)據(jù)回答XPath查詢。
文檔編號H04L12/00GK1547326SQ20031011690
公開日2004年11月17日 申請日期2003年11月28日 優(yōu)先權(quán)日2003年11月28日
發(fā)明者高軍, 王騰蛟, 楊冬青, 唐世渭, 高 軍 申請人:北京大學(xué)