可扩展标记语言数据流压缩器及其压缩方法

文档序号:7555531阅读:134来源:国知局
专利名称:可扩展标记语言数据流压缩器及其压缩方法
技术领域
本发明涉及一种网络环境中可扩展标记语言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)简记为&lt;A&gt;,把endElement(A)简记为&lt;/A&gt;,则产生的序列为1.&lt;/C&gt;&lt;C&gt;权重为2,其余序列的权重为12.&lt;R&gt;&lt;A&gt;
3.&lt;R&gt;&lt;A&gt;&lt;B&gt;
4.&lt;R&gt;&lt;A&gt;&lt;K&gt;&lt;A&gt;
5.&lt;R&gt;&lt;A&gt;&lt;K&gt;&lt;A&gt;&lt;B&gt;
6.&lt;R&gt;&lt;A&gt;&lt;K&gt;&lt;A&gt;&lt;K&gt;&lt;A&gt;
7.&lt;/A&gt;&lt;B&gt;
8.&lt;/A&gt;&lt;C&gt;
9.&lt;/B&gt;&lt;/A&gt;&lt;B&gt;
10.&lt;/B&gt;&lt;/A&gt;&lt;C&gt;
11.&lt;/B&gt;&lt;/K&gt;&lt;/A&gt;&lt;B&gt;
12.&lt;/B&gt;&lt;/K&gt;&lt;/A&gt;&lt;C&gt;
13.&lt;/B&gt;&lt;/K&gt;&lt;/K&gt;&lt;/A&gt;&lt;B&gt;
14.&lt;/B&gt;&lt;/K&gt;&lt;/K&gt;&lt;/A&gt;&lt;C&gt;
15.&lt;/B&gt;&lt;/K&gt;&lt;/K&gt;&lt;/K&gt;&lt;/A&gt;&lt;C&gt;
16.&lt;/B&gt;&lt;/K&gt;&lt;/K&gt;&lt;/K&gt;&lt;/K&gt;&lt;/A&gt;
17.&lt;/B&gt;&lt;/K&gt;&lt;/K&gt;&lt;/K&gt;&lt;/K&gt;&lt;/K&gt;
18.&lt;/C&gt;&lt;/R&gt;
下一步,需要估算元素事件序列出现的频率。现在给出关于被压缩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日
发明者高军, 王腾蛟, 杨冬青, 唐世渭, 高 军 申请人:北京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1