XML文件处理方法、设备和存储介质与流程

文档序号:16669935发布日期:2019-01-18 23:30阅读:293来源:国知局
XML文件处理方法、设备和存储介质与流程

本发明涉及数据处理领域,更为具体而言,涉及一种xml文件处理方法、设备和存储介质。



背景技术:

当前大型系统的海量报文数据是企业信息化过程中产生的重要资源,是大数据分析和自动化测试以及生产问题跟踪定位的重要资料之一,但也由于数量巨大造成了传输、查询、存储、使用等方面的一些问题,尤其是比较常用的可扩展标记语言(extensiblemarkuplanguage,xml)报文,其本身具有标签和数据冗余量大的特点,且由于同一个交易服务所产生xml报文的结构和数据相同或相近,因此造成了更多的冗余数据被传输和存储,xml报文压缩技术是解决此问题的一个途径。

现有的xml压缩算法工具如xmlppm、xwrt、xgrind等更加适合规模较大的xml文档的压缩,而软件系统的xml报文一般都很小,没有考虑软件系统的xml自身的特征,导致这些算法复杂性较高而且压缩效率不高。



技术实现要素:

本发明提供了一种xml文件处理方法,考虑到软件系统的xml报文一般较小,而且冗余度较高,将xml文档解析为xpath路径表达式,并为xpath表达式进行编号,形成列表作为模板保存,将xml文档压缩为xpath编号和对应元素值的列表,显著提高了软件系统的xml文件的压缩效率。

第一方面,本发明实施方式提供了一种xml文件处理方法,包括:接收待压缩的xml报文和所述xml报文对应的交易服务编码;将所述xml报文解析为xpath表达式和元素值,其中,所述xpath表达式为表示所述xml文件中节点路径的表达式;查询是否存在与所接收的交易服务编码匹配的报文压缩模板,若未查询到匹配的报文压缩模板,则将所接收的交易服务编码和解析出的xpath表达式和元素值存储到数据库作为报文压缩模板,根据预定压缩规则生成压缩字符串;若查询到匹配的报文压缩模板,则根据预定压缩规则生成压缩字符串,并在所述解析出的xpath表达式与匹配的报文压缩模板中的xpath表达式不相同时,更新所述数据库中的报文压缩模板表。

第二方面,本发明实施方式提供一种计算机设备,包括存储器和处理器,其中,所述存储器,存储有计算机指令;所述处理器,配置为执行所述计算机指令以使所述计算机设备实现第一方面所述的方法。

第三方面,本发明实施方式提供一种计算机可读的存储介质,其上存储有计算机指令,所述计算机指令被处理器执行时实现第一方面所述的方法。

附图说明

图1示出了根据本发明实施方式的xml文件处理方法的流程示意图。

图2示出了根据本发明实施方式的xml文件处理方法的代码截图。

图3示出了根据本发明实施方式的xml文件处理方法的代码截图。

图4示出了根据本发明实施方式的xml文件处理方法的代码截图。

图5示出了根据本发明实施方式的xml文件处理方法的代码截图。

图6示出了根据本发明实施方式的xml文件处理方法的代码截图。

图7示出了根据本发明实施方式的xml文件处理方法的代码截图。

图8示出了根据本发明实施方式的xml文件处理方法的代码截图。

图9示出了根据本发明实施方式的计算机设备的结构示意图。

具体实施方式

以下结合附图和具体实施方式对本发明的各个方面进行详细阐述。其中,众所周知的模块、单元及其相互之间的连接、链接、通信或操作没有示出或未作详细说明。并且,所描述的特征、架构或功能可在一个或一个以上实施方式中以任何方式组合。本领域技术人员应当理解,下述的各种实施方式只用于举例说明,而非用于限制本发明的保护范围。还可以容易理解,本文所述和附图所示的各实施方式中的模块或单元或处理方式可以按各种不同配置进行组合和设计。

参见图1,图1示出了根据本发明实施方式的xml文件处理方法的流程示意图,该方法可包括步骤s101、s102、s103、s104和s105,下面结合具体的实施例对上述步骤进行说明。

步骤s101,接收待压缩的xml报文和所述xml报文对应的交易服务编码。

在本发明的一些实施例中,待压缩的xml报文是报文字符串的形式,交易服务编码也可以是由字符和数字等组合的标识符,例如,a05811000。例如,在一种实施例中,交易服务编码为a05811000的xml交易报文可以是如图2所示的形式。

在一些实施例中,待压缩的xml报文是首次接到的该交易服务编码的报文。在另外一些实施例中,待压缩的xml报文是非首次(例如,第二次、第三次等)接到的该交易服务编码的报文。

步骤s102,将所述xml报文解析为xpath表达式和元素值,其中,所述xpath表达式为表示所述xml文件中节点路径的表达式。

在一些实施例中,xpath表达式是表示xml文件中节点路径的路径表达式,也可以称为xpath路径。例如,

<foo>

<bar/>

</foo>

该xml报文中的<bar>元素的xpath表达式为/foo/bar。

例如,对于xml报文:

<foo>

<bar>abc</bar>

<id>15</id>

</foo>

将该xml报文通过解析器进行解析后生成xpath表达式和元素值,对于存在多个xpath和元素值的情形,对每个xpath表达式和元素值进行编号,一个xpath表达式对应一个编号,编号可以采用阿拉伯数字:

步骤s103,查询是否存在与所接收的交易服务编码匹配的报文压缩模板。

在一些实施例中,步骤s103可包括:在内存中查询是否存在与所接收的交易服务编码匹配的报文压缩模板。报文压缩模板可以是应用数据库中的数据库表,包括下述字段:交易服务编码、xpath表达式、xpath编号和元素值等。例如,对于上面描述的交易服务编码a05811000,在内存中查询是否存在与本次接收到的交易服务编码a05811000相同的报文压缩模板。若存在,说明本次接收的交易报文不是首次接收到的报文,在本次报文之前,已经有该交易服务编码的xml报文被处理,则执行步骤s104。若不存在,则可以在数据库中查到是否存在与所接收的交易服务编码匹配的报文压缩模板,若存在,则将在数据库中查找到的该交易服务编码的报文压缩模板保存到内存,并执行步骤s104,若未查找到,则执行步骤s105。

s104,根据预定压缩规则生成压缩字符串,并在所述解析出的xpath表达式与匹配的报文压缩模板中的xpath表达式不相同时,更新所述数据库中的报文压缩模板表。

如上所述,在查找到该交易服务编码匹配的报文压缩模板后,根据预定的压缩规则生成压缩字符串,例如,可以根据匹配的报文压缩模板将解析出的xpath表达式替换为xpath编码。以下述的例子为例:

可压缩为如下形式:

1=abc$n2=15

即:编号=元素值$n编号=元素值$n编号=元素值......

其中$n为根据系统报文特点自定义的分隔符,用于分隔每个xpath编号及其对应元素值。

如上所述,在一些实施例中,xml报文可解析出包含多个xpath表达式及其元素值的列表,列表中的一些xpath表达式可以与报文压缩模板中的xpath表达式相同,而另外一些xpath表达式与模板中的xpath表达式不同,对于不同的xpath表达式,需要更新数据库中的报文压缩模板表,具体而言,可包括:在数据库的报文压缩模板表中增加解析出的与模板中的xpath表达式不同的xpath表达式,并将所述不同的xpath表达式对应的xpath编码增加。在一些实施例中,不同的xpath表达式为一个,那么在这种情况下,xpath编码在原来模板列表的基础上加1。在另外一些实施例中,不同xpath表达式为多个,在这种情况下,xpath编码在原来模板列表的基础上增加多个。例如,报文压缩模板中已经存储有下列信息:

后续又收到了交易服务编码为a05811000的xml,如图3所示。报文中除了的xpath表达式多了一个/tx/dd,其他没有编码(元素值变化无需考虑),那么在报文压缩模板中增加:

交易编号xpath编号xpath表达式元素值

a058110004/tx/ddabc4

本发明实施例,对于同一交易服务编码,每次遇到不同的xpath路径表达式,均保存到该交易服务编码的报文压缩模板,利用同一交易对应报文差别较小的特点,确保每个交易对应的压缩模板不会无限扩展,同时也保证模板包含了压缩过的报文对应路径的全集。

在本发明的一些实施例中,将更新的报文压缩模板保存到数据库和内存,例如,可以将报文压缩模板同时保存到数据库和内存。在一些实施例中,可以将报文压缩模板仅保存到数据库。将报文压缩模板在内存中备份,可以避免通过多次数据库读取来获得报文压缩模板,再次使用报文压缩模板时可以直接在内存中读取,在大量报文模板的场景下,提高了报文压缩模板的读取效率。在报文压缩模板的读取中,优先查找内存中的报文压缩模板,内存中没有找到模板的情形下,在数据库中查找,在数据库中还是找不到的情况,作为新模板数据保存。

s105,将所接收的交易服务编码和解析出的xpath表达式和元素值存储到数据库作为报文压缩模板,根据预定压缩规则生成压缩字符串。

在一些实施例中,在数据库中查找不到该交易服务编码对应的报文压缩模板时,将本次解析得到的一个或多个xpath表达式和元素值按照顺序编码存储到数据库作为该交易服务编码的报文压缩模板,同时还可以在内存备份该交易服务编码的报文压缩模板,方便下次需要获取报文压缩模板时快速地获取报文压缩模板。

在将本次解析得到的xpath表达式和元素值保存到报文压缩模板之后,根据预定压缩规则生成压缩字符串,具体而言,将解析出的xpath表达式替换为xpath编码,而得到更少字符表达的xml的报文信息。

在本发明的一些实施例中,对于xml报文中出现的重复的xpath路径表达式,需要对其进行区分才能保证解压缩后的报文与原始报文一致,处理方式为对重复路径作编号处理,例如:

<foo>

<bar>abc1</bar>

<bar>abc2</bar>

<bar>abc3</bar>

</foo>

其xpath表达式为/foo/bar,/foo/bar@@1,/foo/bar@@2三个,即对重复路径加@@后顺序编号处理。对于以上报文,其对应压缩模板为:

需要说明的是,@@仅是用于举例说明的分割符号,在其他实施例中,本领域技术人员可以选择其他的分割符号。

在一些实施例中,xml报文中有些属性元素存在类型,例如<list1type="g">,此时作如下处理:将xpath路径中该元素的名称前加#type="g"#,即该元素名称变为:#type="g"#list1,解压缩的时候再将元素类型解压出来从而达到无损报文的目的。在已知系统报文中元素类型比较单一的情形下,可以直接用特殊符号标记即可,如#list1。

在一些实施例中,报文中存在cdata形式的元素值,则在解析的xpath表达式中利用预定的特殊符号(例如,#list1)标记,解压时对特殊符号特殊处理即可。图4给出了java程序判断报文是否存在cdata形式元素的示例代码(采用dom4j的api)。

在本发明的一些实施例中,报文压缩模板是采用java的hashmap数据结构,其中,hashmap的key用于存储交易服务编码,value为对象数组。其中,对象数组可存储有两个数据结构对象,所述两个数据结构对象同时保存了交易服务编码对应的的xpath表达式和元素值列表集合。两个数据结构对象为hashmap和arraylist。模板数据的具体保存可以采用如下的伪代码:

hashmap<xpath路径,string[xpath路径编号,元素值]>()

arraylist<string[xpath路径,xpath路径编号,元素值]>()

利用两种数据结构保存相同集合数据,能够同时获得hashmap的搜索查询的高效性以及arraylist的顺序遍历的高效性,当认为可以顺序遍历时优先使用arraylist顺序遍历,当只能通过查询方式获得数据时使用hashmap的查询功能。

在另外一些实施例中,可以仅采用hashmap一种数据结构即可。

在本发明的一些实施例中,对于xml报文中解析出的xpath表达式和元素值列表与匹配的报文压缩模板中的xpath表达式和元素值列表存在多个连续相同的情形,采用所述匹配的报文压缩模板中所述多个连续相同的xpath表达式对应的xpath编码的起始编码和结束编码进行表示。也就是说,当被压缩报文字对应xpath路径列表中存在连续与模板中对应xpath路径及元素值相同的情况,则将此连续部分进一步压缩为连续部分对应的起始编号加结束编号。例如,

对于交易编号为a05811000的xml报文为图3所示。

压缩后的字符串表示为:1-4

其中"-"为分隔符,其两边的数字表示模板对应的起始位置和终止位置,1-4表示此报文与模板中xpath编号从1到4的连续数据对应相同(包括xpath路径和元素值都相同),同样对于压缩后字符串:

1=aa$n2-30$n31=bb

其可分解为:

1=aa

2-30

31=bb

其解压缩含义为:取模板中编号为1的xpath,将其对应节点元素值赋值aa,然后去模板中编号从第2到30的xpath及其对应元素值,然后取模板中编号为31的xpath,将其对应节点元素值赋值bb,之后将以上xpath列表还原为xml文档即为压缩前原报文。

本发明实施例通过对压缩报文中与模板中的对应xpath部分和元素值连续相同的部分,进行进一步的压缩,能够进一步提高压缩的效率。

在本发明的一些实施例中,使用java的同步锁关键字synchronized对需要同步的部分代码块加锁的方式实现多线程支持。在线程并发状态下,有两处可能出现不安全情况:第一处为使用hashmap保存模板,java的hashmap为线程不安全的,使用其保存模板数据时需要加同步锁,伪代码如下:

synchronized(全局锁变量){

模板map.put(交易编号,交易编号对应模板数据);

}

这里在put方法上直接加锁,而不是将提取模板数据的get方法直接加锁,而是采用如下策略:若get出的模板包含当前待压缩报文xpath的全集,则直接利用此模板进行压缩,若取得的模板不包含待压缩报文xpath的全集或没有取到模板,则无法直接进行压缩,此时对程序加锁后再一次尝试提取模板,若取到模板则利用此模板进行压缩。此策略在不影响程序并发同步的基础上提升了并发度,提高了报文的处理速度。需要同步的第二处为涉及到数据库存取操作的代码块,即当内存中没有找到模板数据时,需要查询数据库,同时若数据库也没有找到时则保存入数据库,同步锁伪代码如下:

synchronized(交易编号){

数据库操作相关代码

}

此处将交易编号作为锁变量达到局部锁的效果,即只针对同一个交易编号实现同步,多个交易编号对应报文仍然可以并发执行,此策略基于不同交易编号对应的压缩模板互不影响的特点,提升了报文压缩的并发程度。

本发明实施例提供的方法,在开发程序考虑多线程调用的问题,在可能存在调用冲突的地方加了锁,确保多线程安全并发调用。

在一些实施例中,本发明的方法还可包括:将压缩字符串利用gzip压缩算法进行二次压缩,从而进一步提高xml报文的压缩效率。解压时首先利用gzip解压字符串,然后再进行还原xml文档树的过程,压缩和解压缩函数的主要代码如图5和图6所示。

在本发明的一种实施例中,xml报文的压缩过程如下:

1、压缩程序接受到调用者传入的待压缩报文的交易编号和报文字符串;

2、将报文字符串解析为xpath列表;

3、根据交易编号查找内存中是否存在对应压缩模板,若存在则进入第6步,不存在则进行下一步;

4、查找数据库中是否存在该交易编号对应压缩模板,若存在则调入内存并进入第6步,不存在则进行下一步;

5、将第2步解析出来的xpath列表保存入数据库和内存,根据压缩规则生成压缩字符串,进入第7步;

6、逐条扫描第2步解析出来的xpath列表,找到压缩模板中与之相同的xpath的对应编号,根据压缩规则(编号替换xpath)生成压缩字符串,此过程中若发现xpath列表中存在模板中没有的xpath,则将其编号设置为当前模板编号最大值加一,并将xpath和编号及元素值一同保存入数据库和内存;

7、调用gzip压缩接口,将压缩字符串用gzip进行二次压缩后返回给调用者。

解压缩程序的基本流程为:

1、解压缩程序接受到调用者传入的待解压报文的交易编号和报文字符串;

2、通过调用gzip接口将报文字符串进行解压后传入下一步;

3、根据交易编号查找内存中是否存在对应压缩模板,若存在则进入第5步,不存在则进行下一步;

4、查找数据库中是否存在该交易编号对应压缩模板,若存在则调入内存并进入第5步,不存在则报错处理;

5、将第2步解压出来的字符串根据分隔符分隔并逐条扫描,找到压缩模板中与之对应的xpath编号,将该编号对应的xpath提取出来,所有xpath都提取完成后进入下一步;

6、逐条处理上一步获得的xpath及对应的元素值,根据xml文档树还原规则将xpath列表还原为xml文档树;

7、将还原的文档树转换为字符串后返回给调用者

在本发明的一种实施例中,xml报文的解析方法包括:

采用递归方式的深度优先搜索遍历xml文档树,获取每个叶子节点的xpath及其对应值。伪代码如下:

解析之前需要先获取文档树根节点,函数代码如图7所示。

对于反解析过程,即将xpath列表生成一个xml文档的过程比较复杂,基本方法如下:

1、将第一条被解析的xpath的第一个节点作为根节点,并将其后继所有节点依次加入文档树中;

2、从第二条xpath开始循环执行以下过程:对比并找到本条xpath中包含的一个节点,此节点与上一条xpath相同位置的节点不同但该节点的前一节点即父节点与该父节点对应上一条xpath中相同位置的节点相同,将此节点及其之后的节点加入到xml文档树的对应父节点下。

下面以一个简单例子说明以上过程:

对以下xpath列表:

tx/aa/bb

tx/aa/cc/dd

第一步将tx加入文档树作为根节点,aa作为tx的子节点加入树中,bb作为aa的字节点加入树中,此时完成了第一条xpath的还原过程。遍历第二条xpath,发现节点cc与对应位置的bb节点不同但其父节点都是aa,则将cc作为aa的子节点加入树中,再将dd作为cc的字节点加入树中即完成了文档树的还原。

将还原后的文档树输出为字符串的伪代码如图8所示。

本发明实施方式还提供一种计算机设备。如图9所示,计算机设备900可包括存储器901和处理器902,其中,存储器901存储有计算机指令,处理器902配置为执行所述计算机指令以使计算机设备900实现上面所述的方法。

本发明实施方式还提供计算机可读的存储介质,其上存储有计算机指令,所述计算机指令被处理器执行时实现上面所述的方法。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本发明可借助软件结合硬件平台的方式来实现。基于这样的理解,本发明的技术方案对背景技术做出贡献的全部或者部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如rom/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,智能手机或者网络设备等)执行本发明各个实施例或者实施例的某些部分所述的方法。

本发明说明书中使用的术语和措辞仅仅为了举例说明,并不意味构成限定。本领域技术人员应当理解,在不脱离所公开的实施方式的基本原理的前提下,对上述实施方式中的各细节可进行各种变化。因此,本发明的范围只由权利要求确定,在权利要求中,除非另有说明,所有的术语应按最宽泛合理的意思进行理解。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1