一种利用XML内存树实现多种文件兼容的方法
技术领域
本发明属于计算机印刷排版技术领域,具体涉及一种利用XML内存树实现多种文件兼容的方法。
背景技术
随着计算机软件的发展,许多的软件都不可避免的进行不断的升级,有些是一些对文件结构影响不大的变更,有些却是根本的变化。由于软件升级过程中需要兼容早期版本制作的文件。所谓文件兼容,是指使用当前程序能够打开第三方程序或者该程序早期版本制作的文件,以保障用户对已有资源的可重用性。
目前的文件兼容的方法主要是:基于二进制流进行文件兼容的,通过对二进制格式进行解析直接生成新格式的文档。如果需要对多种文件进行兼容则需要多个解析模块,并且包含类似的转换代码。
发明内容
针对现有技术中存在的缺陷,本发明的目的是提供一种可以方便地对多种文档结构进行兼容,同时也能够实现低版本程序对高版本程序制作的文件的进行兼容的方法。
为达到以上目的,本发明采用的技术方案是:一种利用XML内存树实现多种文件兼容的方法,包括如下步骤:
(1)针对当前程序中所有需要保存的数据内容定义一个完整Schema,首先需要分析当前程序中所有需要存储到文档中的数据,按照程序中数据的层次结构定义具有相同层次结构的Schema,以DocRoot节点作为文档的根节点,对于程序中复杂的数据定义为Schema中的一个节点,对于程序中简单的数据定义为Schema中的节点的属性,另外还需要结合数据的语义来最终确定程序中的数据是作为Schema中的节点还是属性;
(2)按照步骤(1)中得到Schema定义一系列的数据结构,即对于Schema中的每一个节点定义一个数据结构,对于所有的属性都定义到相应数据结构中的成员变量;
(3)将需要兼容的文件转换成步骤(2)中的数据结构,形成树型数据结构即XML内存树结构;
(4)将步骤(3)中生成的XML内存树结构导入到当前程序中,从而实现文件的兼容。
进一步,步骤(3)中,如果要兼容Office文件,则利用微软提供的API函数把Office文档中的各个部分转换生成步骤(2)中的各个数据结构,同时将各个对象挂接到各自所属的父节点之下,形成一棵XML内存树结构。
进一步,步骤(3)中,如果要兼容早期版本的历史文件,则先把这种历史文件按照自己的数据格式直接输出一个XML文件,然后通过DOM和XSLT技术把这个XML文件转换成符合步骤(1)中要求的标准XML文件,最后再通过步骤(2)中各个数据结构的解析器解析代码,生成对应的XML内存树结构。
进一步,步骤(3)中,如果要实现低版本程序兼容高版本程序制作的XML文件,则直接读入该XML文件,然后通过步骤(2)中各个数据结构的解析器解析代码,生成对应的XML内存树结构。
进一步,步骤(4)中,将XML内存树结构导入到当前程序中的方法包括以下步骤:
首先,针对文件的每个部分构建一个导入引擎ImportEngine,所述的导入引擎ImportEngine一方面要导入对应节点的属性,另一方面还要完成其子节点的导入,如果子节点是简单节点就直接导入,如果是复杂节点,就需要调用该子节点的导入引擎;
然后,从根节点DocRoot开始调用DocRoot的导入引擎DocRootImportEngine的Import()函数,该函数中首先完成该节点的属性导入,然后调用ImportChildren(),实现导入引擎的递归调用;
最后,各个节点的Import()函数,主要是完成程序中与该节点对应的对象的创建及其属性的设置,同时需要设置好新创建的对象与其父对象的关联关系,然后就是调用ImportChildren()函数从而实现整个文档数据的导入。
进一步,在实现低版本程序兼容高版本程序制作的文件的过程中,在进行步骤(2)之前先将高版本程序中的当前文档导出生成一个标准XML文件。
本发明的效果在于:采用本发明的方法,可以方便的对多种文档结构进行兼容,也能够实现低版本程序对高版本程序制作的文件的兼容,同时也最大程度的重用代码,对未来需要兼容新的第三方文件也具有良好的扩展性。
附图说明
图1是本发明所述具体实施方式中的数据流转示意图;
图2是一个XML Schema数据结构的简单示意图;
图3是本发明所述方法的流程图。
具体实施方式
下面结合附图及具体实施对本发明作进一步详细说明:
如图1和图3所示,一种利用XML内存树实现多种文件兼容的方法,包括如下步骤:
(1)针对当前程序中所有需要保存的数据内容(包括程序环境设置)定义一个完整Schema(步骤S31),这个Schema就是后续生成标准XML的规范。所谓完整就是要求对所有需要存储的数据定义到Schema中。
定义一个完整的Schema,首先需要分析当前程序中所有需要存储到文档中的数据,按照程序中数据的层次结构定义具有相同层次结构的Schema,以DocRoot节点作为文档的根节点,对于程序中复杂的数据定义为Schema中的一个节点,对于程序中简单的数据定义为Schema中的节点的属性,另外还需要结合数据的语义来最终确定程序中的数据是作为Schema中的节点还是属性。定义后的Schema的简单示意图如图2所示。
XML Schema是用来描述和约束XML文档的一种XML语言,从功能上看,它和早期的DTD是非常类似的,但是它比DTD的更加强大。
本实施例中,文档对象Cv_Doc是一个复杂数据类型,对应定义上述定义的Schema是以DocRoot节点作为文档的根节点,version是Cv_Doc的一个属性,对应定义为DocRoot节点的一个属性,Cv_Doc下一级是Cv_DocEnv、Cv_Article、Cv_Tables也是复杂节点,对应定义到DocRoot的子节点,依次类推定义一个完整的Schema。
(2)按照步骤(1)中得到Schema定义一系列的数据结构(步骤S32),参看图1中的“XML内存树结构”。
在面向对象的C++语言中,对于Schema中的每一个节点定义一个数据结构,对于所有的属性都定义到相应数据结构中的成员变量。利用设计模式中的Composite模式,对于Schema中的中间节点都应该从CompositeObject类派生,对于Schema中的叶子节点都应该从CompositeLeafObject派生。
示意代码如下:
(3)将需要兼容的文件转换成步骤(2)中的数据结构,形成树型数据结构(步骤S33),具体方法如下:
1)如果要兼容Office文件,则需要利用微软提供的API函数把Office文档中的各个部分转换生成步骤(2)中的各个数据结构。同时都需要挂接到各自所属的父节点之下,形成一棵XML内存树。参看图1中“Office文档”到“FantArt XML文件”的步骤。
2)如果要兼容早期版本的历史文件,由于格式很可能跟现在版本的数据结构相差甚大。所以应该先把这种历史文件按照自己的数据格式直接输出一个XML文件,然后通过DOM和XSLT技术把这个XML文件转换成符合步骤(1)中要求的标准XML文件,最后再通过步骤(2)中各个数据结构的Parser(解析器)解析代码,生成对应的XML内存树。参看图1中“老飞腾文档”到“XML文件”再到“FantArt XML文件”的步骤。
3)如果是要实现低版本程序兼容高版本程序制作的文件,因为高版本的程序存储的兼容格式已经是基于标准XML扩展的XML文件,这时就可以直接Load该XML文件,然后通过步骤(2)中各个数据结构的Parser(解析器)解析代码,生成对应的XML内存树,在这个过程中可能会丢失一些扩展的属性,但是已经能够完成低版本程序兼容高版本程序制作的文件的要求。参看图1中“兼容格式文档”到“FantArt XML文件”的步骤。
(4)将步骤(3)中生成的XML内存树导入到当前程序中,从而实现文件的兼容并能够展现给客户(步骤S34),参看图1中“XML内存树结构”到“FantArt对象”步骤。具体方法如下:
1)这个模块会复杂一些,需要从总体上把握整个文档结构,把文档分解为几个大的部分,比如排版软件——飞腾创意中:DocRoot代表整个文档结构,可以分解为DocEnv(文档参数)部分、Articles(文章、内容)部分、Tables(表格)部分等等。
2)针对文档的每个部分构建一个导入引擎——ImportEngine,一方面需要导入对应节点的属性(即实现其Import()函数),另一方面还需要完成其子节点的导入(即实现其ImportChildren()函数),如果子节点是简单就直接导入;如果是复杂节点,就需要调用该子节点的导入引擎。
示意代码如下:
3)从根节点DocRoot开始调用DocRoot的导入引擎——DocRootImportEngine的Import()函数,该函数中首先完成该节点的属性导入,然后调用ImportChildren(),实现导入引擎的递归调用。
4)各个节点的Import()函数,主要是完成程序中与该节点对应的对象的创建及其属性的设置,同时需要设置好新创建的对象与其父对象的关联关系。比如:排版软件——飞腾创意中:DocRoot的导入函数首先会创建一个文档,然后设置该文档的相关属性。然后就是依次调用DocEnv、Articles、Tables等等的导入引擎的Import()函数从而实现整个文档数据的导入。
(5)另外,在实现低版本程序兼容高版本程序制作的文件的过程中需要完成高版本程序另存为“兼容格式文档”的功能,其实就是把当前文档导出生成一个标准XML文件,参看图1中“FantArt对象”到“XML内存树结构”步骤。其实就是第(4)点中的各个部分另外需要实现一个跟导入引擎功能相反的导出引擎——ExportEngine。其内部实现的机理完全类似。所不同的是:导入引擎是完成XML内存树结构到文档对象的转换,而导出引擎刚好相反是完成文档对象到XML内存树结构的转换。然后这个XML内存树输出相应的XML文件。参看图1中“XML内存树”到“兼容格式文档”步骤。
示意代码如下:
本发明所述的方法并不限于具体实施方式中所述的实施例,本领域技术人员根据本发明的技术方案得出其他的实施方式,同样属于本发明的技术创新范围。