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