專利名稱:自適應壓縮方案的制作方法
技術領域:
本發(fā)明涉及一種用于壓縮例如XML(可擴展標記語言)或HTML(超文本標記語言)文檔的結構化文檔的方法和裝置。
背景技術:
作為標記語言的一個示例,XML是用于數(shù)據(jù)的呈現(xiàn)、交換和管理的重要技術。特別是,它成為了用于因特網(wǎng)服務和應用的關鍵構建組件。
XML在描述數(shù)據(jù)方面是很強大和靈活的。但是,一個缺點是它的冗長。那是由于呈現(xiàn)在一個XML文檔中的標記(例如,標簽)。盡管這是對于諸如簡單和靈活性的XML的優(yōu)點所付的必要代價,但它還是意味著對于XML文檔的更大的存儲空間、更多的網(wǎng)絡資源和更長的傳輸延遲。在移動環(huán)境中,例如具有有限的存儲和通過帶寬受限的連接來連接到因特網(wǎng)的移動設備中的網(wǎng)絡服務/應用,這可能是特別成問題的。
數(shù)據(jù)壓縮已經(jīng)用于解決冗長的問題。通用和XML特殊的壓縮算法兩者在(下文將描述的)文獻中都已經(jīng)呈現(xiàn)了。但是,它們有局限性。
在下文中,給出了對XML文檔的邏輯結構的簡短介紹。XML文檔包含一個或多個元素。每個元素用一個start-tag(起始-標簽)開始并用一個end-tag(結束-標簽)結束。Start-(起始-)和end-tag(結束-標簽)中的名稱給出了元素的類型。start-tag可以包含元素的屬性規(guī)格,其形式為屬性名稱和數(shù)值對。start-tag和end-tag之間的文字是元素的內(nèi)容,它能夠是字符數(shù)據(jù)或另一個元素。以這種方式,XML文檔中的所有元素邏輯上形成一個樹,該樹對每個文檔具有精確的一個根元素。也有特殊類型的沒有內(nèi)容的元素。它們稱為空元素。除了前面提到的規(guī)則格式之外,一個空元素也能夠用一個特殊的空元素標簽表示(即,沒有分離的start-和end-tag)。除了start-(起始-)和end-tag(結束一標簽)之外,在XML文檔中可以有其他標記,比如注釋、處理指令、CDATA段、文檔類型聲明、XML聲明等。
圖6示出了一個XML文檔的一般結構的示例。如圖6所示,一個XML文檔包含多個元素,每個元素標志有一個start-tag和end-tag,它們之間是元素的內(nèi)容。例如,<CATALOG>和</CATALOG>是元素CATALOG的start-tag和end-tag。一個元素可以包含其他的元素,它稱為“嵌套的”、“嵌入的”或“子”元素。例如,元素CATALOG包含很多像它的孩子一樣的元素CD。
XML文檔能夠用通用數(shù)據(jù)壓縮算法(下文中稱為通用算法)進行壓縮,比如LZ(Ziv和Lempel)算法族。這能夠導致相當好的壓縮比。但是,通用算法沒有充分利用XML的特點,而這些特點可能導致在壓縮比、CPU負載和存儲器消耗方面更好的性能。特別是,大多數(shù)壓縮算法需要相當大量的存儲器。
已經(jīng)采用了很多XML特殊壓縮算法來進一步提高通用算法的壓縮性能。一些特殊壓縮算法是XMill(H.Liefke和D.Suciu在2000年5月的關于數(shù)據(jù)管理的2000ACM SIGMOD國際會議紀要上的“Xmillan EfficientCompressor for XML Data”,第153-164頁)。它基于三個原理從數(shù)據(jù)中分離出結構(標簽和屬性),將相關數(shù)據(jù)項目分組為容器,并且對不同的容器應用語義(即,特殊化的)壓縮器。XMill以大致相同的速度表現(xiàn)出了關于gzip上的壓縮比的改進。但是,它具有某種限制a)不能夠適合于即時壓縮,因為它需要在應用gzip之前重建原始XML文檔中的數(shù)據(jù)到多個容器中;b)對于小(<20KB)XML文檔執(zhí)行得比gzip更差,因此對于一般包含小XML文檔的XML消息沒有用;c)需要大量的存儲器,例如對每個容器默認8MB;d)語義壓縮器需要人的交互作用;e)不首先對數(shù)據(jù)解壓縮就不能查詢壓縮數(shù)據(jù)。XGRIND(P.M.Tolani和J.R.Haritsa在2002年2月的關于數(shù)據(jù)工程的第18次國際會議紀要上的“XGRINDAQuery-friendly XML Compressor”)和XPRESS(J.-K.Min,M.-J.Park和C.-W.Chung在2003年6月的關于數(shù)據(jù)管理的2003 ACM SIGMOD國際會議紀要上的“XPRESSA Queriable Compression for XMLData”,第122-133頁)。以上兩者都設計為可友好地查詢。XPRESS通過對于標簽反轉算法編碼(代替字典代碼編碼)和對于數(shù)據(jù)值的類型特定的編碼的使用對XGRIND進行了改進。但是,它們具有以下缺點a)XGRIND需要DTD(文檔類型聲明)來識別列舉的-類型屬性;b)XGRIND和XPRESS兩者都需要對原始XML文檔進行兩次掃描第一次掃描以收集文檔的統(tǒng)計數(shù)字和第二次掃描來壓縮。這意味著它不能適用于在線壓縮;d)緩慢的壓縮速度,這主要是由于兩次掃描方案。
WBXML(2001年7月25日的無線應用協(xié)議Binary XML ContentFormat Specification,1.3版)。這個標準定義了XML的二進制表示?;旧希幋a器基于其結構為XML文檔設置標號。它的缺點是a)有損壓縮所有注釋、XML聲明、和文檔類型聲明將不在壓縮期間保存(它們必須被刪除);b)需要至少兩過程(two-pass)壓縮,因為字符串表格在設置了標號的文檔主體之前,這需要參考字符串表格。這減慢了壓縮并且也意味著它不能夠適用于在線壓縮;c)對于處理XML的未來改變沒有靈活性;d)對空白空格字符不進行壓縮。
而且,美國專利申請No.2002 0065822公開了一種結構化文檔壓縮方案,其中具有通用數(shù)據(jù)結構的多個結構化文檔用單個標簽列表壓縮。壓縮器必須預先獲知一個文檔具有與標簽列表相同的結構。因而,這種壓縮方案具有有限的應用性。而且,如果壓縮器預先不知道文檔結構,則需要兩過程。XML文檔中的所有標簽被提取并放到標簽列表中。除了壓縮后的XML文檔,壓縮器還單獨地發(fā)送標簽列表。此外,假定在一個文檔中標簽以與標簽列表完全相同的順序出現(xiàn)。否則,壓縮將是有損的。
而且,在日本公開申請No.2003157249A中,描述了文檔壓縮和存儲方法。形成一個壓縮結果索引(CRX)并將其存儲在XML數(shù)據(jù)庫中,壓縮結果索引指定了一個節(jié)點、原始組件和分配給對應于一個可擴展標記語言(XML)文檔的方案的每個節(jié)點的部分的文檔標識符之間的關系。通過設置對應于保存的CRX的一組組件標識符形成一個壓縮結果設置(CRS)。
發(fā)明內(nèi)容
本發(fā)明的一個目的是提供一種對于結構化文檔的改進的壓縮/解壓縮方案,它是快速的并且具有低存儲器消耗。
本發(fā)明介紹了一種用于諸如XML和HTML文檔的結構化文檔(即,具有標記語言特征的文檔)的壓縮方法,它是快速的并具有低存儲器消耗。能夠創(chuàng)建一種使得人類可讀的壓縮文檔。該壓縮方法是自適應的,即它不需要對于XML文檔的DTD(文檔類型聲明)或XML方案的任何先前知識。此外,它只需要原始XML文檔上的一個過程并且因此能夠適用于在線壓縮。這個想法是編碼器解析一個XML文檔并且為元素標簽和元素內(nèi)容中的選擇性字符數(shù)據(jù)即時建立分等級的字典。字典用于壓縮連續(xù)的元素標簽和相同掃描內(nèi)對應等級處的內(nèi)容。字典隱含地在壓縮文檔中發(fā)送,使得解碼器能夠重新建立分等級的字典并對壓縮文檔解壓縮。
按照本發(fā)明的壓縮方案是自適應的,即假定沒有關于輸入XML文檔的在先知識。特別是,它不依賴于用DTD(文檔類型聲明)或XML方案描述的文檔語法的先前知識。單過程(single-pass)支持在線壓縮,因為不需要緩沖整個XML文檔。
按照本發(fā)明,由于分等級的字典方法和關注于元素標簽,能夠實現(xiàn)與現(xiàn)有算法相比快很多的壓縮速度和更少的存儲器消耗。這對于通常具有有限資源的移動設備尤其有用。它也有助于支持XML文檔壓縮的服務器的可擴展性。
對于在網(wǎng)頁瀏覽中出現(xiàn)的最典型的一種小(例如<20KB)的XML文檔有良好的壓縮性能。此外,本發(fā)明的核心過程與現(xiàn)有技術相比更容易實現(xiàn)。本發(fā)明的壓縮算法能夠容易地與通用數(shù)據(jù)壓縮算法組合以實現(xiàn)高壓縮比。
壓縮方案是同類型的,即在壓縮數(shù)據(jù)中保存原始XML數(shù)據(jù)的結構。這允許對壓縮的XML數(shù)據(jù)直接進行查詢。
圖1示出了表示按照本發(fā)明的實施例的壓縮方法的流程圖,圖2更詳細地示出了表示圖1中的流程的一部分流程圖,圖3示出了表示按照本發(fā)明的實施例的解壓縮方法的流程圖,圖4示出了表示按照本發(fā)明的實施例的壓縮裝置的示意性框圖,圖5示出了表示按照本發(fā)明的實施例的解壓縮裝置的示意性框圖,圖6示出了一個XML文檔結構的示例,圖7示出了圖6的XML文檔示例的邏輯圖,圖8示出了從按照本發(fā)明的壓縮方案的XML文檔示例形成的不同等級的字典,圖9示出了從按照本發(fā)明的壓縮方案的XML文檔示例生成的壓縮的XML文檔,圖10示出了按照本發(fā)明的解壓縮方案的從壓縮的XML文檔重新構建的字典。
具體實施例方式
如圖7所示,一個XML文檔中所有的元素都用樹結構邏輯地進行組織。每個XML文檔只有一個根元素。按照圖6所示的示例,CATALOG是根元素。這個根元素包含其子元素(該示例中的CD),并且這些子元素依次包含它們自己的子元素(TITLE(標題)、ARTIST(藝術家)、COUNTRY(國家)、COMPANY(公司)、PRICE(價格)、YEAR(年份))等等。
按照本發(fā)明,為在樹中的元素(即,節(jié)點)分配等級號碼。從而,根元素具有等級0,根元素的子元素具有等級1,等等。利用這個樹結構來生成用于不同等級元素的不同字典并只用在該元素的等級的字典壓縮一個元素。圖8示出了從圖6的XML文檔示例形成的在不同等級的字典。對結構化文檔中每個等級單獨形成字典將在下文中更詳細地描述。
將注意到XML只是可應用格式的一個示例。本發(fā)明可簡單地應用到具有標記語言特征的其他格式。
最初,一個諸如圖4所示的壓縮裝置40的壓縮器設置一個設為空的字典。它也設置一個參數(shù)current_level(當前等級)為0。接著,壓縮器線性地掃描一個XML文檔。將注意到壓縮器只需要經(jīng)過文檔的單過程。
當壓縮器遇到一個例如圖8所示的<CATALOG>的start-tag時,壓縮器將搜索在current_level的字典中的start-tag。如果發(fā)現(xiàn)匹配,就輸出在current_level的字典的一個參考。如果沒有發(fā)現(xiàn)匹配,就將start-tag添加到在current_level的字典中并且該標簽不經(jīng)壓縮地輸出。在以上兩種情況下,參數(shù)current_level遞增。
如圖8所示,<CATALOG>添加到等級0字典,并且如圖9所示<CATALOG>未經(jīng)壓縮地輸出。接著,遇到一個start-tag<CD>。因為也是第一次遇到<CD>,即沒有對應的條目在current_level,即等級1的字典中,<CD>添加到等級1字典并如圖9所示未經(jīng)壓縮地輸出,圖9表示從圖6的XML文檔示例生成一個壓縮的XML文檔。參數(shù)current_level遞增并且繼續(xù)掃描。接著,遇到一個start-tag<TITLE>。因為在current_level,即等級2的字典中沒有發(fā)現(xiàn)匹配,所以<TITLE>添加到等級2字典,如圖9所示未經(jīng)壓縮地輸出并且參數(shù)current_level遞增。
當壓縮器遇到一個end-tag時,壓縮器輸出一個特殊代碼字以通知當前元素結束并且將參數(shù)current_level遞減。將注意到end-tag將不添加到字典,因為它們能由解壓縮器從對應的start-tag導出。
如圖8所示,在<TITLE>之后,壓縮器遇到一個end-tag</TITLE>。輸出一個特殊代碼字,例如圖9所示的“END_TAG”,并且參數(shù)current_level遞減。
從而,當遇到下一個start-tag,例如圖8所示的<ARTIST>時,因為在current_level,即等級2的字典中沒有發(fā)現(xiàn)匹配,所以就將<ARTIST>添加到等級2的字典中并且將其如圖9所示未經(jīng)壓縮地輸出。
在current_level的字典中發(fā)現(xiàn)匹配的情況下,例如當在如圖8所示的第二次遇到start-tag<CD>和<TITLE>時,如圖9所示輸出對于字典的一個參考。
作為一種選擇,如果壓縮器知道將被壓縮的XML文檔,則壓縮器可以甚至在壓縮之前預先植入字典。
如能夠從圖9看到的,沒有生成單獨的字典。它們“嵌入”到壓縮的XML文檔中。START_TAG和END_TAG是用于壓縮的特殊代碼字(或信號)。在實現(xiàn)時,它們能夠進行選擇以具有不能出現(xiàn)在XML的字母表中的值。不需要指明START_TAG的current_level,因為解壓縮器能夠導出它。通常,START_TAG之后的一個索引用于指明在字典(在current_level)中的哪個條目對應于當前的start-tag。按照該示例,(START_TAG,0)指“<CD>”的等級是1,索引=0。但是,如果當前被壓縮的start-tag的位置與字典中的start-tag的位置相同,則可以省略它。例如,START_TAG對應于<TITLE>、<ARTIST>等。
一個諸如圖5所示的解壓縮裝置50的解壓縮器基本上執(zhí)行壓縮器的反向操作,將在下文中參照圖10對其進行描述。
最初,解壓縮器將字典設置設為空。它還將參數(shù)current_level設為0。它接著線性地掃描一個接收到的壓縮XML文檔。它以與壓縮器相同的方式跟蹤current_level,即在遇到start-tag和end-tag后進行遞增或遞減。
當遇到一個未壓縮的start-tag時,解壓縮器將其復制輸出,并將它添加到在current_level的字典中。以這種方式,如能夠從圖9和圖10中看到的,解壓縮器能夠重建與壓縮器完全相同的字典。當遇到一個壓縮的start-tag時,解壓縮器復制字典中對應的標簽來輸出。
當遇到一個end-tag代碼字時,解壓縮器基于它已經(jīng)在相同等級處理過的最新的start-tag重建并輸出end-tag。對于其他未壓縮的數(shù)據(jù),按照該示例,解壓縮器將其直接復制來輸出。
圖1示出了表示按照本發(fā)明的一個實施例的上述壓縮過程的流程圖。
在搜索步驟S10,對一個諸如XML文檔的結構化文檔例如從結構化文檔的開頭到結尾搜索一次來尋找第一和第二標志,第一標志表示結構化文檔的一個元素的開始,并且第二標志表示結構化文檔的一個元素的結束。對上述示例進行假設,start-tag是第一標志,并且end-tag是第二標志。
當在搜索步驟中遇到一個第一標志時(步驟S1l中的“第一標志”),輸出第一標志的代表(步驟S12),并且等級計數(shù)器遞增(步驟S13),等級計數(shù)器的值表示一個元素在結構化文檔中位于哪個等級。第一標志的代表可以是未壓縮的第一標志或者對未壓縮的第一標志的一個參考。
當在搜索步驟中遇到一個第二標志時(步驟S11中的“第二標志”),輸出第二代碼數(shù)據(jù)(步驟S14)并且等級計數(shù)器遞減(步驟S15)。在步驟S16中,檢查文檔是否已經(jīng)搜索了一次。如果沒有,程序返回到步驟S10并且繼續(xù)搜索。
如圖2所示,圖2更詳細地表示了當?shù)谝淮斡龅降谝粯酥緯r(在步驟S22中的是),A遇到第一標志,和B遞增等級計數(shù)器之間的程序,第一標志的代表是第一標志,即第一標志未經(jīng)壓縮地輸出(步驟S25)。當?shù)诙位蚋啻斡龅降谝粯酥緯r(在步驟S22中的否),第一標志的代表是對第一次遇到第一標志時輸出的第一標志的代表的參考。該參考在步驟S23中輸出。考慮到圖8和圖9,第二次遇到的<CD>的參考是對嵌入到壓縮文檔中的字典的參考,即對未壓縮的輸出<CD>的參考。分別在步驟S27和S24之后,等級計數(shù)器遞增。為了更快地確定一個第一標記是否是第一次出現(xiàn),結構化文檔的等級內(nèi)第一標志的等級和第一標記的順序可以用于確定第一標志是否是第一次遇到。
而且,如關于圖8和圖9所示,第一次遇到第一標志的代表形成一個字典,其中對結構化文檔的每個等級單獨形成字典。
第二次或更多次遇到第一標志的一個代表是一個第一代碼數(shù)據(jù),比如“START_TAG”。
第一代碼數(shù)據(jù)可以包括一個索引,該索引的值表示在結構化文檔的一個等級內(nèi)第一標志的順序。
在搜索步驟中,也可以對結構化文檔中的元素執(zhí)行搜索。當在搜索步驟中第一次遇到一個元素的內(nèi)容時,該元素的內(nèi)容像它原來一樣地輸出,并且當在搜索步驟中第二次或更多次遇到該元素的內(nèi)容時,輸出對第一次遇到該元素的內(nèi)容時輸出的元素內(nèi)容的參考,從而為每個等級的結構化文檔單獨形成字典。
元素可以包括至少一種類型的字符數(shù)據(jù)、注釋和處理指令??梢詥为殲槊糠N類型的元素提供第一和第二代碼數(shù)據(jù)。
而且,在搜索步驟中,可以執(zhí)行對諸如結構化文檔中的一種空元素標志的特定標志的搜索,其中當遇到一個特定標志時,輸出一個特定代碼數(shù)據(jù)。
圖3示出了表示按照本發(fā)明的實施例的上述解壓縮過程的流程圖。當解壓縮一個壓縮的諸如XML文檔的結構化文檔時,針對第一標志和第二代碼數(shù)據(jù)的代表,例如從壓縮的結構化文檔的開始到結尾,搜索壓縮的結構化文檔一次(步驟S300),其中壓縮的結構化文檔包括第一標志的代表,該代表包括未壓縮的第一標志和第一代碼數(shù)據(jù)、和表示第二標志的第二代碼數(shù)據(jù),其中第一標志表示結構化文檔的一個元素的開始,并且第二標志表示結構化文檔的一個元素的結束。
當在搜索步驟中遇到未壓縮的第一標志時(步驟S301和S320中的“第一標志”),輸出未壓縮的第一標志(步驟S303),將未壓縮的第一標志添加到字典(步驟S304),并且遞增等級計數(shù)器(步驟S305),等級計數(shù)器的值表示一個元素位于壓縮的結構化文檔中的哪個等級,從而單獨對壓縮的結構化文檔的每個等級形成字典。
當在搜索步驟中遇到第一代碼數(shù)據(jù)時(步驟S320中的“第一代碼數(shù)據(jù)”),從對應等級的字典輸出對應的未壓縮的第一標志(步驟S306)并且遞增等級計數(shù)器(步驟S307)。
當在搜索步驟中遇到第二代碼數(shù)據(jù)時(步驟S301中的“第二代碼數(shù)據(jù)”),重建第二標志(步驟S308),輸出第二標志(步驟S309)并且遞減等級計數(shù)器(步驟S310)。
可以使用包括在第一代碼數(shù)據(jù)中的一個索引值來在字典中搜索對應的未壓縮的第一標志,該索引值表示結構化文檔的一個等級內(nèi)第一標志的順序。
而且,搜索步驟可以包括搜索在壓縮的結構化文檔中的元素和對元素的參考。在這種情況下,當在搜索步驟中遇到一個元素的未壓縮內(nèi)容時,該元素的內(nèi)容像它原來一樣地輸出并且將該元素的內(nèi)容添加到字典中,并且當在搜索步驟中遇到一個元素的參考時,從字典輸出該元素的相應內(nèi)容。
圖4示出了表示按照本發(fā)明實施例的用于壓縮一個結構化文檔的裝置的示意框圖。該裝置包括一個搜索塊41、一個輸出塊42和一個計數(shù)塊43。搜索塊41對一個結構化的未壓縮文檔進行一次針對第一和第二標志的搜索。
當搜索塊41遇到一個第一標志時,輸出塊42輸出第一標志的一個代表,并且計數(shù)塊43遞增等級計數(shù)器,等級計數(shù)器的值表示一個元素位于結構化文檔中的哪個等級。
當搜索塊41遇到一個第二標志時,輸出塊42輸出第二代碼數(shù)據(jù),并且計數(shù)塊43遞減等級計數(shù)器。從輸出塊輸出的數(shù)據(jù)或信號形成一個壓縮文檔。
當搜索塊41第一次遇到一個第一標志時,輸出塊42可以輸出該第一標志。當搜索塊41第二次或更多次遇到一個第一標志時,輸出塊42可以輸出一個當?shù)谝淮斡龅降谝粯酥緯r輸出的第一標志代表的參考。為此,可以形成如圖4所示的本地字典,從而輸出塊42能夠將當前第一標記與當前等級的字典相比較。當然,字典只用于在本地壓縮。它不是壓縮文檔的一部分??蛇x地,輸出塊42可以讀取用于比較操作的壓縮文檔。
輸出塊42可以輸出作為第二次或更多次遇到的第一標志的代表的第一代碼數(shù)據(jù)并且將一個索引添加到第一代碼數(shù)據(jù),索引的值表示結構化文檔的等級內(nèi)第一標志的順序。
搜索塊41可以搜索結構化文檔中的元素,其中當?shù)谝淮斡龅揭粋€元素的內(nèi)容時,輸出塊42可以像它原來一樣地輸出該元素的內(nèi)容,并且當?shù)诙位蚋啻斡龅皆撛氐膬?nèi)容時,輸出塊可以輸出當?shù)谝淮斡龅皆撛氐膬?nèi)容時輸出的元素內(nèi)容的參考,從而形成單獨用于結構化文檔的每個等級的字典。
搜索塊41可以搜索結構化文檔中的特定標志,其中當遇到一個特定標志時,輸出塊42可以輸出一個特定代碼數(shù)據(jù)。
按照壓縮裝置40,搜索塊41讀取未壓縮的文檔并且收集來自未壓縮文檔的特定數(shù)據(jù)。輸出塊42輸出數(shù)據(jù)以形成壓縮文檔,但是也可以讀取壓縮文檔并且從中收集數(shù)據(jù)。輸出塊42從搜索塊41接收例如strat-tag和end-tag的收集到的數(shù)據(jù)和來自計數(shù)塊43的等級信息,并基于該等級信息使用已經(jīng)輸出到壓縮文檔的數(shù)據(jù)處理接收到的數(shù)據(jù)。
圖5示出了表示按照本發(fā)明實施例的用于解壓縮一個壓縮結構化文檔的裝置的示意框圖。壓縮結構化文檔包括第一標志的代表,該代表包括未壓縮的第一標志和第一代碼數(shù)據(jù)、以及表示第二標志的第二代碼數(shù)據(jù),其中第一標志表示結構化文檔的一個元素的開始,并且第二標志表示結構化文檔的元素的結束。該裝置包括一個搜索塊51、一個計數(shù)塊52、一個求和塊53、一個重建塊54和一個輸出塊55。
搜索塊51對壓縮的結構化文檔進行一次針對第一標志和第二代碼數(shù)據(jù)的代表的搜索。
當搜索塊51遇到未壓縮的第一標志時,求和塊53將未壓縮的第一標志添加到字典中,從而為壓縮的結構化文檔的每個等級單獨形成字典。此外,輸出塊55輸出未壓縮的第一標志,并且計數(shù)塊52遞增等級計數(shù)器,等級計數(shù)器的值表示一個元素位于壓縮的結構化文檔中的哪個等級。
當搜索塊51遇到第一代碼數(shù)據(jù)時,輸出塊55從對應等級的字典輸出一個對應的未壓縮的第一標志,并且計數(shù)塊52遞增等級計數(shù)器。
當搜索塊51遇到第二代碼數(shù)據(jù)時,重建塊54重建一個第二標志,輸出塊55輸出由重建裝置重建的第二標志,并且計數(shù)塊52遞減等級計數(shù)器。
輸出塊55可以使用包括在第一代碼數(shù)據(jù)中的索引值在字典中搜索對應的未壓縮的第一標志,該索引值表示結構化文檔的一個等級內(nèi)第一標志的順序。
搜索塊51可以搜索壓縮的結構化文檔中的元素和元素的參考,其中當搜索塊51遇到一個元素的未壓縮內(nèi)容時,輸出塊55可以像原來一樣地輸出該元素的內(nèi)容,并且求和塊53可以將元素的內(nèi)容添加到字典,并且當搜索塊51遇到一個元素的參考時,輸出塊可以從字典輸出該元素的對應內(nèi)容。
按照圖5中的解壓縮裝置50,搜索塊讀取壓縮文檔并且從中收集特定數(shù)據(jù)。輸出塊55輸出數(shù)據(jù)以形成解壓縮的文檔。由求和塊53生成一個字典。輸出塊55基于從計數(shù)塊接收的等級信息使用字典處理從搜索塊51接收的數(shù)據(jù),并且輸出處理后的數(shù)據(jù)以形成解壓縮的文檔。重建塊54使用等級信息和用于重建數(shù)據(jù)的字典,該重建數(shù)據(jù)接著由輸出塊55輸出以形成解壓縮的文檔。
將注意到圖A4和圖A5表示用于解釋本發(fā)明的壓縮方案的壓縮器和解壓縮器的部分。壓縮裝置40和解壓縮裝置50當然可以包括其他部分。而且,圖A4和圖A5中的塊可以一起分組或者可以進一步劃分為子塊。
本發(fā)明也可以通過計算機程序和執(zhí)行處理器可實現(xiàn)指令的信號來實現(xiàn)。
如上所述,本發(fā)明的關鍵思想是采用XML文檔中元素的樹結構,使得一個壓縮器能夠即時地構建用于標志或元素標簽(即名稱和屬性)的分等級的字典集。特別是,壓縮器跟蹤當前將被壓縮的元素的等級,并只使用在對應等級的字典壓縮元素標簽。因為在相同等級處的元素名稱/屬性將可能重復,與通用算法相比壓縮器花更少的時間來進行字符串匹配。此外,因為元素標簽通常是XML文檔最冗長的部分(見圖6的示例),本發(fā)明只需要很少量的存儲器(用于字典的存儲)和很少的CPU時間來實現(xiàn)良好的壓縮比。
隨后,將按照本發(fā)明的實現(xiàn)示例描述諸如壓縮裝置40的壓縮器和諸如解壓縮裝置50的解壓縮器的操作。
壓縮程序壓縮器保持計數(shù)器來跟蹤一個元素的當前等級,它指current_level或cur_level(當前等級)。在壓縮程序的開始,cur_level初始化為0(零)。最初對于元素標簽也沒有字典。
對于一個給定的XML文檔,壓縮器線性地對于一個新元素的開始(即start-tag)和結束(即end-tag)解析XML文檔。如果遇到start-tag,壓縮器相對于cur_level的標簽字典對其進行壓縮,該標簽字典是指tag_dict[cur_level]。這基本上包含搜索當前標簽和tag_dict[cur_level]之間的匹配的字符串。參照tag_dict[cur_level]中的字符串編碼一個匹配的字符串。一個不匹配的字符串由壓縮器未經(jīng)壓縮地輸出并且添加到tag_dict[cur_level]。一個壓縮的start-tag將以特定代碼字START_TAG開始,接著是編碼的匹配和/或不匹配的字符串的序列。注意到cur_level的值不需要清楚地載入到壓縮的start-tag中,因為解壓縮器能夠在本地導出它(見解壓縮程序)。壓縮完成后,壓縮器將cur_level遞增1。
應當注意,如果這是壓縮器第一次訪問該等級,則tag_dict[cur_level]還不存在。壓縮器將創(chuàng)建一個tag_dict[cur_level]并且用當前的start-tag對其進行更新。
如果遇到一個end-tag,則壓縮器簡單地輸出一個特定代碼字END_TAG以通知當前元素的結束。壓縮器不需要輸出end-tag中的名稱,因為它與start-tag中的名稱相同并且解壓縮器已經(jīng)將start-tag解壓縮。將end-tag壓縮后,壓縮器將cur_level遞減1。將注意到壓縮器不用end-tag更新tag_dict[cur_level]。盡管實際上很少發(fā)生,還是允許end-tag可以在結尾包含可選擇的“空白空格”,它由一個或多個空格字符(0x20)、制表符(0x09)、換行(0x0A)或回車(0x0D)。如果是這樣的情況,則壓縮器能夠用另一個代碼字編碼end-tag,該代碼字例如為END_TAG_EXT,接著是可選擇的“空白空格”和未壓縮的“空白空格”本身的長度。
如果遇到一個空元素標簽,則壓縮器將其看作strat-tag的一種特殊情況。其操作與上述的常規(guī)strat-tag相同,但有如下的例外a)壓縮器不改變cur_level(概念上,壓縮器輸入一個空元素并且立刻退出);b)壓縮器輸出一個特殊代碼字EMPTY_ELEM_TAG,它與START_TAG不同。這允許解壓縮器消除它們之間的歧義。
也可能有這樣的情況,那就是標簽沒有對應的end-tag。除了在這些標簽后面可以是內(nèi)容之外,這些標簽能夠與上述的empty-tag(空標簽)類似地進行處理。
在圖6所示的實例中,“TITLE”、“ARTIST”等全部在同一個等級。它們是元素“CD”的“子代”。它們將按照它們出現(xiàn)在輸入XML文檔中的順序被添加到tag_dict[cur_level]。壓縮器可以保持在每個等級遇到的元素的計數(shù)器,這可以表示為elem_count[cur_level]。壓縮器在每次它從較高等級進入cur_level時將elem_count[cur_level]設置為零并且接著在處理了cur_level處的每個元素之后將其遞增1。這允許壓縮器執(zhí)行兩次最優(yōu)化。首先,對于字符串匹配,壓縮器能夠試圖首先比較當前標簽和具有索引elem_count[cur_level]的tag_dict[cur_level]中的標簽。這很可能造成“找到”(即良好匹配)并避免不必要的與tag_dict[cur_level]中的其他標簽進行比較。如能夠從圖6的目錄示例看出的,原因是相同等級的元素傾向于以一個XML文檔中的相同順序重復。在它失敗的情況下(即沒有匹配的),壓縮器能夠接著繼續(xù)處理tag_dict[cur_level]處的其他標簽。其次,壓縮器可以利用該索引方案以具有更有效的編碼。也就是,如果找到匹配,壓縮器甚至不需要輸出對tag_dict[cur_level]的參考。作為替代,它能夠簡單地輸出一個代碼字START_TAG_H(與規(guī)則的STRAT_TAG不同的代碼字)以向解壓縮器通知這種情況。因為解壓縮器也跟蹤elem_count[cur_level],所以它能夠確定tag_dict[cur_level]中的哪個start-tag用作對壓縮當前start-tag的參考。這允許在相同等級處多個元素的優(yōu)化處理。
上述過程關注于壓縮元素標簽。它們消除了由XML引入的標記的大部分冗余(與普通文字文件相比較)。以下是一些能夠與上述程序一起執(zhí)行的一些可選擇過程。它們提升了整體壓縮比,但是花費了另外的存儲器和CPU消耗。它是一種它們是否應當執(zhí)行的關于執(zhí)行的決定。
例如,在元素內(nèi)容中的字符數(shù)據(jù)(即文字)也可以被壓縮。為此,壓縮器也能夠對于元素內(nèi)容中的字符數(shù)據(jù)創(chuàng)建字典,為每個等級創(chuàng)建一個字典。需要一個代碼字。
而且,可以壓縮元素標簽之外的標記,例如注釋和處理指令。壓縮器能夠為它們?nèi)縿?chuàng)建一個字典,或者為每種類型的標記創(chuàng)建一個字典,例如為注釋創(chuàng)建一個字典,并且為處理指令創(chuàng)建另一個字典。后者可以減少字符串搜索時間并從而加快壓縮。每種類型的壓縮的標記需要一個代碼字。
此外,可以壓縮空格序列。壓縮器能夠使用簡單運行長度編碼來壓縮一個空格序列,這通??赡艹霈F(xiàn)在一些XML文檔中。需要一個代碼字。
將注意到所有上述過程在輸入XML文檔的單個掃描中執(zhí)行。這是與很多現(xiàn)有的XML壓縮方案的關鍵區(qū)別。
而且,按照本發(fā)明的壓縮方案是自適應的。在上述過程之后,壓縮器能夠即時地學習并采用文檔結構,而不需要關于XML文檔的比如DTD或XML方案的任何先前知識。這是在依賴壓縮算法的方案之上的另一個優(yōu)點。
編碼格式壓縮器的輸出將是一個比特流,在其中壓縮和未壓縮的單元進行混合。一個壓縮單元可以是一個壓縮的元素標簽、元素內(nèi)容中的壓縮字符數(shù)據(jù)、壓縮注釋等。接下來描述對于編碼格式的基本原則。確切的格式可以根據(jù)實現(xiàn)方式而變化。
未壓縮的字符從輸入直接復制到輸出。每個壓縮單元的前面有在不出現(xiàn)在未壓縮XML文檔的字符集中的特殊代碼字。解壓縮器需要識別一個壓縮單元并相應地對其進行解碼。按照XML 1.0規(guī)范,在
范圍內(nèi)的字符,除了0x09、0x0A和0x0D之外,將不出現(xiàn)在未壓縮文檔中。因此,如在壓縮過程中提到的,它們(總共29個代碼點)可以被用作特殊代碼字(例如START_TAG)。代碼字的確切的分配是實現(xiàn)方式問題,只要壓縮器和解壓縮器同樣進行分配即可。注意到,在UTF-8編碼(最普通的字符編碼)下,代碼字將作為它們的數(shù)字值表示為準確的比特圖案。這簡化了實現(xiàn)方式。
至于一個壓縮單元的結尾,如果壓縮單元的長度在那個特別單元的編碼中自我解釋,則其能夠用另一個特殊代碼字明確地表示或者隱含地導出。例如,一個END_TAG代碼字不只表示原始XML文檔中一個end-tag的存在,還標志了當前元素內(nèi)容的結束,它的字符數(shù)據(jù)(如果存在的話)可以被壓縮或解壓縮。
如果實現(xiàn)可選擇的過程,需要另外的代碼字來表示元素標簽之外的標記的開始和結束。它們可以從前述代碼點空間(code pointspace)被賦值。
關于用于壓縮strat-tag的粒度,基本上有兩種情況。情況1它能夠在通用數(shù)據(jù)壓縮算法之后,在字節(jié)等級進行。情況2它能夠用XML結構在較高等級進行。即,字符串匹配搜索在標簽名稱、屬性名稱和屬性值的單元中進行。情況2的極端情況是作為一個整體壓縮一個strat-tag,即當它與tag_dict[cur_level]中的一個標簽精確匹配時。情況2允許更快的壓縮,因為它通常需要較少時間進行字符串匹配。它也允許對壓縮的start-tag的更有效編碼。但是,它與情況1相比較可能丟失一些壓縮比。這是在實現(xiàn)方式中的折衷。
緊跟著一個end-tag的換行符在XML文檔中典型地出于可讀性的目的。在這種情況下,能夠使用一個代碼字END_TAG_NEWLINE來進行編碼。這節(jié)省了否則將由換行符所需的字節(jié)。
取決于標簽字典的確切的結構,一個壓縮的start-tag可能需要tag_dict[cur_level]中一個參考標簽的索引的指示。一種選擇是在一個START_TAG代碼字后面明確地編碼該索引。一種替換選擇是使用幾個用于strat-tag的代碼字,使得它們中的每一個表示該索引的一個特定值。例如,START_TAG_0、START_TAG_1等。如果編碼必須是字節(jié)對準的并且有可獲得的代碼字來使用,則這將是特別有用的。更通常的情況能夠將其與明確的索引字段合并。即,1-字節(jié)代碼字用于小索引值,并且一個單獨的索引字段用于大索引值。
解壓縮程序一個壓縮的XML文檔作為比特流輸入到一個解壓縮器。該解壓縮器按照以下過程處理壓縮的XML文檔。
與壓縮器類似,解壓縮器也保持cur_level、用于每個等級的tag_dict集、用于當前等級的elem_count和諸如內(nèi)容字典的任意其他可選擇的字典等。它們以與壓縮器相同的方式被初始化。這組成解壓縮器上下文。
解壓縮器能夠用上述代碼字將壓縮單元與未壓縮單元相區(qū)別。如果遇到一個未壓縮單元,單元中的字節(jié)直接復制到輸出。如果遇到一個壓縮單元(例如一個壓縮標簽),解壓縮器使用對應的字典(例如tag_dict[cur_level])來解壓縮該單元。此外,解壓縮器以與壓縮器相同的方式更新對應的字典(例如tag_dict[cur_level])和變量(例如cur_level,elem_count[cur_level])。這確保了在解壓縮期間,解壓縮器上下文保持與壓縮器上下文前后一致。此外,這允許更有效的編碼,因為不需要一些上下文變量(例如cur_level、elem_count[cur_level])以明確地在壓縮的XML文檔中發(fā)送。
實現(xiàn)方式備忘錄在實現(xiàn)方式中可能有很多不偏離于本發(fā)明范圍的變形。對于變形的一個原因是發(fā)現(xiàn)壓縮比、CPU花銷和存儲器消耗之間的良好折衷??偟膩碚f,一個實現(xiàn)方式應當以關注于壓縮元素標簽的壓縮過程開始,并使用用于字符串匹配的粗糙的粒度。這將導致最有效地使用CPU和存儲器,因為它關注于屬于XML文檔最冗余部分的元素標簽上的資源。在實踐中,通常以這種方式用很小的存儲器占用空間和CPU消耗來實現(xiàn)良好的壓縮比。為了超出這種方式,一種實現(xiàn)方式可以采用選擇性過程的使用,這可能以花費額外的CPU和存儲器需求來提高壓縮比。
在XML規(guī)范發(fā)展為前面提到的代碼字成為XML字符集的一個常規(guī)部分的情況下,該方案能夠通過使用保持在XML字符集之外的任意1-字節(jié)字符來適應。如果沒有這樣的字符,代碼字能夠映射到幾乎不可能出現(xiàn)在XML文檔中的1-字節(jié)字符。對于那些代碼字也需要一個轉義方案。其細節(jié)超出了本發(fā)明的范圍之外。
應用一個元素標簽的壓縮的實現(xiàn)方式已經(jīng)使用一個XML文檔的小示例來加以測試。該文檔具有于圖6的示例中的那個結構類似的結構。為了比較,同一組文檔也用DEFLATE進行壓縮,DEFLATE為用于通用數(shù)據(jù)壓縮的很好的壓縮算法。以下是結果。它示出了新方案實現(xiàn)了與DEFLATE相比相當好的壓縮比,但只需要一小部分CPU和存儲器花銷。注意,壓縮性能取決于樣本文件。以下結果應當只看作一個示例,而不作為性能的全面分析。然而,測試結果驗證了按照本發(fā)明的方案的設計原理。
應當理解,以上描述為本發(fā)明的解釋說明并不構成本發(fā)明的限制。在不脫離由所附權利要求書限定的本發(fā)明的宗旨和范圍的情況下,本領域技術人員可以進行各種修改和應用。
權利要求
1.一種壓縮結構化文檔的方法,該方法包括一個對該結構化文檔搜索一次以尋找第一和第二標志的搜索步驟,每個第一標志表示該結構化文檔的對應元素的開始,并且每個第二標志表示該結構化文檔的該對應元素的結束;當在該搜索步驟中遇到該第一標志的一個時,輸出該第一標志的一個的代表并遞增等級計數(shù)器的值,其中該等級計數(shù)器的值表示該元素位于該結構化文檔中的哪個等級;以及當在該搜索步驟中遇到該第二標志的一個時,輸出一個代碼數(shù)據(jù)并遞減該等級計數(shù)器的值。
2.根據(jù)權利要求1所述的方法,其中當?shù)谝淮斡龅皆摰谝粯酥镜囊粋€時,該第一標志的一個的代表像它一樣是該第一標志的一個。
3.根據(jù)權利要求1所述的方法,其中當?shù)诙位蚋啻斡龅皆摰谝粯酥镜囊粋€時,該第一標志的一個的代表是對作為當?shù)谝淮斡龅皆摰谝粯酥镜囊粋€時輸出的、該第一標志的一個的代表的參考。
4.根據(jù)權利要求1的方法,其中第一次遇到的該第一標志的一個的代表形成一個字典,其中該字典為該結構化文檔的每個等級單獨地形成。
5.根據(jù)權利要求4所述的方法,還包括基于該第一標志的一個的等級和在該等級內(nèi)該第一標志的一個的順序,使用字典確定該第一標志的一個是否是第一次遇到。
6.根據(jù)權利要求1所述的方法,其中該第二次或更多次遇到的該第一標志的一個的代表是第一代碼數(shù)據(jù),并且當在該搜索步驟中遇到該第二代碼的一個時,代碼數(shù)據(jù)輸出是一個第二代碼數(shù)據(jù)。
7.根據(jù)權利要求6所述的方法,其中該第一代碼數(shù)據(jù)包括一個索引,并且該索引的值表示該結構化文檔的等級內(nèi)該第一標志的一個的順序。
8.根據(jù)權利要求1所述的方法,其中該搜索步驟還包括搜索該結構化文檔中的元素;當?shù)谝淮斡龅皆撛氐囊粋€的內(nèi)容時,像它原來一樣地輸出該元素的一個的內(nèi)容;以及當?shù)诙位蚋啻斡龅皆撛氐囊粋€的內(nèi)容時,輸出對該元素的一個的內(nèi)容的參考,該參考在第一次遇到該元素的一個的該內(nèi)容時輸出,以為該結構化文檔的每個等級單獨地形成一個字典。
9.根據(jù)權利要求1所述的方法,其中該元素包括字符數(shù)據(jù)、注釋或處理指令的類型。
10.根據(jù)權利要求9所述的方法,其中分別為每種類型的元素提供第一和第二代碼數(shù)據(jù)。
11.根據(jù)權利要求1所述的方法,其中該搜索步驟還包括在該結構化文檔中搜索特定標志;以及當在該搜索步驟中遇到該特定標志的一個時,輸出一個特定代碼數(shù)據(jù)。
12.一種解壓縮包括第一標志的代表的、壓縮的結構化文檔的方法,其中該代表包括該第一標志和第一代碼數(shù)據(jù)、以及表示第二標志的第二代碼數(shù)據(jù),并且每個第一標志表示該壓縮的結構化文檔的對應元素的開始,并且每個第二標志表示該壓縮的結構化文檔的該對應元素的結束,該方法包括一個對該結構化文檔搜索一次以尋找該第一標志和該第二代碼數(shù)據(jù)的代表的搜索步驟;當在該搜索步驟中遇到每個該第一標志時,輸出每個該第一標志,將每個該第一標志添加到字典中,并遞增等級計數(shù)器的值,其中該等級計數(shù)器的值表示該對應元素位于該壓縮的結構化文檔中的哪個等級,從而為該壓縮的結構化文檔的每個等級單獨地形成該字典;當在該搜索步驟中遇到該第一代碼數(shù)據(jù)時,從對應等級的該字典輸出一個對應的第一標志并遞增該等級計數(shù)器的值;以及當在該搜索步驟中遇到該第二代碼數(shù)據(jù)時,重建一個對應的第二標志,輸出該對應的第二標志并遞減該等級計數(shù)器的值。
13.根據(jù)權利要求12所述的方法,其中使用包含在該第一代碼數(shù)據(jù)的一個索引的值,在該字典中搜索該對應的第一標志,該索引的值表示在該結構化文檔的每個等級內(nèi)的該第一標志的順序。
14.根據(jù)權利要求12所述的方法,其中該搜索步驟還包括在壓縮的該結構化文檔中搜索元素和對該元素的參考;當遇到該元素的一個的對應內(nèi)容時,像它原來一樣地輸出該元素的一個的該對應內(nèi)容并將該元素的一個的對應內(nèi)容添加到該字典;以及當遇到對該元素的一個的參考時,從該字典中輸出該元素的一個的該對應內(nèi)容。
15.一種用于壓縮結構化文檔的裝置,該裝置包括搜索裝置,用于對該結構化文檔搜索一次以尋找第一和第二標志,每個第一標志表示該結構化文檔的對應元素的開始,并且每個第二標志表示該結構化文檔的該對應元素的結束;輸出裝置,用于當該搜索裝置遇到該第一標志的一個時,輸出該第一標志的一個的代表,并用于當該搜索裝置遇到該第二標志的一個時,輸出代碼數(shù)據(jù);以及計數(shù)裝置,用于當該搜索裝置遇到該第一標志的一個時,遞增等級計數(shù)器的值,其中該等級計數(shù)器的值表示該元素位于該結構化文檔中的哪個等級和用于當該搜索裝置遇到該第二標志的一個時,遞減該等級計數(shù)器的值。
16.根據(jù)權利要求15所述的裝置,其中當該搜索裝置第一次遇到該第一標志的一個時,該輸出裝置配置為像它原來一樣地輸出該第一標志的一個。
17.根據(jù)權利要求16所述的裝置,其中第一次遇到的該第一標志的一個的代表形成一個字典,其中為該結構化文檔的每個等級單獨地形成該字典,以及當該搜索裝置遇到該第一標志的一個時,使用該字典,該輸出裝置配置為基于該第一標志的一個的等級和該等級內(nèi)該第一標志的一個的順序確定是否是第一次遇到該第一標志的一個。
18.根據(jù)權利要求15所述的裝置,其中當該搜索裝置第二次和更多次遇到該第一標志的一個時,該輸出裝置配置為輸出對作為當?shù)谝淮斡龅皆摰谝粯酥镜囊粋€時輸出的、該第一標志的一個的代表的參考。
19.根據(jù)權利要求15所述的裝置,其中該輸出裝置配置為輸出作為第二次或更多次遇到的該第一標志的一個的代表的第一代碼數(shù)據(jù)并將一個索引添加到該第一代碼數(shù)據(jù),并且該索引的值表示該結構化文檔的等級內(nèi)該第一標志的一個的順序,以及當遇到該第二標志的一個時,由該輸出裝置輸出的該代碼數(shù)據(jù)是第二代碼數(shù)據(jù)。
20.根據(jù)權利要求15所述的裝置,其中該搜索裝置配置為在該結構化文檔中搜索該元素,并且當該搜索裝置第一次遇到該元素的一個的內(nèi)容時,該輸出裝置配置為像它原來一樣輸出該元素的一個的內(nèi)容,以及當該搜索裝置第二次或更多次遇到該元素的一個的內(nèi)容時,該輸出裝置配置為輸出對該元素的一個的內(nèi)容的參考,該參考在第一次遇到該元素的內(nèi)容時輸出,以為該結構化文檔的每個等級單獨地形成一個字典。
21.根據(jù)權利要求15所述的裝置,該搜索裝置配置為在該結構化文檔中搜索特定標志,其中當該搜索裝置遇到該特定標志的一個時,該輸出裝置配置為輸出一個特定代碼數(shù)據(jù)。
22.一種用于解壓縮包括第一標志的代表的、壓縮的結構化文檔的裝置,其中該代表包括該第一標志和第一代碼數(shù)據(jù)、以及表示第二標志的第二代碼數(shù)據(jù),并且每個第一標志表示該壓縮的結構化文檔的對應元素的開始,并且每個第二標志表示該壓縮的結構化文檔的該對應元素的結束,該裝置包括搜索裝置,用于對該結構化文檔搜索一次以尋找該第一標志和該第二代碼數(shù)據(jù)的代表;計數(shù)裝置,用于當該搜索裝置遇到每個該第一標志時,遞增等級計數(shù)器的值,當該搜索裝置遇到該第一代碼數(shù)據(jù)時,遞增該等級計數(shù)器的值,并且當該搜索裝置遇到該第二代碼數(shù)據(jù)時,遞減該等級計數(shù)器的值,其中該等級計數(shù)器的值表示該對應元素位于該壓縮的結構化文檔中的哪個等級;求和裝置,用于當該搜索裝置遇到每個該第一標志時,將每個該第一標志添加到字典中,從而為該壓縮的結構化文檔的每個等級單獨地形成字典;重建裝置,用于當該搜索裝置遇到該第二代碼數(shù)據(jù)時,重建一個對應的第二標志;以及輸出裝置,用于當該搜索裝置遇到每個該第一標志時,輸出每個該第一標志,當該搜索裝置遇到該第一代碼數(shù)據(jù)時,從該對應等級的字典輸出一個對應的第一標志,并且當該搜索裝置遇到該第二代碼數(shù)據(jù)時,輸出由該重建裝置重建的該對應的第二標志。
23.根據(jù)權利要求22所述的裝置,其中該輸出裝置配置為用包含在該第一代碼數(shù)據(jù)的一個索引值,在該字典中搜索該對應的第一標志,該索引的值表示該結構化文檔的每個等級內(nèi)該第一標志的順序。
24.根據(jù)權利要求22所述的裝置,其中該搜索裝置配置為在該壓縮的結構化文檔中搜索元素和對該元素的參考,當該搜索裝置遇到該元素的一個的對應內(nèi)容時,該輸出裝置配置為像它原來一樣地輸出該元素的一個的該對應內(nèi)容,并且該求和裝置配置為將該元素的一個的該對應內(nèi)容添加到該字典中,以及當該搜索裝置遇到該元素的一個的參考時,該輸出裝置配置為從該字典輸出該元素的一個的該對應內(nèi)容。
25.一種包括處理器可執(zhí)行指令的計算機程序,用于執(zhí)行壓縮結構化文檔的方法,該方法包括一個對該結構化文檔搜索一次以尋找第一和第二標志的搜索步驟,每個第一標志表示該結構化文檔的對應元素的開始,并且每個第二標志表示該結構化文檔的該對應元素的結束;當在該搜索步驟中遇到該第一標志的一個時,輸出該第一標志的一個的代表并遞增等級計數(shù)器的值,其中該等級計數(shù)器的值表示該元素位于該結構化文檔中的哪個等級;以及當在該搜索步驟中遇到該第二標志的一個時,輸出一個代碼數(shù)據(jù)并遞減該等級計數(shù)器的值。
26.一種包括處理器可執(zhí)行指令的計算機程序,用于解壓縮包括第一標志的代表的、壓縮的結構化文檔的方法,其中該代表包括該第一標志和第一代碼數(shù)據(jù)、以及表示第二標志的第二代碼數(shù)據(jù),并且每個第一標志表示該壓縮的結構化文檔的對應元素的開始,并且每個第二標志表示該壓縮的結構化文檔的該對應元素的結束,該方法包括一個對該結構化文檔搜索一次以尋找該第一標志和該第二代碼數(shù)據(jù)的代表的搜索步驟;當在該搜索步驟中遇到每個該第一標志時,輸出每個該第一標志,將每個該第一標志添加到字典中,并遞增等級計數(shù)器的值,其中該等級計數(shù)器的值表示該對應元素位于該壓縮的結構化文檔中的哪個等級,從而為該壓縮的結構化文檔的每個等級單獨地形成該字典;當在該搜索步驟中遇到該第一代碼數(shù)據(jù)時,從對應等級的該字典輸出一個對應的第一標志并遞增該等級計數(shù)器的值;以及當在該搜索步驟中遇到該第二代碼數(shù)據(jù)時,重建一個對應的第二標志,輸出該對應的第二標志并遞減該等級計數(shù)器的值。
27.一種存儲包括處理器可執(zhí)行指令的計算機程序的計算機軟件介質,該計算機程序用于執(zhí)行壓縮結構化文檔的方法,該方法包括一個對該結構化文檔搜索一次以尋找第一和第二標志的搜索步驟,每個第一標志表示該結構化文檔的對應元素的開始,并且每個第二標志表示該結構化文檔的該對應元素的結束;當在該搜索步驟中遇到該第一標志的一個時,輸出該第一標志的一個的代表并遞增等級計數(shù)器的值,其中該等級計數(shù)器的值表示該元素位于該結構化文檔中的哪個等級;以及當在該搜索步驟中遇到該第二標志的一個時,輸出一個第二代碼數(shù)據(jù)并遞減該等級計數(shù)器的值。
28.一種存儲包括處理器可執(zhí)行指令的計算機程序的計算機軟件介質,該計算機程序用于執(zhí)行解壓縮包括第一標志的代表的、壓縮的結構化文檔的方法,其中該代表包括該第一標志和第一代碼數(shù)據(jù)、以及表示第二標志的第二代碼數(shù)據(jù),并且每個第一標志表示該壓縮的結構化文檔的對應元素的開始,并且每個第二標志表示該壓縮的結構化文檔的該對應元素的結束,該方法包括一個對該結構化文檔搜索一次以尋找該第一標志和該第二代碼數(shù)據(jù)的代表的搜索步驟;當在該搜索步驟中遇到每個該第一標志時,輸出每個該第一標志,將每個該第一標志添加到字典中,并遞增等級計數(shù)器的值,其中該等級計數(shù)器的值表示該對應元素位于該壓縮的結構化文檔中的哪個等級,從而為該壓縮的結構化文檔的每個等級單獨地形成該字典;當在該搜索步驟中遇到該第一代碼數(shù)據(jù)時,從對應等級的該字典輸出一個對應的第一標志并遞增該等級計數(shù)器的值;當在該搜索步驟中遇到該第二代碼數(shù)據(jù)時,重建一個對應的第二標志,輸出該對應的第二標志并遞減該等級計數(shù)器的值。
29.一種載有處理器可執(zhí)行指令的信號,用于控制計算機執(zhí)行壓縮結構化文檔的方法,該方法包括一個對該結構化文檔搜索一次以尋找第一和第二標志的搜索步驟,每個第一標志表示該結構化文檔的對應元素的開始,并且每個第二標志表示該結構化文檔的該對應元素的結束;當在該搜索步驟中遇到該第一標志的一個時,輸出該第一標志的一個的代表并遞增等級計數(shù)器的值,其中該等級計數(shù)器的值表示該元素位于該結構化文檔中的哪個等級;以及當在該搜索步驟中遇到該第二標志的一個時,輸出一個第二代碼數(shù)據(jù)并遞減該等級計數(shù)器的值。
30.一種載有處理器可執(zhí)行指令的信號,它用于控制計算機執(zhí)行解壓縮包括第一標志的代表的、壓縮的結構化文檔的方法,其中該代表包括該第一標志和第一代碼數(shù)據(jù)、以及表示第二標志的第二代碼數(shù)據(jù),并且每個第一標志表示該壓縮的結構化文檔的對應元素的開始,并且每個第二標志表示該壓縮的結構化文檔的該對應元素的結束,該方法包括一個對該結構化文檔搜索一次以尋找該第一標志和該第二代碼數(shù)據(jù)的代表的搜索步驟;當在該搜索步驟中遇到每個該第一標志時,輸出每個該第一標志,將每個該第一標志添加到字典中,并遞增等級計數(shù)器的值,其中該等級計數(shù)器的值表示該對應元素位于該壓縮的結構化文檔中的哪個等級,從而為該壓縮的結構化文檔的每個等級單獨地形成該字典;當在該搜索步驟中遇到該第一代碼數(shù)據(jù)時,從對應等級的該字典輸出一個對應的第一標志并遞增該等級計數(shù)器的值;當在該搜索步驟中遇到該第二代碼數(shù)據(jù)時,重建一個對應的第二標志,輸出對應的第二標志并遞減該等級計數(shù)器的值。
全文摘要
一種壓縮結構化文檔的裝置和方法。對結構化文檔搜索一次以尋找第一和第二標志,一個第一標志表示結構化文檔的一個元素的開始,并且一個第二標志表示結構化文檔的一個元素的結束。當在搜索步驟中遇到一個第一標志時,輸出第一標志的一個代表并遞增等級計數(shù)器,等級計數(shù)器的值表示元素位于結構化文檔中的哪個等級。當在搜索步驟中遇到一個第二標志時,輸出一個第二代碼數(shù)據(jù)并遞減等級計數(shù)器。
文檔編號H03M7/30GK101040444SQ200580035186
公開日2007年9月19日 申請日期2005年10月14日 優(yōu)先權日2004年10月18日
發(fā)明者劉志剛 申請人:諾基亞公司