專利名稱:xml數(shù)據(jù)壓縮和解壓方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種xml數(shù)據(jù)壓縮和解壓方法。
背景技術(shù):
擴(kuò)展標(biāo)記語(yǔ)言(Extensible Markup Lange)xml是World Wide WebConsortium(W3C)公布的一種語(yǔ)義標(biāo)記規(guī)則,自從1997年12月發(fā)布以來,xml已取得了巨大成功;它被廣泛地按照許多方式應(yīng)用,其中一些應(yīng)用正在開始進(jìn)行,而另一些應(yīng)用已經(jīng)有了相當(dāng)驚人的成果,可以預(yù)測(cè)xml的作用會(huì)越來越重要。
由于xml是非專有的并且易于閱讀和編寫,就使得它成為在不同的應(yīng)用之間交換數(shù)據(jù)的理想格式。xml數(shù)據(jù)格式文件可以分為兩個(gè)部分,載體和載荷。載體又可以分為兩個(gè)部分屬性特征和結(jié)構(gòu)特征。屬性特征在xml數(shù)據(jù)文件中起著描述、定義數(shù)據(jù)格式和數(shù)據(jù)屬性的功能,如數(shù)據(jù)類型,長(zhǎng)度和顯示或打印格式等,結(jié)構(gòu)特征在xml數(shù)據(jù)文件中描述數(shù)據(jù)的結(jié)構(gòu)形式和數(shù)據(jù)之間的關(guān)系。剩余部分則是有效數(shù)據(jù)載荷。
xml語(yǔ)言作為一種數(shù)據(jù)載體的格式規(guī)范存在一個(gè)明顯的缺點(diǎn)就是載體部分往往占據(jù)了整個(gè)數(shù)據(jù)文件的較大部分,而且,通常載體部分大于載荷(數(shù)據(jù))的部分。例如用xml對(duì)“鐵”的比重的描述可以如下Script 1<OBJECT name=”iron”>
<specific_gravitytype=”number”1ength=”4”unit=”g/cube cm”>7.86<specific_gravity/>
</OBJECT>(119個(gè)字符)可解析為物體“鐵”的比重為7.86,計(jì)量單位為“克/立方厘米”,有效數(shù)據(jù)長(zhǎng)度為4,數(shù)據(jù)類型為數(shù)字。
其中,有效數(shù)據(jù)為iron,7.86(8個(gè)字符,不包含分隔符)。其余部分(111個(gè)字符)都是按照格式規(guī)范要求和應(yīng)用需要對(duì)相應(yīng)數(shù)據(jù)的描述或定義,載體使得處理該數(shù)據(jù)的計(jì)算機(jī)程序或閱讀者可以理解數(shù)據(jù)的含義,從而實(shí)現(xiàn)和簡(jiǎn)化計(jì)算機(jī)自動(dòng)處理數(shù)據(jù)的功能,或?qū)崿F(xiàn)xml數(shù)據(jù)的可閱讀功能。因此,如果忽略數(shù)據(jù)載體的部分,數(shù)據(jù)本身的含義就會(huì)消失而使數(shù)據(jù)變得沒有意義,或者說不可解析。
然而,如果按照以上的格式,描述100種不同物質(zhì)的比重,數(shù)據(jù)載體部分將大量重復(fù)出現(xiàn)(為11100個(gè)字符)。占據(jù)了數(shù)據(jù)文件的大部分存儲(chǔ)空間和傳輸空間。xml數(shù)據(jù)壓縮算法的目標(biāo)就是希望壓縮數(shù)據(jù)載體的尺寸。
對(duì)上述數(shù)據(jù)格式,我們可以用xml的一個(gè)特殊xml文件,“大綱”(xml Schema)歸納其載體部分為不重復(fù)的內(nèi)容Script 2<Element name=”O(jiān)BJECT”>
<Attribute name=”name”type=”string”/>
<Element name=”specific_gravity”>
<Attribute name=”type”type=”string”/>
<Attribute name=”length”type=”number”length=”4”/>
<Attribute name=”unit”type=”string”/>
</Element>
</Element>
Script 2歸納了Script 1的結(jié)構(gòu)特征和屬性特征,而與具體的數(shù)據(jù)值沒有關(guān)系。
根據(jù)Script 2的歸納,Script l可以改寫為Script 3<OBJECT name=”iron”>
<specific_gravity>7.86<specific_gravity/>
</OBJECT>
在Script 3中去掉了specific_gravity的屬性內(nèi)容,即把載體中對(duì)數(shù)據(jù)屬性的描述歸納到了大綱文件中,使得文件的尺寸減小。利用現(xiàn)有的xml技術(shù),可以從大綱Script 2中檢索到specific_gravity的屬性,從而保持了信息的完整性。
但是,與載荷的尺寸(8個(gè)字符)相比,Script 3的尺寸仍然很大,這是因?yàn)殡m然在Script 2包含了Script 1的數(shù)據(jù)結(jié)構(gòu)規(guī)則,但是在xml數(shù)據(jù)文件中,仍然必須通過使用xml的語(yǔ)法去實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)的具體形式。也就是說用xml的語(yǔ)法規(guī)則和Schema技術(shù),無法有效地減小xml數(shù)據(jù)文件中載體的結(jié)構(gòu)的大小。
發(fā)明內(nèi)容
本發(fā)明的目的就是為了解決以上問題,提供一種xml數(shù)據(jù)壓縮和解壓方法,有效地減小xml數(shù)據(jù)文件中載體的結(jié)構(gòu)的大小。
為實(shí)現(xiàn)上述目的,本發(fā)明提出一種xml數(shù)據(jù)壓縮和解壓方法,包括壓縮過程和解壓縮過程,其特征是壓縮過程包括如下步驟1)計(jì)算機(jī)系統(tǒng)把xml格式的數(shù)據(jù)代碼中的“數(shù)據(jù)結(jié)構(gòu)特征”歸納成為xml格式的結(jié)構(gòu)代碼;2)計(jì)算機(jī)系統(tǒng)運(yùn)行數(shù)據(jù)壓縮程序,把xml數(shù)據(jù)轉(zhuǎn)換為平文格式的數(shù)據(jù)代碼;解壓縮過程中,計(jì)算機(jī)系統(tǒng)運(yùn)行解壓縮程序,解析數(shù)據(jù)代碼,并參照結(jié)構(gòu)代碼對(duì)數(shù)據(jù)特征的描述,恢復(fù)源數(shù)據(jù)的信息。
由于采用了以上的方案,把xml數(shù)據(jù)轉(zhuǎn)換為平文格式的數(shù)據(jù)代碼,這種數(shù)據(jù)格式的有效載荷比例增大了許多,數(shù)據(jù)得到壓縮。只要把壓縮后的平文格式數(shù)據(jù)中的各項(xiàng)數(shù)據(jù)與結(jié)構(gòu)代碼對(duì)數(shù)據(jù)特征的描述聯(lián)系起來,我們就可以把它們恢復(fù)成原來的xml數(shù)據(jù)格式。如果原始文件中包含了大量的數(shù)據(jù),顯而易見,把文件轉(zhuǎn)換成結(jié)構(gòu)代碼+平文格式數(shù)據(jù)的格式進(jìn)行存儲(chǔ)和傳輸,將能大大地壓縮數(shù)據(jù)的存儲(chǔ)空間和傳輸空間。
圖1是本發(fā)明實(shí)施例結(jié)構(gòu)代碼生成流程示意圖。
圖2是本發(fā)明實(shí)施例壓縮代碼生成流程示意圖。
圖3是本發(fā)明實(shí)施例數(shù)據(jù)壓縮流程示意圖。
圖4是本發(fā)明實(shí)施例數(shù)據(jù)解壓縮流程示意圖。
圖5本發(fā)明實(shí)施例擴(kuò)充功能流程示意圖。
具體實(shí)施例方式下面通過具體的實(shí)施例并結(jié)合附圖對(duì)本發(fā)明作進(jìn)一步詳細(xì)的描述。
仍以前文中對(duì)鐵的比重是的描述為例,如果把載荷(數(shù)據(jù))部分轉(zhuǎn)換成用約定分隔符分割數(shù)據(jù)的平文格式Script 4OBJECT,water+1OBJECT,iron+7.86OBJECT,lead+11.34...
OBJECT,copper+8.96這種數(shù)據(jù)格式的有效載荷比例增大了許多,數(shù)據(jù)得到壓縮。
如果把Script 4中的各項(xiàng)數(shù)據(jù)與大綱文件Script 2中的相應(yīng)節(jié)點(diǎn)用某種方法聯(lián)系起來,我們就可以獲得Script 4內(nèi)各項(xiàng)數(shù)據(jù)的有關(guān)特征,并把它們恢復(fù)成原來的xml數(shù)據(jù)格式。如果Script 1包含了大量的數(shù)據(jù),顯而易見,把它轉(zhuǎn)換成Script 2+Script 4的格式進(jìn)行存儲(chǔ)和傳輸,將能大大地壓縮數(shù)據(jù)的存儲(chǔ)空間和傳輸空間。
本發(fā)明就提供了這樣一種方法。本方法在數(shù)據(jù)壓縮時(shí),把xml格式的數(shù)據(jù)代碼中的“數(shù)據(jù)結(jié)構(gòu)特征”歸納成為xml格式的結(jié)構(gòu)代碼。利用結(jié)構(gòu)代碼,計(jì)算機(jī)系統(tǒng)可以運(yùn)行通用的壓縮代碼生成程序,動(dòng)態(tài)地生成壓縮程序。計(jì)算機(jī)系統(tǒng)運(yùn)行數(shù)據(jù)壓縮程序,把xml數(shù)據(jù)轉(zhuǎn)換為平文格式的數(shù)據(jù)代碼。數(shù)據(jù)解壓縮時(shí),計(jì)算機(jī)系統(tǒng)運(yùn)行解壓縮程序,解析數(shù)據(jù)代碼,并參照結(jié)構(gòu)代碼對(duì)數(shù)據(jù)特征的描述,恢復(fù)源數(shù)據(jù)的信息。通過應(yīng)用這種技術(shù)在保存數(shù)據(jù)完整信息的同時(shí)減小數(shù)據(jù)存儲(chǔ)和傳輸?shù)拇笮?。其中,壓縮程序的生成也可采用其他方式,如通過編程生成通用的壓縮程序,從而免除動(dòng)態(tài)生成壓縮代碼的步驟。但采用通用的壓縮代碼生成程序(xslt)來生成壓縮代碼使得壓縮過程僅在一個(gè)支持xslt的瀏覽器(如Internet Explorer 5.5、Netscape 6.1和Mozilla等)上即可一次完成xml數(shù)據(jù)的壓縮任務(wù)?!皦嚎s代碼生成程序”生成“壓縮代碼”的過程還可以針對(duì)特定的數(shù)據(jù)結(jié)構(gòu)進(jìn)行優(yōu)化,提高壓縮代碼的執(zhí)行效率,從而提高大批量同類型數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)壓縮的效率。另外,數(shù)據(jù)收發(fā)雙方約定使用壓縮代碼生成程序時(shí),壓縮代碼是不需要傳輸和永久存儲(chǔ)的。
下面分步詳細(xì)說明一、xml數(shù)據(jù)文件壓縮方法1、建立結(jié)構(gòu)代碼所述的結(jié)構(gòu)代碼是一段xml代碼,歸納、描述了xml格式的數(shù)據(jù)文件的結(jié)構(gòu)特征,同時(shí)記錄了數(shù)據(jù)代碼中各項(xiàng)數(shù)據(jù)與結(jié)構(gòu)特征的映射關(guān)系。
a)建立結(jié)構(gòu)代碼示例通過計(jì)算機(jī)程系統(tǒng)的處理,把xml數(shù)據(jù)文件的結(jié)構(gòu)特征歸納為結(jié)構(gòu)代碼。結(jié)構(gòu)代碼是一段用xml標(biāo)記規(guī)則和語(yǔ)法規(guī)則描述數(shù)據(jù)結(jié)構(gòu)的代碼。用以下一段xml數(shù)據(jù)為例Script 5<Customer CompanyName=”ABC Company”City=”Bejing”Address=”XYZ Street”>
<Order OrderNumber=”123456”Date=”2003-01-03”>
<Item ItemNumber=”X123”name=......>
<Quantity>1000<Quantity>
<Item......>
</Order>
<Order......>
......
</Order>
</Customer>
建立結(jié)構(gòu)代碼的基本方法可參考附圖1。
b)結(jié)構(gòu)代碼使用一個(gè)元素節(jié)點(diǎn)描述xml數(shù)據(jù)文件中具有相同結(jié)構(gòu)類型的元素節(jié)點(diǎn),這種節(jié)點(diǎn)可以稱為“記錄節(jié)點(diǎn)”(Record Node),所有記錄節(jié)點(diǎn)使用相同的xml標(biāo)記名稱,例如<RECORD name=”Customer”>
......
</RECORD>
表示該節(jié)點(diǎn)描述xml數(shù)據(jù)文件中名為”Customer”的元素節(jié)點(diǎn)的結(jié)構(gòu)類型,而RECORD則是約定的記錄節(jié)點(diǎn)的xml標(biāo)記名稱。
c)在記錄節(jié)點(diǎn)內(nèi),使用元素節(jié)點(diǎn)描述xml數(shù)據(jù)文件中的每一個(gè)屬性節(jié)點(diǎn),可以稱為“字段節(jié)點(diǎn)”(Column Node)。字段節(jié)點(diǎn)使用相同的xml標(biāo)記名稱,例如<RECORD name=”Customer”>
<COLUMN name=”CompanyName”/>
<COLUMN name=”City”/>
......
</RECORD>
中COLUMN是字段節(jié)點(diǎn)的xml標(biāo)記名稱,而其屬性name的值代表字段的名稱。
d)xml數(shù)據(jù)文件中的元素節(jié)點(diǎn)如果包含有子元素節(jié)點(diǎn)的,使用上述a),b)兩步驟的方法遞歸定義各子記錄節(jié)點(diǎn),例如<pre listing-type="program-listing"><RECORD name=”Customer”><COLUMN name=”CompanyName”/><COLUMN name=”City”/>...... <RECORD name=”O(jiān)rder”> <COLUMN name=”O(jiān)rderNumber”/> ...... <RECORD name=”Item”> <COLUMN name=”ItemNumber”/> <COLUMN name=”name”/> ......<RECORD name=”Quantity”> <COLUMN name=”Value”/> </RECORD> </RECORD>......<!-- SIPO <DP n="6"> --><dp n="d6"/> </RECORD> ......</RECORD></pre>e)對(duì)于有值的數(shù)據(jù)節(jié)點(diǎn)如上述的<Quantity>1000</Quantity>可約定缺省字段名稱,例如<RECORD name=”Quantity”>
<COLUMN name=”Value”/>
</RECORD>
f)不同的記錄節(jié)點(diǎn),可能含有相同類型的子記錄節(jié)點(diǎn),為了避免這些子記錄節(jié)點(diǎn)在不同的父節(jié)點(diǎn)內(nèi)重復(fù)定義,實(shí)用的結(jié)構(gòu)代碼應(yīng)使用類型定義和類型引用的方式。例如,Script 5輸出的結(jié)果應(yīng)如下<pre listing-type="program-listing">Script 5.1<!--引用Customer類型定義--><record type=”Customer”/><!--Customer的類型定義--><RECORD name=”Customer”><COLUMN name=”CompanyName”/><COLUMN name=”City”/>......<!--引用Order類型定義--><record type=”O(jiān)rder”/></RECORD><!--Order的類型定義--><RECORD name=”O(jiān)rder”> <COLUMN name=”O(jiān)rderNumber”/> ...... <!--引用Item類型定義--> <record type=”Item”/><!-- SIPO <DP n="7"> --><dp n="d7"/></RECORD><!--Item的類型定義--><RECORD name=”Item”> <COLUMN name=”ItemNumber”/> <COLUMN name=”name”/> ...... <!--引用Quantity類型定義--> <record type=”Quantity”></RECORD><!--Quantity的類型定義--> <RECORD name=”Quantity”> <COLUMN name=”Value”/></RECORD></pre>因此,記錄節(jié)點(diǎn)又可以分為記錄類型定義節(jié)點(diǎn)和記錄類型引用節(jié)點(diǎn)兩種。類型引用節(jié)點(diǎn)的xml標(biāo)記名稱為“record”。
g)如果為了優(yōu)化壓縮程序或解壓縮程序,可以在不破壞結(jié)構(gòu)代碼功能的前提下,在結(jié)構(gòu)代碼中添加一些輔助代碼。
h)在不破壞結(jié)構(gòu)代碼的功能的前提下可以把結(jié)構(gòu)代碼嵌入某個(gè)適用的Schema大綱代碼中。
i)結(jié)構(gòu)代碼中可以包含數(shù)據(jù)代碼保存或傳輸時(shí)的編碼方式,以標(biāo)示數(shù)據(jù)代碼是否進(jìn)一步使用了二進(jìn)制壓縮方法(如zip方法等)對(duì)數(shù)據(jù)代碼進(jìn)行壓縮。
2.壓縮代碼生成所述的數(shù)據(jù)壓縮代碼(程序)是一段程序代碼,在計(jì)算機(jī)系統(tǒng)內(nèi)執(zhí)行時(shí),根據(jù)結(jié)構(gòu)代碼的描述產(chǎn)生數(shù)據(jù)代碼。
2-1)通過計(jì)算機(jī)系統(tǒng)運(yùn)行“壓縮代碼生成程序”,對(duì)過程1產(chǎn)生的結(jié)構(gòu)代碼進(jìn)行處理,產(chǎn)生出“壓縮代碼”。
2-2)“壓縮代碼生成程序”是把結(jié)構(gòu)代碼轉(zhuǎn)換成壓縮代碼的程序,與xml數(shù)據(jù)的內(nèi)容和結(jié)構(gòu)特征無關(guān),只因數(shù)據(jù)代碼的語(yǔ)法或結(jié)構(gòu)代碼的語(yǔ)法規(guī)則的變化而變化。因此在特定的語(yǔ)法方案下,壓縮代碼生成程序是不變的。參考附圖2。
a)針對(duì)結(jié)構(gòu)代碼內(nèi)的每一個(gè)記錄節(jié)點(diǎn)類型,產(chǎn)生一套如以下步驟b-f所述的處理方法,它根據(jù)不同記錄的旗標(biāo)和結(jié)構(gòu)的不同,產(chǎn)生形式相同但內(nèi)容不同的程序代碼,此處所述內(nèi)容是指旗標(biāo)名稱、字段數(shù)量、子記錄數(shù)量及排列等;b)如果節(jié)點(diǎn)下有子記錄節(jié)點(diǎn),產(chǎn)生一段輸出記錄旗標(biāo)的程序代碼c)如果節(jié)點(diǎn)下沒有子記錄節(jié)點(diǎn),產(chǎn)生一段輸出缺省記錄旗標(biāo)的程序代碼d)對(duì)記錄節(jié)點(diǎn)下的每一個(gè)屬性節(jié)點(diǎn),產(chǎn)生一段輸出字段數(shù)據(jù)加分隔符的程序代碼e)對(duì)記錄節(jié)點(diǎn)下的每一個(gè)子記錄節(jié)點(diǎn),應(yīng)用a)-d)過程,遞歸產(chǎn)生子記錄節(jié)點(diǎn)程序代碼。
f)針對(duì)結(jié)構(gòu)代碼內(nèi)的每一個(gè)記錄節(jié)點(diǎn)引用,聲明調(diào)用該類型的處理方法。
2-3)“壓縮代碼”的功能是把xml數(shù)據(jù)文件變換為平文格式的程序代碼或符號(hào)代碼如xslt代碼。
3、壓縮3-1)計(jì)算機(jī)程系統(tǒng)執(zhí)行壓縮代碼指令,把xml數(shù)據(jù)文件中的數(shù)據(jù),轉(zhuǎn)換成數(shù)據(jù)代碼。
3-2)壓縮代碼執(zhí)行過程中,使用不同的記錄標(biāo)記符號(hào)——“旗標(biāo)”來標(biāo)示不同結(jié)構(gòu)的記錄,使用標(biāo)記符號(hào)分隔數(shù)據(jù)字段,并用符號(hào)標(biāo)記記錄的結(jié)束。利用數(shù)據(jù)代碼的旗標(biāo)與結(jié)構(gòu)代碼中節(jié)點(diǎn)的屬性值的對(duì)應(yīng)關(guān)系建立起數(shù)據(jù)代碼的記錄與結(jié)構(gòu)代碼中元素節(jié)點(diǎn)的映射關(guān)系。同時(shí)根據(jù)結(jié)構(gòu)代碼對(duì)字段順序的描述排列數(shù)據(jù)代碼的相應(yīng)字段。從而建立數(shù)據(jù)代碼中各數(shù)據(jù)與結(jié)構(gòu)代碼的映射關(guān)系??蓞⒖几綀D3。
例如數(shù)據(jù)代碼Script 5壓縮后可以轉(zhuǎn)變?yōu)镾cript 6Customer+ABC Company,Bejing,XYZ Street’
Order+123456,2003-01-03’Item+X123,......+1000’Item+......+...’注Script 6中的換行符不是必需的,在本例子中僅僅是為了方便閱讀。
說明a)在Script 6中每一行對(duì)應(yīng)為一條記錄。
b)在Script 6中每一條記錄的第一個(gè)“詞”(Word)是記錄的旗標(biāo),可以在前述的結(jié)構(gòu)代碼中找到以旗標(biāo)值命名的記錄節(jié)點(diǎn)。
c)每一條記錄用“,”分隔字段值(數(shù)據(jù))。
d)每一條記錄在旗標(biāo)之后的數(shù)據(jù)按結(jié)構(gòu)代碼中記錄節(jié)點(diǎn)內(nèi)字段節(jié)點(diǎn)的順序排列。
e)每一條記錄用“’”符號(hào)結(jié)束。
f)源數(shù)據(jù)中的<Quantity>1000<Quantity>節(jié)點(diǎn),是Item的子節(jié)點(diǎn),且自身不包含子節(jié)點(diǎn),如果使用缺省的子記錄旗標(biāo)“+”仍可準(zhǔn)確地實(shí)現(xiàn)映射關(guān)系(如Item只有一個(gè)子記錄Quantity,而Quantity沒有子記錄),則可以使用缺省的子記錄旗標(biāo)。
g)由于結(jié)構(gòu)代碼也是一種xml數(shù)據(jù)文件,因此也可以使用上述方法進(jìn)行壓縮,不同的是,由于在特定的語(yǔ)法方案下,不同xml數(shù)據(jù)的“結(jié)構(gòu)代碼”都有相同的結(jié)構(gòu)形式。因此對(duì)結(jié)構(gòu)代碼使用本發(fā)明的技術(shù)進(jìn)行壓縮或解壓縮時(shí)不再需要用另一個(gè)結(jié)構(gòu)代碼來描述結(jié)構(gòu)代碼的結(jié)構(gòu)特征,可以直接編寫出通用的結(jié)構(gòu)代碼壓縮和解壓縮程序。
使用數(shù)據(jù)文件的記錄標(biāo)記可以在結(jié)構(gòu)代碼中查詢到該記錄在xml格式的數(shù)據(jù)文件中的結(jié)構(gòu)特征和在數(shù)據(jù)文件中的結(jié)構(gòu)特征。
3-3)做為一種實(shí)施方式,所述的xml格式的結(jié)構(gòu)代碼使得可以使用xslt格式的壓縮代碼生成腳本通,通過XSLT處理器的處理,動(dòng)態(tài)生成xslt壓縮腳本,進(jìn)而可以使用xslt壓縮腳本壓縮xml數(shù)據(jù)代碼。所述的XSLT處理器是一種可以把xml文件按xslt語(yǔ)法指令轉(zhuǎn)換成另一種文本的軟件。所述的xslt是XSL Transformations,由W3C頒布。
4、修飾
4-1)一個(gè)xml格式的數(shù)據(jù)文件可以用Schema描述其各項(xiàng)數(shù)據(jù)的屬性特征,Schema也是一種xml格式的數(shù)據(jù)文件。因此可以應(yīng)用本方法壓縮Schema文件,然后添加到結(jié)果文件中結(jié)構(gòu)代碼和數(shù)據(jù)代碼之間。
4-2)結(jié)構(gòu)代碼也可以用URL語(yǔ)法標(biāo)記xml數(shù)據(jù)文件的Schema的物理存儲(chǔ)位置。
上述方法在解壓縮過程中的應(yīng)用可參考附圖5。
壓縮后的結(jié)構(gòu)代碼可以以文件頭的形式與數(shù)據(jù)代碼組成一個(gè)完整的結(jié)果文件。如果結(jié)構(gòu)代碼和數(shù)據(jù)代碼分為不同文件存儲(chǔ)或傳輸,數(shù)據(jù)代碼必須在文件的前部標(biāo)示結(jié)構(gòu)代碼的特征標(biāo)記(如文件名或URL)。
二、數(shù)據(jù)文件解壓縮方法數(shù)據(jù)解壓縮程序是一段程序代碼,在計(jì)算機(jī)系統(tǒng)內(nèi)執(zhí)行時(shí),處理數(shù)據(jù)代碼,根據(jù)結(jié)構(gòu)代碼的描述恢復(fù)源數(shù)據(jù)的特征。
可參考附圖4。
1.數(shù)據(jù)解壓縮分為“標(biāo)記掃描程序”(Scanner)和“指針驅(qū)動(dòng)程序”(Driver)兩個(gè)主要部分,可以用各種編程語(yǔ)言實(shí)現(xiàn)。
2.“標(biāo)記掃描程序”,“指針驅(qū)動(dòng)程序”部分都是公共的,適用于所有數(shù)據(jù)格式的解壓。
3.解壓縮數(shù)據(jù)時(shí)“指針驅(qū)動(dòng)程序”首先讀入結(jié)構(gòu)代碼,如果結(jié)構(gòu)代碼中標(biāo)記了數(shù)據(jù)代碼使用過某種二進(jìn)制壓縮方法,則指示標(biāo)記掃描程程序需首先使用相應(yīng)的方法對(duì)數(shù)據(jù)代碼進(jìn)行解碼。
4.“指針驅(qū)動(dòng)程序”在結(jié)構(gòu)代碼中找出第一條記錄的標(biāo)記符號(hào)(旗標(biāo)),然后驅(qū)動(dòng)“標(biāo)記掃描程序”開始掃描數(shù)據(jù)代碼。
5.“標(biāo)記掃描程序”從壓縮數(shù)據(jù)文件起始位置開始以標(biāo)記為單位逐個(gè)標(biāo)記(Token)進(jìn)行數(shù)據(jù)文件的掃描?!皹?biāo)記”是數(shù)據(jù)文件中的所有分隔符、旗標(biāo)以及有效數(shù)據(jù)?!皹?biāo)記掃描程序”掃描到一個(gè)“數(shù)據(jù)”標(biāo)記后,把掃描指針停止在標(biāo)記上,觸發(fā)并等待“指針驅(qū)動(dòng)程序”對(duì)當(dāng)前標(biāo)記進(jìn)行檢驗(yàn),“指針驅(qū)動(dòng)程序”發(fā)出指令后移動(dòng)到下一個(gè)標(biāo)記。
6.“指針驅(qū)動(dòng)程序”根據(jù)結(jié)構(gòu)代碼的描述,判斷當(dāng)前標(biāo)記的特征,如果標(biāo)記的特征與結(jié)構(gòu)代碼的描述相一致,表示數(shù)據(jù)正確,從而可以利用結(jié)構(gòu)代碼對(duì)當(dāng)前數(shù)據(jù)特征的描述重構(gòu)當(dāng)前的數(shù)據(jù)值為原來的xml數(shù)據(jù)格式。
7.如果結(jié)構(gòu)代碼中標(biāo)記了Schema的位置,可以事先讀入Schema的信息并使用上述方法進(jìn)行解壓縮。
例如“標(biāo)記掃描程序”和“指針驅(qū)動(dòng)程序”使用以下五個(gè)主要方法交互,完成解壓縮的解析過程1.hasMoreRecord()詢問“標(biāo)記掃描程序”當(dāng)前指針位置之后是否還有記錄,用于判斷數(shù)據(jù)結(jié)構(gòu)是否正確。如果指針驅(qū)動(dòng)程序根據(jù)結(jié)構(gòu)代碼的描述,斷定應(yīng)該還有未完成的記錄,而標(biāo)記掃描程序?yàn)闊o記錄,則表示數(shù)據(jù)可能丟失。如果相反,根據(jù)結(jié)構(gòu)代碼的描述,斷定記錄掃描應(yīng)該結(jié)束,而數(shù)據(jù)代碼內(nèi)仍有記錄,則表示數(shù)據(jù)與大綱格式不匹配。
2.isRecord(String tag),詢問“標(biāo)記掃描程序”當(dāng)前指針位置是不是一個(gè)以tag值命名的記錄頭(一個(gè)記錄分隔符緊跟tag的數(shù)值),用于判斷數(shù)據(jù)結(jié)構(gòu)是否正確以及是否數(shù)據(jù)結(jié)構(gòu)的循環(huán)起點(diǎn)。如果是,可驅(qū)動(dòng)“標(biāo)記掃描程序”把指針移動(dòng)到下一個(gè)標(biāo)記位置,輸出上一個(gè)記錄節(jié)點(diǎn)的結(jié)束標(biāo)志,并輸出一個(gè)記錄節(jié)點(diǎn)起點(diǎn)標(biāo)志。
3.hasMoreData()詢問“標(biāo)記掃描程序”當(dāng)前指針位置是否還有字段數(shù)據(jù),用于判斷數(shù)據(jù)結(jié)構(gòu)是否正確。如果該方法返回”no”,應(yīng)輸出當(dāng)前記錄節(jié)點(diǎn)的結(jié)束標(biāo)記。
4.getNextData()讀取“標(biāo)記掃描程序”的當(dāng)前數(shù)據(jù),如果hasMoreData()返回”yes”,使用該方法讀取標(biāo)記數(shù)據(jù)、驅(qū)動(dòng)指針到下一位置,同時(shí)根據(jù)大綱對(duì)當(dāng)前節(jié)點(diǎn)的描述,輸出一個(gè)屬性節(jié)點(diǎn)。
5.hasMoreSubRecord()詢問“標(biāo)記掃描程序”當(dāng)前指針位置之后是否還有子記錄,用于判斷數(shù)據(jù)結(jié)構(gòu)是否正確。如果返回值為“yes”,并與結(jié)構(gòu)代碼相匹配,就使用結(jié)構(gòu)代碼的信息輸出一個(gè)記錄節(jié)點(diǎn)的起點(diǎn)標(biāo)志。
6.skip(inti)驅(qū)動(dòng)“標(biāo)記掃描程序”當(dāng)前指針向下移動(dòng)i個(gè)標(biāo)記位置,用于有意忽略某些數(shù)據(jù),例如跳過不需讀取的旗標(biāo)節(jié)點(diǎn)的數(shù)據(jù)。
本發(fā)明的有益效果是有效地壓縮xml格式的電子數(shù)據(jù),從而有效地提高xml格式電子數(shù)據(jù)的傳輸和存儲(chǔ)效率。降低xml格式電子數(shù)據(jù)的傳輸和存儲(chǔ)的成本。
可直接應(yīng)用于傳統(tǒng)的EDI領(lǐng)域,使EDI數(shù)據(jù)用戶可以用xml技術(shù)處理數(shù)據(jù),從而降低EDI應(yīng)用的技術(shù)難度,降低EDI應(yīng)用的實(shí)施和運(yùn)營(yíng)成本。
可應(yīng)用于嵌入式應(yīng)用軟件系統(tǒng),如手提電話的電子數(shù)據(jù)傳輸系統(tǒng),提高數(shù)據(jù)傳輸效率。
由于“網(wǎng)絡(luò)服務(wù)”的基本概念就是數(shù)據(jù)收發(fā)雙方使用預(yù)先約定的大綱格式收發(fā)xml報(bào)文,本發(fā)明可應(yīng)用在基于“網(wǎng)絡(luò)服務(wù)(Web service)”架構(gòu)的電子商務(wù)系統(tǒng)和其它電子商務(wù)系統(tǒng),提高數(shù)據(jù)傳輸和存儲(chǔ)效率。
由于使用本方法壓縮的數(shù)據(jù)可以保持為文本方式,因此可以方便地通過各種文本傳輸協(xié)議傳輸和現(xiàn)有的公開技術(shù)進(jìn)行處理。例如,可以用網(wǎng)頁(yè)或把數(shù)據(jù)嵌入網(wǎng)頁(yè)的形式直接傳送壓縮的數(shù)據(jù)文件。
以上實(shí)施例只是為了方便對(duì)本發(fā)明進(jìn)行說明,不應(yīng)理解為對(duì)本發(fā)明的限制?;诒景l(fā)明的基本構(gòu)思而存在的變通實(shí)施方式也同樣屬于本發(fā)明的范圍。例如1.被壓縮的xml格式的數(shù)據(jù)代碼可以是xml代碼片斷或“格式完整”的xml代碼。
2.壓縮過程中提到的結(jié)構(gòu)代碼可以是xml代碼片斷(例如嵌入在大綱Schema文件內(nèi)的xml片斷)或“格式完整”的xml代碼。
3.所述的結(jié)構(gòu)代碼也是一種xml格式的數(shù)據(jù)代碼,因此,可以應(yīng)用本發(fā)明中的技術(shù)壓縮結(jié)構(gòu)代碼。
4.所述的數(shù)據(jù)代碼是指可用標(biāo)記區(qū)分記錄和用標(biāo)記分隔字段的文本格式的代碼。數(shù)據(jù)代碼并不必須是來自于xml格式的數(shù)據(jù)代碼的壓縮結(jié)果。
5.所指的計(jì)算機(jī)系統(tǒng)是指具有信息處理能力的裝置和相關(guān)的軟件系統(tǒng)組成的系統(tǒng)。
6.一個(gè)xml格式的數(shù)據(jù)文件可以用Schema描述其各項(xiàng)數(shù)據(jù)的屬性特征,Schema也是一種xml格式的數(shù)據(jù)文件。因此可以應(yīng)用上述方法壓縮Schema文件,然后添加到結(jié)果文件中或另外保存、傳送。
7、本發(fā)明中結(jié)構(gòu)代碼的xml格式和利用通用壓縮代碼生成程序來生成壓縮程序的特征使得壓縮過程僅在一個(gè)支持xslt的瀏覽器(如Internet Explorer 5.5、Netscape 6.1和Mozilla等)上即可一次完成xml數(shù)據(jù)的壓縮任務(wù)。
8.數(shù)據(jù)代碼可以使用其它二進(jìn)制壓縮方法進(jìn)一步壓縮,這時(shí)所使用的二進(jìn)制壓縮方法應(yīng)該在結(jié)構(gòu)代碼中予以標(biāo)記。
9、解壓縮時(shí)所述的“恢復(fù)源數(shù)據(jù)的信息”也可包括在數(shù)據(jù)解壓縮過程中,應(yīng)用大綱文件對(duì)解壓縮數(shù)據(jù)進(jìn)行屬性修飾。
權(quán)利要求
1.一種xml數(shù)據(jù)壓縮和解壓方法,包括壓縮過程和解壓縮過程,其特征是壓縮過程包括如下步驟1)計(jì)算機(jī)系統(tǒng)把xml格式的數(shù)據(jù)代碼中的“數(shù)據(jù)結(jié)構(gòu)特征”歸納成為xml格式的結(jié)構(gòu)代碼;2)計(jì)算機(jī)系統(tǒng)運(yùn)行數(shù)據(jù)壓縮程序,參照結(jié)構(gòu)代碼對(duì)數(shù)據(jù)特征的描述,把xml數(shù)據(jù)轉(zhuǎn)換為平文格式的數(shù)據(jù)代碼;解壓縮過程中,計(jì)算機(jī)系統(tǒng)運(yùn)行解壓縮程序,解析數(shù)據(jù)代碼,并參照結(jié)構(gòu)代碼對(duì)數(shù)據(jù)特征的描述,恢復(fù)源數(shù)據(jù)的信息。
2.如權(quán)利要求1所述的xml數(shù)據(jù)壓縮和解壓方法,其特征是步驟1)中所述結(jié)構(gòu)代碼是一段用xml標(biāo)記規(guī)則和語(yǔ)法規(guī)則描述數(shù)據(jù)結(jié)構(gòu)的代碼;它使用一個(gè)元素節(jié)點(diǎn)描述xml數(shù)據(jù)文件中具有相同結(jié)構(gòu)類型的元素節(jié)點(diǎn),這種節(jié)點(diǎn)稱為“記錄節(jié)點(diǎn)”;在記錄節(jié)點(diǎn)內(nèi),使用元素節(jié)點(diǎn)描述xml數(shù)據(jù)文件中的每一個(gè)屬性節(jié)點(diǎn),稱為“字段節(jié)點(diǎn)”;xml數(shù)據(jù)文件中的元素節(jié)點(diǎn)如果包含有子元素節(jié)點(diǎn)的,使用上述方法遞歸定義各子記錄節(jié)點(diǎn)。
3.如權(quán)利要求2所述的xml數(shù)據(jù)壓縮和解壓方法,其特征是記錄節(jié)點(diǎn)又可以分為記錄類型定義節(jié)點(diǎn)和記錄類型引用節(jié)點(diǎn)。
4.如權(quán)利要求1或2所述的xml數(shù)據(jù)壓縮和解壓方法,其特征是所述數(shù)據(jù)壓縮程序可以利用“壓縮代碼生成程序”生成,所述“壓縮代碼生成程序”包括如下處理步驟a)針對(duì)結(jié)構(gòu)代碼內(nèi)的每一個(gè)記錄節(jié)點(diǎn)類型,產(chǎn)生一套如以下步驟b-f所述的處理方法,它根據(jù)不同記錄的旗標(biāo)和結(jié)構(gòu)的不同,產(chǎn)生形式相同但內(nèi)容不同的程序代碼,此處所述內(nèi)容包括旗標(biāo)名稱、字段數(shù)量、子記錄數(shù)量及排列;b)如果節(jié)點(diǎn)下有子記錄節(jié)點(diǎn),產(chǎn)生一段輸出記錄旗標(biāo)的程序代碼;c)如果節(jié)點(diǎn)下沒有子記錄節(jié)點(diǎn),產(chǎn)生一段輸出缺省記錄旗標(biāo)的程序代碼;d)對(duì)記錄節(jié)點(diǎn)下的每一個(gè)屬性節(jié)點(diǎn),產(chǎn)生一段輸出字段數(shù)據(jù)加分隔符的程序代碼;e)對(duì)記錄節(jié)點(diǎn)下的每一個(gè)子記錄節(jié)點(diǎn),應(yīng)用a)-d)過程,遞歸產(chǎn)生子記錄節(jié)點(diǎn)程序代碼;f)針對(duì)結(jié)構(gòu)代碼內(nèi)的每一個(gè)記錄節(jié)點(diǎn)引用,聲明調(diào)用該類型的處理方法。
5.如權(quán)利要求1或2所述的xml數(shù)據(jù)壓縮和解壓方法,其特征是所述“壓縮代碼”的功能是把xml數(shù)據(jù)文件變換為平文格式的程序代碼或符號(hào)代碼;壓縮代碼執(zhí)行過程中,使用不同的記錄標(biāo)記符號(hào)——旗標(biāo)來標(biāo)示不同結(jié)構(gòu)的記錄,使用標(biāo)記符號(hào)分隔數(shù)據(jù)字段,并用符號(hào)標(biāo)記記錄的結(jié)束;利用數(shù)據(jù)代碼的旗標(biāo)與結(jié)構(gòu)代碼中節(jié)點(diǎn)的屬性值的對(duì)應(yīng)關(guān)系建立起數(shù)據(jù)代碼的記錄與結(jié)構(gòu)代碼中元素節(jié)點(diǎn)的映射關(guān)系;同時(shí)根據(jù)結(jié)構(gòu)代碼對(duì)字段順序的描述排列數(shù)據(jù)代碼的相應(yīng)字段;從而建立數(shù)據(jù)代碼中各數(shù)據(jù)與結(jié)構(gòu)代碼的映射關(guān)系。
6.如權(quán)利要求1或2所述的xml數(shù)據(jù)壓縮和解壓方法,其特征是所述解壓縮程序包括“標(biāo)記掃描程序”和“指針驅(qū)動(dòng)程序”;解壓縮數(shù)據(jù)時(shí)“指針驅(qū)動(dòng)程序”首先讀入結(jié)構(gòu)代碼,“指針驅(qū)動(dòng)程序”在結(jié)構(gòu)代碼中找出第一條記錄的標(biāo)記符號(hào),然后驅(qū)動(dòng)“標(biāo)記掃描程序”開始掃描數(shù)據(jù)代碼;“標(biāo)記掃描程序”從壓縮數(shù)據(jù)文件起始位置開始以標(biāo)記為單位逐個(gè)標(biāo)記進(jìn)行數(shù)據(jù)文件的掃描;“標(biāo)記”是數(shù)據(jù)文件中的所有分隔符、旗標(biāo)以及有效數(shù)據(jù);有效數(shù)據(jù)標(biāo)記稱為“數(shù)據(jù)標(biāo)記”,“標(biāo)記掃描程序”掃描到一個(gè)“數(shù)據(jù)標(biāo)記”后,把掃描指針停止在標(biāo)記上,觸發(fā)并等待“指針驅(qū)動(dòng)程序”對(duì)當(dāng)前標(biāo)記進(jìn)行檢驗(yàn),“指針驅(qū)動(dòng)程序”發(fā)出指令后移動(dòng)到下一個(gè)標(biāo)記;“指針驅(qū)動(dòng)程序”根據(jù)結(jié)構(gòu)代碼的描述,判斷當(dāng)前標(biāo)記的特征,如果標(biāo)記的特征與結(jié)構(gòu)代碼的描述相一致,表示數(shù)據(jù)正確,從而可以利用結(jié)構(gòu)代碼對(duì)當(dāng)前數(shù)據(jù)特征的描述重構(gòu)當(dāng)前的數(shù)據(jù)值為原來的xml數(shù)據(jù)格式。
7.如權(quán)利要求6所述的xml數(shù)據(jù)壓縮和解壓方法,其特征是如果結(jié)構(gòu)代碼中標(biāo)記了數(shù)據(jù)代碼使用過某種二進(jìn)制壓縮方法,則指示標(biāo)記掃描程序需首先使用相應(yīng)的方法對(duì)數(shù)據(jù)代碼進(jìn)行解碼。
8.如權(quán)利要求1或2所述的xml數(shù)據(jù)壓縮和解壓方法,其特征是所述的xml格式的結(jié)構(gòu)代碼使得可以使用xslt格式的壓縮代碼生成腳本通,通過XSLT處理器的處理,動(dòng)態(tài)生成xslt壓縮腳本,進(jìn)而可以使用xslt壓縮腳本壓縮xml數(shù)據(jù)代碼。
9.如權(quán)利要求8所述的xml數(shù)據(jù)壓縮和解壓方法,其特征是所述的XSLT處理器是一種可以把xml文件按xslt語(yǔ)法指令轉(zhuǎn)換成另一種文本的軟件。
10.如權(quán)利要求1或2所述的xml數(shù)據(jù)壓縮和解壓方法,其特征是將壓縮后的結(jié)構(gòu)代碼以文件頭的形式與數(shù)據(jù)代碼組成一個(gè)完整的結(jié)果文件;或者將結(jié)構(gòu)代碼和數(shù)據(jù)代碼分為不同文件存儲(chǔ)或傳輸,此時(shí)數(shù)據(jù)代碼必須在文件的前部標(biāo)示結(jié)構(gòu)代碼的特征標(biāo)記。
全文摘要
本發(fā)明公開一種xml數(shù)據(jù)壓縮和解壓方法,其特征是數(shù)據(jù)壓縮時(shí),把xml格式的數(shù)據(jù)代碼中的“數(shù)據(jù)結(jié)構(gòu)特征”歸納成為xml格式的結(jié)構(gòu)代碼。利用結(jié)構(gòu)代碼,計(jì)算機(jī)系統(tǒng)可以運(yùn)行通用的壓縮代碼生成程序,動(dòng)態(tài)地生成壓縮程序。計(jì)算機(jī)系統(tǒng)運(yùn)行數(shù)據(jù)壓縮程序,把xml數(shù)據(jù)轉(zhuǎn)換為平文格式的數(shù)據(jù)代碼。數(shù)據(jù)解壓縮時(shí),計(jì)算機(jī)系統(tǒng)運(yùn)行解壓縮程序,解析數(shù)據(jù)代碼,并參照結(jié)構(gòu)代碼對(duì)數(shù)據(jù)特征的描述,恢復(fù)源數(shù)據(jù)的信息。通過應(yīng)用這種技術(shù)在保存數(shù)據(jù)完整信息的同時(shí)減小數(shù)據(jù)存儲(chǔ)和傳輸?shù)拇笮 ?br>
文檔編號(hào)G06F9/45GK1492322SQ0314025
公開日2004年4月28日 申請(qǐng)日期2003年8月20日 優(yōu)先權(quán)日2003年8月20日
發(fā)明者黃放, 黃 放 申請(qǐng)人:黃放, 黃 放