一种可扩展标记语言XML数据的解析方法和装置与流程

文档序号:12363059阅读:214来源:国知局
一种可扩展标记语言XML数据的解析方法和装置与流程

本发明涉及互联网技术领域,尤其涉及一种可扩展标记语言(Extensible Markup Language,XML)数据的解析方法和装置。



背景技术:

可扩展标记语言(Extensible Markup Language,XML),标准通用标记语言的子集,一种用于标记电子文件使其具有结构性的标记语言。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。它非常适合因特网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。XML以其自身的特点成为系统之间数据信息交换的标准。

在Java(计算机编程语言)的语言环境下,现有的XML数据解析技术主要有JDOM和DOM4J等等。

具体来说,在采用JDOM方法解析XML数据时,解析器SAX执行的具体解析流程为:将XML数据中的全部字符串转换为文档模型对象(document),即DOM树形结构;然后对转换后的文档模型对象进行顺序扫描及遍历操作,最终得到对应的业务对象,例如元素或元素属性值。在SAX解析文档模型对象过程中,遇到文档模型对象的开始与结束,元素的开始与结束的地方都会触发一系列的事件处理函数,由这些函数来完成相应的操作。

在采用DOM4J方法解析XML报文时,具体解析流程与JDOM方法类似,与之不同的是,在DOM4J方法中,大量使用了应用程序编程接口(Application Programming Interface,API)中的Collections类,并且还提供了一些替代方法以获取更好的解析性能或更直接的编码方式,可在很多开源项目中使用,例如Hibernate。

从上述两种解析流程中可以看出,不管采用哪种解析流程,均需要首先将XML数据中所有字符串转换为文档模型对象,并存储在内存中,然后如果想得到需要的业务对象,还需要定制开发转换程序,将文档模型对象逐个映射到业务对象上。这种方法存在下述缺陷:

首先,转换得到的文档模型对象需要占用内存,而且XML数据越大,占用的内存越多,存在内存溢出的风险;其次,在XML数据比较大的情况下,采用上述解析方法会使解析性能严重降低,耗时会呈指数式上升;最后,定制开发转换程序需要耗费宝贵的人力资源,而且开发的质量也无法完全保证。



技术实现要素:

本发明实施例提供一种XML数据的解析方法和装置,能够将XML数据直接转换为业务对象,明显提高解析性能。

本发明实施例采用以下技术方案:

本发明实施例提供了一种XML数据的解析方法,包括:

确定待解析的XML数据的文档对象类型;

从预先存储的节点配置信息中,获取与所述文档对象类型对应的节点配置信息;其中,所述节点配置信息中包含:节点特征数据和节点的数据类型;

对所述XML数据中的每行数据依次执行下述操作,直至解析完所述XML数据:

根据所述节点配置信息中包含的节点特征数据和节点的数据类型,确定当前行数据对应的节点和所述节点的数据类型;

根据所述节点的数据类型,对所述节点进行解析,得到所述节点的业务对象;

当所述节点不是所述XML数据中的根节点时,将得到的业务对象赋值给所述节点的父节点的业务对象。

其中,根据所述节点的数据类型,对所述节点进行解析,得到所述节点的 业务对象;

当所述节点的数据类型为原始类型时,获取所述节点的原始类型值,作为为所述节点的业务对象;

当所述节点的数据类型为对象类型时,为所述节点创建新的业务对象,作为所述节点的业务对象。

其中,确定待解析的XML数据的文档对象类型,具体包括:

判断所述XML数据中是否携带文档对象类型;

当判断出所述XML数据中携带了文档对象类型时,将所述XML数据携带的文档对象类型确定为所述XML数据的文档对象类型;

当判断出所述XML数据中未携带文档对象类型时,将所述XML数据的根节点的节点名称确定为所述XML数据的文档对象类型。

其中,将所述XML数据的根节点的节点名称确定为所述XML数据的文档对象类型,具体包括:

确定所述XML数据中的根节点;其中所述根节点为所述XML数据中第一个包含开始标记和结束标记的节点;

将所述XML数据的根节点的节点名称确定为所述XML数据的文档对象类型。

其中,确定待解析的XML数据的文档对象类型之前,所述方法还包括:

从配置库中读取预先存储的节点配置信息;

将读取的节点配置信息按照其对应的文档对象类型存储在缓存中;则

从预先存储的节点配置信息中,获取与所述文档对象类型对应的节点配置信息,具体包括:

从预先存储在缓存中的节点配置信息中,获取与所述文档对象类型对应的节点配置信息。

本发明实施例提供了一种XML数据的解析装置,包括:

文档对象类型确定单元,用于确定待解析的XML数据的文档对象类型;

节点配置信息获取单元,用于从预先存储的节点配置信息中,获取与所述文档对象类型确定单元确定的文档对象类型对应的节点配置信息;其中,所述节点配置信息中包含:节点特征数据和节点的数据类型;

解析单元,用于对所述XML数据中的每行数据依次执行下述操作,直至解析完所述XML数据:

根据所述节点配置信息获取单元获取的节点配置信息中包含的节点特征数据和节点的数据类型,确定当前行数据对应的节点和所述节点的数据类型;根据所述节点的数据类型,对所述节点进行解析,得到所述节点的业务对象;当所述节点不是所述XML数据中的根节点时,将得到的业务对象赋值给所述节点的父节点的业务对象。

其中,所述解析单元,具体用于:

当所述节点的数据类型为原始类型时,获取所述节点的原始类型值,作为为所述节点的业务对象;

当所述节点的数据类型为对象类型时,为所述节点创建新的业务对象,作为所述节点的业务对象。

其中,所述文档对象类型确定单元,具体包括:

判断模块,用于判断所述XML数据中是否携带文档对象类型;

第一判断结果模块,用于当所述判断单元判断出所述XML数据中携带了文档对象类型时,将所述XML数据携带的文档对象类型确定为所述XML数据的文档对象类型;

第二判断结果模块,用于当所述判断模块判断出所述XML数据中未携带文档对象类型时,将所述XML数据的根节点的节点名称确定为所述XML数据的文档对象类型。

其中,所述第二判断结果模块,具体用于:

确定所述XML数据中的根节点;其中所述根节点为所述XML数据中第一个包含开始标记和结束标记的节点;将所述XML数据的根节点的节点名称 确定为所述XML数据的文档对象类型。

其中,所述装置还包括:

读取单元,用于从配置库中读取预先存储的节点配置信息;

缓存单元,用于将所述读取单元读取的节点配置信息按照其对应的文档对象类型存储在缓存中;则

所述节点配置信息获取单元,具体用于:

从所述缓存单元预先存储在缓存中的节点配置信息中,获取与所述文档对象类型对应的节点配置信息。

本发明实施例的有益效果如下:

本发明实施例中,通过确定待解析的XML数据的文档对象类型,根据预先存储的文档对象类型与节点配置信息的对应关系,获取与确定的文档对象类型对应的节点配置信息,再根据获取的节点配置信息中包含的节点特征数据和节点的数据类型,以及将除根节点以外的其它节点的业务对象赋值给其父节点的业务对象的方式,实现对待解析的XML数据的解析,与现有技术相比,能够将XML数据直接转换为业务对象,避免了传统XML解析时需要构建文档模型对象作为中间结果从而容易造成内存溢出的风险,并解决了在解析超大XML数据时的性能瓶颈,降低了系统内存和CPU的开销,使解析性能明显提升。

本发明的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过在所写的说明书、权利要求书、以及附图中所特别指出的结构来实现和获得。

附图说明

此处所说明的附图用来提供对本发明的进一步理解,构成本发明的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不 当限定。在附图中:

图1为本发明实施例提供的一种XML数据的解析方法的实现流程图;

图2为本发明实施例提供的流式解析的轻量化XML解析框架的结构示意图;

图3为本发明实施例提供的节点配置信息加载流程图;

图4为本发明实施例提供的特征提取流程图;

图5为本发明实施例提供的数据解析流程图;

图6为本发明实施例提供的XML数据的解析装置的结构示意图。

具体实施方式

为了解决现有技术中存在的问题,本发明实施例提供了一种XML数据的解析方案。该技术方案中,通过确定待解析的XML数据的文档对象类型,根据预先存储的文档对象类型与节点配置信息的对应关系,获取与确定的文档对象类型对应的节点配置信息,再根据获取的节点配置信息中包含的节点特征数据和节点的数据类型,以及将除根节点以外的其它节点的业务对象赋值给其父节点的业务对象的方式,实现对待解析的XML数据的解析,与现有技术相比,能够将XML数据直接转换为业务对象,避免了传统XML解析时需要构建文档模型对象作为中间结果从而容易造成内存溢出的风险,并解决了在解析超大XML数据时的性能瓶颈,降低了系统内存和CPU的开销,使解析性能明显提升。

以下结合说明书附图对本发明的实施例进行说明,应当理解,此处所描述的实施例仅用于说明和解释本发明,并不用于限制本发明。并且在不冲突的情况下,本发明中的实施例及实施例的特征可以互相结合。

本发明实施例提供了一种XML数据的解析方法,如图1所示,为该方法的实现流程图,具体包括下述步骤:

步骤11,确定待解析的XML数据的文档对象类型。

一般来说,待解析的XML数据会指定自身的文档对象类型,如果该待解析的XML数据没有指定自身的文档对象类型,那么可以根据XML数据的格式确定XML数据中的根节点,并将根节点的节点名称确定为XML数据的文档对象类型。其中,XML数据的根节点为XML数据中第一个包含开始标记和结束标记的节点。

步骤12,从预先存储的节点配置信息中,获取与XML数据的文档对象类型对应的节点配置信息;其中,节点配置信息中包含:节点特征数据和节点的数据类型。

本发明实施例中,节点配置信息中包含的节点特征数据用于识别XML数据中的节点,其可以但不限于包括:节点名称、节点的开始标记、节点的结束标记、节点的父节点和节点描述信息等等。

节点配置信息中包含的节点的数据类型用于决定节点的具体解析方式,包括原始类型和对象类型,其中XML数据中的节点在解析时统一作为原始类型处理,只有在当前节点是其它一个或多个节点的父节点时,才将该节点作为对象类型处理。

其中,节点配置信息可以预先存储在配置库中。在执行步骤12时,可以从预先存储在配置库中的节点配置信息中,获取与XML数据的文档对象类型对应的节点配置信息。但是这种方式会导致节点配置信息的读取效率过低。

因此,本发明实施例中,为了可以提高获取节点配置信息的读取效率,可以在系统启动时(即步骤11之前)自动加载配置库中的节点配置信息,并按照其对应的文档对象类型存储至缓存中,使得当确定了XML数据的文档对象类型之后,可以直接根据文档对象类型,从预先存储在缓存中的节点配置信息中,获取相应的节点配置信息,从而提高了节点配置信息的读取效率。

步骤13,对该XML数据中的每行数据依次执行下述操作,直至解析完该XML数据:

根据获取的节点配置信息中包含的节点特征数据和节点的数据类型,确定 当前行数据对应的节点和该节点的数据类型;

根据该节点的数据类型,对该节点进行解析,得到该节点的业务对象;

具体的,当该节点的数据类型为原始类型时,获取该节点的原始类型值,作为为该节点的业务对象;

当该节点的数据类型为对象类型时,为该节点创建新的业务对象,作为该节点的业务对象。

当该节点不是XML数据中的根节点时,将得到的业务对象赋值给该节点的父节点的业务对象。

本发明实施例中,通过确定待解析的XML数据的文档对象类型,根据预先存储的文档对象类型与节点配置信息的对应关系,获取与确定的文档对象类型对应的节点配置信息,再根据获取的节点配置信息中包含的节点特征数据和节点的数据类型,以及将除根节点以外的其它节点的业务对象赋值给其父节点的业务对象的方式,实现对待解析的XML数据的解析,与现有技术相比,能够将XML数据直接转换为业务对象,避免了传统XML解析时需要构建文档模型对象作为中间结果从而容易造成内存溢出的风险,并解决了在解析超大XML数据时的性能瓶颈,降低了系统内存和CPU的开销,使解析性能明显提升。

本发明实施例提供的XML解析方法可以但不限于应用在交易系统中。

为了更好的理解本发明实施例,以下结合具体的实施对本发明实施例的具体实施过程进行说明。

在交易系统中,XML数据的主要目的是进行系统间的信息交换。交易系统中的XML数据还有一个比较鲜明的特点,就是节点类型基本都是元素,基本没有属性类型。XML数据以其自身的特点非常适合包装需要交换的数据,同时在交易系统中用户基本不会关心其结构化的文档模型对象,用户所关注的是其承载的数据。因此,在交易系统中用作系统间数据传输的XML数据一般具有如下特点:层次清楚,结构分明,系统生成,自动赋值。

根据上述XML数据的特点,本发明实施例设计了一个流式解析的轻量化XML解析框架,其结构如下图2所示。其中:

1、配置库

主要用于保存节点配置信息。

其中,一个节点对应一条节点配置信息,一条典型的节点配置信息可以包括如下属性:

1)文档对象类型,用于标识一组属性同属于一个待解析的XML数据;

2)节点名称,XML数据中节点与Java的业务对象绑定的纽带,通过反射与动态代理机制把节点名称赋值给Java的业务对象;

3)节点描述信息;

4)节点类型,元素或属性;

5)节点顺序,节点在XML数据中的顺序;

6)父节点,当前节点的上一级节点,一般是对象类型;父节点为空则为根节点。

7)开始标记,标识节点开始的特征字符;

8)结束标记,标识节点结束的特征字符;

9)数据类型,节点对应的Java数据类型,分原始类型与对象类型两种;字符串因其特殊性在处理时也作为原始类型看待;

10)是否复数,如果节点在同一个父节点下多次出现,认为其是复数形式,在父节点中会以数组保存;

11)是否为根节点。

2、配置管理模块

在系统启动时自动加载配置库中的节点配置信息,并按照文档对象类型把配置库整理为一个个独立的单元并放到缓存中管理。当解析时需要用到节点配置信息时,直接根据文档对象类型到缓存中读取对应的节点配置信息,避免每次都去读取配置库,从而提高加载节点配置信息的效率。

3、特征提取模块

当接收的XML数据没有指定文档对象类型时,根据XML格式特点自动提取根节点的节点名称,并根据根节点的节点名称自动加载对应的节点配置信息。

4、数据解析模块

该模块是整个解析框架的关键部分,它以流式顺序解析XML数据中的内容。首先根据根节点生成业务对象,然后把解析到的其它节点按照其数据类型,以反射与动态代理的方式把它们的业务对象赋值给它们的父节点的业务对象。

5、对象生成模块

把解析到的所有业务对象以数组的形式返回给调用者。

在上述解析框架的基础上,下面分别对节点配置信息加载流程、特征提取流程和XML数据解析流程进行介绍。

如图3所示,为节点配置信息加载流程图。具体流程包括:

步骤31,在系统启动时,首先获取配置路径;

步骤32,根据获取的配置路径从配置库中读取所有的节点配置信息;

步骤33,对读取的所有的节点配置信息进行整理,将节点配置信息按照文档对象类型整理成一个个独立单元;

步骤34,将每个独立单元以文档对象类型为键值存储在缓存中。

如图4所示,为特征提取流程图。具体流程包括:

步骤41,判断XML数据是否携带文档对象类型;如果该XML数据携带文档对象类型,则执行步骤45;如果该XML数据未携带文档对象类型,则执行步骤42。

步骤42,确定XML数据中第一个包含开始标记和结束标记的节点。

具体的,确定过程可以采用排除法,首先去掉空串,排除XML数据中的头信息,架构信息等。当找到第一个包含开始标记和结束标记的节点时,即认为其是根节点。

步骤43,确定该节点的节点名称。

步骤44,将该节点的节点名称确定为XML数据的文档对象类型。

步骤45,将其携带的文档对象类型确定为该XML数据的文档对象类型。

如图5所示,为数据解析流程图。具体流程包括:

步骤51,确定待解析的XML数据的文档对象类型;

步骤52,从预先存储在缓存中的节点配置信息中,获取与确定的文档对象类型对应的节点配置信息;

步骤53,读取XML数据行;

步骤54,将获取的节点配置信息与读取的XML数据行进行匹配,直至确定出与读取的XML数据行匹配的节点配置信息,确定读取的XML数据行对应的节点和该节点的数据类型;当节点的数据类型为原始类型时,执行步骤55,当节点的数据类型为对象类型时,执行步骤56。

步骤55,获取该节点的原始类型值,作为为该节点的业务对象;

步骤56,为该节点创建新的业务对象,作为该节点的业务对象;

具体的,可以根据该节点的节点名称为该节点创建新的业务对象,作为该节点的业务对象。

步骤57,判断该节点是否为XML数据的根节点;如果该节点为XML数据的根节点,则执行步骤58,如果该节点不为XML数据的根节点,则执行步骤59。

步骤58,将该节点的业务对象添加到数组中;

步骤59,将该节点的业务对象赋值给该节点的父节点的业务对象;

步骤510,判断是否解析完该XML数据,如果没有解析完该XML数据,则返回继续执行步骤53,如果解析完该XML数据,则执行步骤511。

步骤511,将解析结果返回。

本发明实施例中,通过确定待解析的XML数据的文档对象类型,根据预先存储的文档对象类型与节点配置信息的对应关系,获取与确定的文档对象类 型对应的节点配置信息,再根据获取的节点配置信息中包含的节点特征数据和节点的数据类型,以及将除根节点以外的其它节点的业务对象赋值给其父节点的业务对象的方式,实现对待解析的XML数据的解析,与现有技术相比,能够将XML数据直接转换为业务对象,避免了传统XML解析时需要构建文档模型对象作为中间结果从而容易造成内存溢出的风险,并解决了在解析超大XML数据时的性能瓶颈,降低了系统内存和CPU的开销,使解析性能明显提升。

基于同一发明构思,本发明实施例中还提供了一种XML数据的解析装置,由于上述装置解决问题的原理与XML数据的解析方法相似,因此上述装置的实施可以参见方法的实施,重复之处不再赘述。

如图6所示,为本发明实施例提供的XML数据的解析装置的结构示意图,包括:

文档对象类型确定单元61,用于确定待解析的XML数据的文档对象类型;

节点配置信息获取单元62,用于从预先存储的节点配置信息中,获取与所述文档对象类型确定单元61确定的文档对象类型对应的节点配置信息;其中,所述节点配置信息中包含:节点特征数据和节点的数据类型;

解析单元63,用于对所述XML数据中的每行数据依次执行下述操作,直至解析完所述XML数据:

根据所述节点配置信息获取单元62获取的节点配置信息中包含的节点特征数据和节点的数据类型,确定当前行数据对应的节点和所述节点的数据类型;根据所述节点的数据类型,对所述节点进行解析,得到所述节点的业务对象;当所述节点不是所述XML数据中的根节点时,将得到的业务对象赋值给所述节点的父节点的业务对象。

其中,所述解析单元63,具体用于:

当所述节点的数据类型为原始类型时,获取所述节点的原始类型值,作为为所述节点的业务对象;

当所述节点的数据类型为对象类型时,为所述节点创建新的业务对象,作为所述节点的业务对象。

其中,所述文档对象类型确定单元61,具体包括:

判断模块611,用于判断所述XML数据中是否携带文档对象类型;

第一判断结果模块612,用于当所述判断单元611判断出所述XML数据中携带了文档对象类型时,将所述XML数据携带的文档对象类型确定为所述XML数据的文档对象类型;

第二判断结果模块613,用于当所述判断模块611判断出所述XML数据中未携带文档对象类型时,将所述XML数据的根节点的节点名称确定为所述XML数据的文档对象类型。

其中,所述第二判断结果模块613,具体用于:

确定所述XML数据中的根节点;其中所述根节点为所述XML数据中第一个包含开始标记和结束标记的节点;将所述XML数据的根节点的节点名称确定为所述XML数据的文档对象类型。

其中,所述装置还包括:

读取单元64,用于从配置库中读取预先存储的节点配置信息;

缓存单元65,用于将所述读取单元64读取的节点配置信息按照其对应的文档对象类型存储在缓存中;则

所述节点配置信息获取单元62,具体用于:

从所述缓存单元65预先存储在缓存中的节点配置信息中,获取与所述文档对象类型对应的节点配置信息。

为了描述的方便,以上各部分按照功能划分为各模块(或单元)分别描述。当然,在实施本发明时可以把各模块(或单元)的功能在同一个或多个软件或硬件中实现。

本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结 合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。

本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。

显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

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