一种利用xml内存树实现多种文件兼容的方法

文档序号:6613703阅读:180来源:国知局
专利名称:一种利用xml内存树实现多种文件兼容的方法
技术领域
本发明属于计算机印刷排版技术领域,具体涉及一种利用XML内存树 实现多种文件兼容的方法。
背景技术
随着计算机软件的发展,许多的软件都不可避免的进行不断的升级, 有些是一些对文件结构影响不大的变更,有些却是根本的变化。由于软件 升级过程中需要兼容早期版本制作的文件。所谓文件兼容,是指使用当前 程序能够打开第三方程序或者该程序早期版本制作的文件,以保障用户对 已有资源的可重用性。
目前的文件兼容的方法主要是基于二进制流进行文件兼容的,通过 对二进制格式进行解析直接生成新格式的文档。如果需要对多种文件进行 兼容则需要多个解析模块,并且包含类似的转换代码。

发明内容
针对现有技术中存在的缺陷,本发明的目的是提供一种可以方便地对 多种文档结构进行兼容,同时也能够实现低版本程序对高版本程序制作的 文件的进行兼容的方法。
为达到以上目的,本发明采用的技术方案是 一种利用XML内存树实 现多种文件兼容的方法,包括如下步骤
(1 )针对当前程序中所有需要保存的数据内容定义一个完整Schema;
(2 )按照步骤(1 )中得到Schema定义一 系列的数据结构,即对于Schema 中的每一个节点定义一个数据结构,对于所有的属性都定义到相应数据结
构中的成员变量;
(3)将需要兼容的文件转换成步骤(2)中的数据结构,形成树型数据 结构即XML内存树结构;(4)将步骤(3)中生成的XML内存树结构导入到当前程序中,从而实 现文件的兼容。
进一步,步骤(l)中定义一个完整的Schema,首先需要分析当前程序 中所有需要存储到文档中的数据,按照程序中数据的层次结构定义具有相 同层次结构的Schema,以DocRoot节点作为文档的#^节点,对于程序中复 杂的数据定义为Schema中的一个节点,对于程序中简单的数据定义为 Schema中的节点的属性,另外还需要结合数据的语义来最终确定程序中的 数据是作为Schema中的节点还是属性。
进一步,步骤(3)中,如果要兼容Office文件,则利用微软提供的API 函数把Office文档中的各个部分转换生成步骤(2)中的各个数据结构, 同时将各个对象挂接到各自所属的父节点之下,形成一棵XML内存树结构。
进一步,步骤(3)中,如果要兼容早期版本的历史文件,则先把这种历 史文件按照自己的数据格式直接输出一个XML文件,然后通过DOM和XSLT 技术把这个XML文件转换成符合步骤(1 )中要求的标准XML文件,最后再 通过步骤(2)中各个数据结构的Parser解析代码,生成对应的XML内存 树结构。
进一步,步骤(3)中,如果要实现低版本程序兼容高版本程序制作的 XML文件,则直接读入该XML文件,然后通过步骤(2)中各个数据结构的 Parser解析代码,生成对应的XML内存树结构。
进一步,步骤(4)中,将XML内存树结构导入到当前程序中的方法包括 以下步骤
首先,针对文件的每个部分构建一个导入引擎ImportEngine,所述的 导入引擎ImportEngine —方面要导入对应节点的属性,另 一方面还要完成 其子节点的导入,如果子节点是简单节点就直接导入,如果是复杂节点, 就需要调用该子节点的导入引擎;
然后,从根节点DocRoot开始调用DocRoot的导入引擎DocRootlmportEngine的Import ()函凄t,该函凄史中首先完成i亥节点的属寸生 导入,然后调用ImportChildren(),实现导入引擎的递归调用;
最后,各个节点的Import ()函数,主要是完成程序中与该节点对应的 对象的创建及其属性的设置,同时需要设置好新创建的对象与其父对象的 关联关系,然后就是调用ImportChildren()函数从而实现整个文档数据 的导入。
进一步,在实现低版本程序兼容高版本程序制作的文件的过程中,在 进行步骤(2)之前先将高版本程序中的当前文档导出生成一个标准XML文件。
本发明的效果在于采用本发明的方法,可以方便的对多种文档结构 进行兼容,也能够实现低版本程序对高版本程序制作的文件的兼容,同时 也最大程度的重用代码,对未来需要兼容新的第三方文件也具有良好的扩 展性。


图1是本发明所述具体实施方式
中的数据流转示意图; 图2是一个XML Schema数据结构的简单示意图; 图3是本发明所述方法的流程图。
具体实施例方式
下面结合附图及具体实施对本发明作进一步详细说明 如图l和图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节点作为文档的才艮节点,vers ion是Cv一Doc的 一个属性,对应定义为DocRoot节点的一个属性,Cv_Doc下一级是 Cv-DocEnv、 Cv — Article、 Cv—Tables也是复杂节点,对应定义到DocRoot 的子节点,依次类推定义一个完整的Schema。
(2 )按照步骤(1 )中得到Schema定义一系列的数据结构(步骤SM), 参看图1中的"XML内存树结构,,。
在面向对象的C+ +语言中,对于Schema中的每一个节点定义一个 数据结构,对于所有的属性都定义到相应数据结构中的成员变量。利用 设计模式中的Composite模式,对于Schema中的中间节点都应该从 CompositeObject类派生,对于Schema中的叶子节点都应该从 Compos i teLeaf Object派生。 示意代码如下 class CDocRoot
:public CompositeObject :public Iv-Import :public Iv_Export :public Iv_Parser :public Iv_Dump
Public:
//用于实现导入的Import函数 Bool Import(CXMLNode* pNode);Bool ImportChildren(CXMLNode* pNode); 〃用于实现导出的Export函数 Bool Export(CXMLNode* pNode); Bool ExportChildren(CXMLNode* pNode); //用于实现XML文件到内存树的解析 Bool Parser (CXNOode* pNode); Bool ParserChildren (CXMLNode* pNode) , //用于实现内存树到XML文件的输出 Bool Dump(CXMLNode* pNode); Bool D卿Childern (CXMLNode* pNode); Pr i va te:
〃DocRoot中的属性 String strVer;
(3)将需要兼容的文件转换成步骤(2)中的数据结构,形成树型数 据结构(步骤S33),具体方法如下
1 )如果要兼容Office文件,则需要利用微软提供的API函数把Office 文档中的各个部分转换生成步骤(2)中的各个数据结构。同时都需要挂接 到各自所属的父节点之下,形成一棵XML内存树。参看图l中"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内存树,在这个过程中可能会丟失一些扩展的属性, 但是已经能够完成低版本程序兼容高版本程序制作的文件的要求。参看图 l中"兼容格式文档"到"FantArt XML文件"的步骤。
(4)将步骤(3)中生成的XML内存树导入到当前程序中,从而实现 文件的兼容并能够展现给客户(步骤S34),参看图1中"XML内存树结构" 到"FantArt对象"步骤。具体方法如下
l)这个模块会复杂一些,需要从总体上把握整个文档结构,把文档分 解为几个大的部分,比如排版软件——飞腾创意中DocRoot代表整个文 档结构,可以分解为DocEnv(文档参数)部分、Articles (文章、内容)部 分、Tables (表格)部分等等。
2 )针对文档的每个部分构建一个导入引擎——ImportEngine, —方面 需要导入对应节点的属性(即实现其Import ()函数),另一方面还需要完 成其子节点的导入(即实现其ImportChildren()函数),如果子节点是简 单就直接导入;如果是复杂节点,就需要调用该子节点的导入引擎。
示意代码如下
CDocRoot:: Import (CXMLNode* pNode) doc0bj = CreatNewDocument ();
string strVer = pNode->GetAttribute (,6131011,,); docObj. SetVersion(strVer); 〃导入自身的属性 //"….
ImportChildren(pNode);
3 )从根节点DocRoot开始调用DocRoot的导入引擎—— DocRootlmportEngine的Import()函数,该函数中首先完成该节点的属性 导入,然后调用Impor tChi ldren (),实现导入引擎的递归调用。
4)各个节点的Import ()函数,主要是完成程序中与该节点对应的对 象的创建及其属性的设置,同时需要设置好新创建的对象与其父对象的关 联关系。比如排版软件——飞腾创意中DocRoot的导入函数首先会创 建一个文档,然后设置该文档的相关属性。然后就是依次调用DocEnv、Articles, Tables等等的导入引擎的Import ()函数从而实现整个文档数 据的导入。
(5 )另外,在实现低版本程序兼容高版本程序制作的文件的过程中需 要完成高版本程序另存为"兼容格式文档"的功能,其实就是把当前文档 导出生成一个标准XML文件,参看图1中"FantArt对象"到"XML内存树 结构"步骤。其实就是第(4)点中的各个部分另外需要实现一个跟导入引 擎功能相反的导出引擎——ExportEngine。其内部实现的机理完全类似。 所不同的是导入引擎是完成XML内存树结构到文档对象的转换,而导出 引擎刚好相反是完成文档对象到XML内存树结构的转换。然后这个XML内 存树输出相应的XML文件。参看图1中"XML内存树"到"兼容格式文档" 步骤。
示意代码如下
CDocRoot: : Export (CXMLNode* pNode)
string strVer = GetVersion ();
pNode->SetAttribute ("Version", strVer); 〃导出自身的属性
术人员根据本发明的技术方案得出其他的实施方式,同样属于本发明的技 术创新范围。
,本领域技
权利要求
1. 一种利用XML内存树实现多种文件兼容的方法,包括如下步骤(1)针对当前程序中所有需要保存的数据内容定义一个完整Schema;(2)按照步骤(1)中得到Schema定义一系列的数据结构,即对于Schema中的每一个节点定义一个数据结构,对于所有的属性都定义为相应数据结构中的成员变量;(3)将需要兼容的文件转换成步骤(2)中的数据结构,形成一个树型数据结构即XML内存树结构;(4)将步骤(3)中生成的XML内存树结构导入到当前程序中,从而实现文件的兼容。
2. 如权利要求1所述的一种利用XML内存树实现多种文件兼容的方 法,其特征是步骤(l)中定义一个完整的Schema,首先需要分析当前程 序中所有需要存储到文档中的数据,按照程序中数据的层次结构定义具有 相同层次结构的Schema,以DocRoot节点作为文档的才艮节点,对于程序中 复杂的数据定义为Schema中的一个节点,对于程序中简单的数据定义为 Schema中的节点的属性,另外还需要结合数据的语义来最终确定程序中的 数据是作为Schema中的节点还是属性。
3. 如权利要求2所述的一种利用XML内存树实现多种文件兼容的方 法,其特征是步骤(3)中,如果要兼容Office文件,则利用微软提供的 API函数把Office文档中的各个部分转换生成步骤(2)中的各个数据结 构,同时将各个对象挂接到各自所属的父节点之下,形成一棵XML内存树结构。
4. 如权利要求2所述的一种利用XML内存树实现多种文件兼容的方 法,其特征是步骤(3)中,如果要兼容早期版本的历史文件,则先把这种 历史文件按照自己的数据格式直接输出一个XML文件,然后通过DOM和 XSLT技术把这个XML文件转换成符合步骤(1 )中要求的标准XML文件, 最后再通过步骤(2)中各个数据结构的Parser解析代码,生成对应的XML 内存树结构。
5. 如权利要求2所述的一种利用XML内存树实现多种文件兼容的方 法,其特征是步骤(3)中,如果要实现低版本程序兼容高版本程序制作的 XML文件,则直接读入该XML文件,然后通过步骤(2)中各个数据结构的Parser解析代码,生成对应的XML内存树结构。
6. 如权利要求1、 2、 3、 4或5所述的一种利用XML内存树实现多种 文件兼容的方法,其特征是步骤(4)中,将XML内存树结构导入到当前程 序中的方法包括以下步骤首先,针对文件的每个部分构建一个导入引擎ImportEngine,所述的 导入引擎ImportEngine —方面要导入对应节点的属性,另 一方面还要完成 其子节点的导入,如果子节点是简单节点就直接导入,如果是复杂节点, 就需要调用该子节点的导入引擎;然后,从根节点DocRoot开始调用DocRoot的导入引擎 DocRootlmportEngine的Import()函凄t,该函lt中首先完成该节点的属性 导入,然后调用ImportChildren(),实现导入引擎的递归调用;最后,各个节点的Import ()函数,主要是完成程序中与该节点对应的 对象的创建及其属性的设置,同时需要设置好新创建的对象与其父对象的 关联关系,然后就是调用ImportChindren()函数从而实现整个文档数据 的导入。
7. 如权利要求6所述的一种利用XML内存树实现多种文件兼容的方 法,其特征是在实现低版本程序兼容高版本程序制作的文件的过程中, 在进行步骤(2)之前先将高版本程序中的当前文件导出生成一个标准XML 文件。
全文摘要
本发明涉及一种利用XML内存树实现多种文件兼容的方法,属于计算机印刷排版技术领域。现有的文件兼容方法大部分是基于二进制流进行文件兼容的,通过对二进制格式进行解析直接生成新格式的文档。如果需要对多种文件进行兼容则需要多个解析模块,并且包含类似的转换代码。本发明所述的方法通过引入XML内存树作为中间结构,然后仅仅对这种XML结构进行兼容。采用本发明所述的方法,可以方便的对多种文档结构进行兼容,同时也能够实现低版本程序对高版本程序制作的文件的兼容。
文档编号G06F17/30GK101436185SQ20071017720
公开日2009年5月20日 申请日期2007年11月12日 优先权日2007年11月12日
发明者余忠华, 阎国龙, 魏超鹏 申请人:北大方正集团有限公司;北京北大方正电子有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1