具体实施方式
以下将结合附图和实施例对本发明进行详细描述。
(第一实施例)
图1是根据本发明的第一实施例的XML数据压缩方法的流程图。参照图1,该XML数据压缩方法包括以下步骤:
步骤S100、对XML schema进行优化,以去除冗余结构信息和节点间的间接使用,并存储优化后的schema;
步骤S101、利用优化后的schema提取以所述schema为规范的XML数据的结构信息部分;
步骤S102、按照优化后的schema节点将所述XML数据的数据部分分成多个数据块;和
步骤S103、分别使用通用压缩方法对结构信息部分和数据块进行压缩,并将压缩结果输出到文件。
具体地,在步骤S100中,可按照以下优化原则对XML schema进行优化:
1、对于以引用、扩展和限定等方式连接到另一个节点的节点,直接将该节点连接到所述另一个节点,这里,这些间接使用的节点的类型包括类型(Type)、引用(Ref)、组(Group)、扩展(Extension)、限定(Restriction);
2、对于其所有子节点都是可选节点的序列指示器,将该序列指示器变为可选;
3、对于没有子节点的序列指示器,删除该序列指示器;
4、对于只有一个子节点而且这个子节点也是序列指示器的序列指示器,将作为其子节点的序列指示器和该序列指示器进行合并。
按照以上优化原则对schema进行简化之后,为保留的每个schema节点分配一个编号。
经过上述优化处理之后,删去了schema中的Type、SimpleType、ComplexType、AttributeGroup、Group等类型的节点,仅保留了Sequence、Choice、All等类型的节点信息,从而得到一个结构信息极为简化的schema。
在步骤S101中提取XML数据的结构信息时,对于XML数据的每个节点,仅记录其对应的schema节点中实际出现的子节点的出现情况及出现次数。具体地,对于minOccurs=0且maxOccurs>0的节点,需要记录其是否出现的信息,如果该节点出现的话,还需记录其出现次数。对于minOccurs>0的节点,如果minOccurs不等于maxOccurs,需要记录其出现次数。
从图1所示流程图可看出,本发明通过去除schema中的冗余结构信息和节点间的间接引用来实现schema的简化,继而通过这种简化的schema,获得了以该schema为规范的XML数据的最小化的结构信息和优化分组的数据块,从而提高了压缩率。
此外,对于以所述schema为规范的其它待压缩XML数据,可以直接使用存储的优化后的schema对该XML数据进行压缩,从而可节省用于再次解析和优化schema的时间,提高处理效率。
图2是对通过图1所示压缩方法得到的压缩XML数据进行解压的方法的流程图。如图2所示,解压方法包括以下步骤:
步骤S200、对存储的schema进行解析;
步骤S201、对压缩的结构信息部分进行解压;
步骤S202、对压缩的数据部分进行解压;
步骤S203、建立schema节点和解压后的数据之间的绑定关系;
步骤S204、根据解析的schema和解压的结构信息还原XML数据的结构,并从对应的schema节点的数据块中获取相应的数据,生成XML文档。
为了实现以上压缩方法,本发明提供一种XML数据压缩系统。参照图3a,该XML数据压缩系统包括:
输入单元301,其用于将待处理的XML数据的schema输入给优化单元302,并将待处理的XML数据输入给结构单元304和数据单元305;
优化单元302,其用于对XML schema进行优化,以去除冗余结构信息和节点间的间接使用,并将优化后的schema存储到存储单元303;
存储单元303,其用于存储从优化单元302接收的优化后的schema;
结构单元304,其用于利用优化后的schema提取从输入单元301接收的XML数据的结构信息部分,并将提取的结构信息部分发送给压缩输出单元306;
数据单元305,其用于按照优化后的schema节点将从输入单元301接收的XML数据的数据部分分成多个数据块,并将这些数据块发送给压缩输出单元306;和
压缩输出单元306,其用于分别使用通用压缩方法对提取的结构信息部分和数据块进行压缩,并将压缩结果输出到文件。
另外,为了实现以上解压缩方法,本发明提供一种XML解压缩系统。参照图3b,该XML解压缩系统包括:
schema解析单元307,其用于获取优化后的schema,并对其进行解析;
结构解压单元308,其用于获取压缩的结构信息部分,并对其进行解压;
数据解压单元309,其用于获取压缩的数据部分,并对其进行解压;
还原单元310,其用于建立schema节点和解压后的数据之间的绑定关系;根据解析的schema和解压的结构信息还原XML数据的结构,并从对应的schema节点的数据块中获取相应的数据,生成XML文档;和
解压输出单元311,其用于输出还原单元310生成的XML文档。
图3a和图3b所示单元的具体操作与上述方法中的相应步骤相同,因此,省略其详细描述。
(第二实施例)
图4是根据本发明的第二实施例的XML数据压缩方法的流程图。从图4和图1对比可看出,第二实施例与第二实施例的不同之处在于,在步骤S402中,在按照优化后的schema节点将所述XML数据的数据部分分成多个数据块之后,还要将小于给定阈值的微型数据块合并。通过合并,可优化微型数据块的存储,进一步提高了压缩率。
图5是实现图4所示方法的XML数据压缩系统的框图。从图5和图3a对比可看出,其不同之处在于,增加了合并单元507,其用于合并小于给定阈值的微型数据块,并将合并的微型数据块发送给压缩输出单元506。
第二实施例的解压缩方法和系统与第一实施例相同,因此,省略其描述。
以上参照图1至图5对本发明提出的方法和系统进行了概括性描述,以下将结合具体的实例对本发明的具体实现进行说明。
首先,需要指出的是,在具体实现中,可采取以下两种方式来记录子节点的出现情况和出现次数。
(1)第一种编码方式
采用表1所示前缀编码的方式对实际出现的子节点的编号及出现次数进行二进制编码。
表1
前缀码位数 |
前缀码 |
数据位数 |
总长度 |
1 |
0 |
7 |
8 |
2 |
10 |
14 |
16 |
3 |
110 |
21 |
24 |
4 |
1110 |
28 |
32 |
比如,节点A有四个可选子节点,若出现信息是“00000011”,则表示第3个节点出现或被选择。
具体地,这种编码方式可用于choice指示器,表示实际被选择的子节点的编号,而且还可用于写入出现次数和向数据信息中写入数字。这种编码方式的目标是为了缩短数字的长度,因为如果不进行编码,则一个数字占4字节,编码后一个数字的长度为1-4字节。
(2)第二编码方式
将可选子节点依次排列,根据子节点的出现情况,依次使用1位来标识,“1”表示出现,“0”表示未出现,末尾补0保证字节对齐,比如8字节对齐。
比如,节点A有四个可选子节点,若出现信息是“10110000”,则表示第1、3、4个可选子节点出现或被选择,而第2个子节点未出现。
具体地,这种编码方式可用于element节点或sequence节点,表示其实际出现的子节点的出现情况。
(第一实例)
在第一实例中,XML schema定义如下:
<?xml version=″1.0″encoding=″UTF-8″?>
<xs:schema xmlns:xs=″http://www.w3.org/2001/XMLSchema″>
<xs:element name=″root″type=″t1″/>
<xs:complexType name=″t1″>
<xs:sequence maxOccurs=″3″>
<xs:choice maxOccurs=″2″>
<xs:element name=″e1″type=″xs:int″minOccurs=″0″/>
<xs:element name=″e2″type=″xs:string″minOccurs=″0″/>
<xs:element name=″e3″type=″xs:int″minOccurs=″0″/>
</xs:choice>
<xs:sequence/>
</xs:sequence>
</xs:complexType>
</xs:schema>
在该schema中,存在一个包含choice指示器的sequence指示器和一个没有子节点的sequence指示器,在choice指示器中,其三个子节点e1、e2和e3均为可选节点。
以以上schema为规范的XML数据示例如下:
<?xml version=″1.0″encoding=″UTF-8″?>
<root>
<e2>Mike</e2>
<e3>2</e3>
<e2>Adam</e2>
<e1>3</e1>
</root>
对于该XML数据,本发明的压缩处理过程如下:
步骤1、优化XML schema,并存储优化后的schema。
图6a是原始schema结构,图6b是优化后的schema结构。从图6a和图6b可看出,在优化schema的过程中,删除了一个没有子节点的sequcence指示器,并将其所有子节点(即,e1、e2和e3)均为可选节点的choice指示器和其父节点sequence指示器合并为choice指示器,这里,合并成choice指示器后,其maxOccures变为6。因此,在优化后的schema中,仅保留了root、choice指示器、e1、e2、e3这5个节点信息,并为这5个节点分配编号1、2、3、4、5,其中,choice指示器是root节点的子节点,e1、e2、e3是choice指示器的子节点。通过以上处理,去除了冗余结构信息和节点间的间接引用,获得了简化的schema信息,从而使得能够以最小的信息量提取以该schema为规范的XML数据的结构信息。
接着,存储优化后的schema。在本实例中,利用工具BinarySchemaGenerator将优化后的schema信息存储在一个bsg文件中。对于以该schema为规范的所有XML数据,均可使用存储的该bsg文件对其进行压缩,而不必每次重新解析和优化schema,从而省去了解析和优化schema的时间,提高了处理效率。
步骤2、利用bsg文件提取以上显示的XML数据的结构信息部分。
在该实例中,采用第一种编码方式对子节点的出现情况及出现次数进行编码,优化后的结构信息如表2所示。
表2
1 |
00000100 |
2 |
00000010 0000001100000010 00000001 |
3 |
|
4 |
|
5 |
|
在表2中,编号1、2、3、4、5分别表示root、choice指示器、e1、e2、e3这5个schema节点。在表示root节点的编号“1”中,“00000100”表示其子节点,即,choice指示器出现了4次。在表示choice指示器的编号“2”中,第一行第一列编码“00000010”表示第一次选择e2,第一行第二列编码“00000011”表示第二次选择e3,第二行第一列编码“00000010”表示第三次选择e2,第二行第二列编码“00000001”表示第四次选择e1。e1、e2和e3没有子节点,所以它们的结构信息为空。
从表2可看出,利用简化后的schema提取XML数据的结构信息,去除了冗余结构信息和节点间的间接引用,从而使得XML数据的结构信息表示最小化。
步骤3、利用bsg文件将以上显示的XML数据的数据部分分成多个数据块。具体地,将XML数据中的数据按照表2所示的schema节点分组,分组结果如表3所示。
表3
在表3中,如上所述,编号3、4、5分别表示节点e1、e2和e3,每个节点对应一个数据块。
步骤4、将小于给定阈值(实验测得阈值优选为4k)的数据块按照其schema节点的数据类型进行合并,即,将e1和e3对应的数据都放入int容器中,而将e2对应的数据放入string容器中。
步骤5、使用通用压缩方法对处理后的结构信息部分和数据部分进行压缩,并将压缩结果输出到文件。
对于通过上述方法得到的压缩数据,解压过程如下:
步骤1、解析bsg文件;
步骤2、解压结构信息部分;
步骤3、解压数据部分;
步骤4、将各数据容器中的数据重新分配给其对应的schema节点;
步骤5、根据bsg文件和解压的结构信息重新展开XML结构,并从对应的schema节点的数据块中读取需要的数据,生成XML文档。
(第二实例)
在该实例中,XML schema定义如下:
<?xml version=″1.0″encoding=″UTF-8″?>
<xs:schema xmlns:xs=″http://www.w3.org/2001/XMLSchema″>
<xs:element name=″entry″type=″t1″/>
<xs:complexType name=″t1″>
<xs:sequence maxOccurs=″unbounded″>
<xs:element name=″e1″minOccurs=″0″maxOccurs=″unbounded″/>
<xs:element name=″e2″minOccurs=″0″maxOccurs=″unbounded″/>
<xs:element name=″e3″minOccurs=″0″maxOccurs=″unbounded″/>
</xs:sequence>
</xs:complexType>
</xs:schema>
以以上schema为规范的XML数据示例如下:
<entry>
<e1>1</e1>
<e1>2</e1>
<e1>3</e1>
<e3>1</e3>
<e3>2</e3>
<e1>1</e1>
<e1>2</e1>
<e1>3</e1>
<e2>1</e2>
<e2>2</e2>
<e2>1</e2>
<e2>2</e2>
<e2>3</e2>
<e3>1</e3>
<e3>2</e3>
</entry>
对于该XML数据,本发明的压缩处理过程与第一实施例基本相同,不同之处在于,采用第二种编码方式对子节点的出现情况进行编码,而对于出现次数依然采取二进制编码方式。
图7a是原始schema结构,图7b是优化后的schema结构。从图7a和图7b可看出,在优化schema的过程中,将三个子节点均为可选节点的sequence节点变为可选。
按照bsg文件提取的最小化结构信息如表4所示。
表4
1 |
00000011 |
2 |
10100000 00000011 0000001011000000 00000011 0000001001100000 00000011 00000010 |
3 |
|
4 |
|
5 |
|
在表4中,在表示entry节点的编号1中,“00000011”表示其子节点,即,sequence节点共出现3次。在表示sequence节点的编号2中,第一行第一列“10100000”表示第一个sequence中出现了节点e1和e3,第一行第二列“00000011”表示e1出现了3次,第一行第三列“00000010”表示e3出现了2次;第二行第一列“11000000”表示第二个sequence中出现了节点e1和e2,第二行第二列“00000011”表示e1出现了3次,e2出现了2次;第三行第一列“01100000”表示第三个sequence中出现了e2和e3,第三行第二列“00000011”表示e2出现了3次,第三行第三列“00000010”表示e3出现了2次。
将上述XML数据的数据部分按schema节点分组的结果如表5所示。
表5
由于e1、e2和e3对应的schema节点的数据类型均为int且其数据块大小均小于4k,所以将它们的数据全部放入int容器中。
以下,将通过对来自多个不同领域真实应用的且特征、大小各异的XML数据进行测试来说明本发明方法相比于常用的XML压缩方法的技术效果,如表6和表7所示。在表6和表7中,所有数据表示文件数据大小,均以字节为单位。
表6
actors ebay factbook kgml lineitem part reed
原始数据 13,480 35,453 4,222,646 3,655,418 32,295,596 6,299,374 283,547
本发明方法 1,600 10,999 498,114 112,045 1,109,816 296,418 12,680
xmlppm 1,821 10,334 507,022 148,627 1,029,329 280,963 12,630
xmill 1,896 11,077 700,134 1,513,873 431,664 13,007
xwrt 2,185 12,350 527,385 117,816 1,116,177 297,623 12,651
表7
sigmod weblog xmark yahoo metadata chinesenovel uof
原始数据 478,133 2,648,284 118,552,732 25,312 3,811,423 2,195,488 761,225
本发明方法 51,802 51,808 20,918,343 5,624 227,386 682,688 28,897
xmlppm 47,569 67,127 18,877,970 5,258 584,122 32,201
xmill 57,603 74,536 33,787,000 5,997 366,208 948,164 33,621
xwrt 53,889 57,401 21,183,387 6,996 313,509 953,468 36,026
从表6和表7可看出,本发明提出的压缩方法比现有的压缩方法xmill、xmlppm。xwrt相比,对于大部分xml数据可获得更高的压缩率。即使是和压缩率相对比较高的xwrt相比,本发明提出的压缩方法的压缩率比xwrt的压缩率通常也能高出10%左右。
在以上测试数据中,本发明方法在压缩分离后的结构和数据时采用的是zlib压缩,当采用ppm方法进行压缩时,压缩率要优于xmlppm方法。
以上已参照实施例对本发明进行了详细描述,但是,应该理解,本发明并不限于以上所公开的特定实施例,任何本领域的技术人员在此基础之上容易想到的修改和变型都应包括在本发明的保护范围内。