專利名稱:一種利用xml內(nèi)存樹實現(xiàn)多種文件兼容的方法
技術(shù)領(lǐng)域:
本發(fā)明屬于計算機印刷排版技術(shù)領(lǐng)域,具體涉及一種利用XML內(nèi)存樹 實現(xiàn)多種文件兼容的方法。
背景技術(shù):
隨著計算機軟件的發(fā)展,許多的軟件都不可避免的進行不斷的升級, 有些是一些對文件結(jié)構(gòu)影響不大的變更,有些卻是根本的變化。由于軟件 升級過程中需要兼容早期版本制作的文件。所謂文件兼容,是指使用當前 程序能夠打開第三方程序或者該程序早期版本制作的文件,以保障用戶對 已有資源的可重用性。
目前的文件兼容的方法主要是基于二進制流進行文件兼容的,通過 對二進制格式進行解析直接生成新格式的文檔。如果需要對多種文件進行 兼容則需要多個解析模塊,并且包含類似的轉(zhuǎn)換代碼。
發(fā)明內(nèi)容
針對現(xiàn)有技術(shù)中存在的缺陷,本發(fā)明的目的是提供一種可以方便地對 多種文檔結(jié)構(gòu)進行兼容,同時也能夠?qū)崿F(xiàn)低版本程序?qū)Ω甙姹境绦蛑谱鞯?文件的進行兼容的方法。
為達到以上目的,本發(fā)明采用的技術(shù)方案是 一種利用XML內(nèi)存樹實 現(xiàn)多種文件兼容的方法,包括如下步驟
(1 )針對當前程序中所有需要保存的數(shù)據(jù)內(nèi)容定義一個完整Schema;
(2 )按照步驟(1 )中得到Schema定義一 系列的數(shù)據(jù)結(jié)構(gòu),即對于Schema 中的每一個節(jié)點定義一個數(shù)據(jù)結(jié)構(gòu),對于所有的屬性都定義到相應(yīng)數(shù)據(jù)結(jié)
構(gòu)中的成員變量;
(3)將需要兼容的文件轉(zhuǎn)換成步驟(2)中的數(shù)據(jù)結(jié)構(gòu),形成樹型數(shù)據(jù) 結(jié)構(gòu)即XML內(nèi)存樹結(jié)構(gòu);(4)將步驟(3)中生成的XML內(nèi)存樹結(jié)構(gòu)導(dǎo)入到當前程序中,從而實 現(xiàn)文件的兼容。
進一步,步驟(l)中定義一個完整的Schema,首先需要分析當前程序 中所有需要存儲到文檔中的數(shù)據(jù),按照程序中數(shù)據(jù)的層次結(jié)構(gòu)定義具有相 同層次結(jié)構(gòu)的Schema,以DocRoot節(jié)點作為文檔的#^節(jié)點,對于程序中復(fù) 雜的數(shù)據(jù)定義為Schema中的一個節(jié)點,對于程序中簡單的數(shù)據(jù)定義為 Schema中的節(jié)點的屬性,另外還需要結(jié)合數(shù)據(jù)的語義來最終確定程序中的 數(shù)據(jù)是作為Schema中的節(jié)點還是屬性。
進一步,步驟(3)中,如果要兼容Office文件,則利用微軟提供的API 函數(shù)把Office文檔中的各個部分轉(zhuǎn)換生成步驟(2)中的各個數(shù)據(jù)結(jié)構(gòu), 同時將各個對象掛接到各自所屬的父節(jié)點之下,形成一棵XML內(nèi)存樹結(jié)構(gòu)。
進一步,步驟(3)中,如果要兼容早期版本的歷史文件,則先把這種歷 史文件按照自己的數(shù)據(jù)格式直接輸出一個XML文件,然后通過DOM和XSLT 技術(shù)把這個XML文件轉(zhuǎn)換成符合步驟(1 )中要求的標準XML文件,最后再 通過步驟(2)中各個數(shù)據(jù)結(jié)構(gòu)的Parser解析代碼,生成對應(yīng)的XML內(nèi)存 樹結(jié)構(gòu)。
進一步,步驟(3)中,如果要實現(xiàn)低版本程序兼容高版本程序制作的 XML文件,則直接讀入該XML文件,然后通過步驟(2)中各個數(shù)據(jù)結(jié)構(gòu)的 Parser解析代碼,生成對應(yīng)的XML內(nèi)存樹結(jié)構(gòu)。
進一步,步驟(4)中,將XML內(nèi)存樹結(jié)構(gòu)導(dǎo)入到當前程序中的方法包括 以下步驟
首先,針對文件的每個部分構(gòu)建一個導(dǎo)入引擎ImportEngine,所述的 導(dǎo)入引擎ImportEngine —方面要導(dǎo)入對應(yīng)節(jié)點的屬性,另 一方面還要完成 其子節(jié)點的導(dǎo)入,如果子節(jié)點是簡單節(jié)點就直接導(dǎo)入,如果是復(fù)雜節(jié)點, 就需要調(diào)用該子節(jié)點的導(dǎo)入引擎;
然后,從根節(jié)點DocRoot開始調(diào)用DocRoot的導(dǎo)入引擎DocRootlmportEngine的Import ()函凄t,該函凄史中首先完成i亥節(jié)點的屬寸生 導(dǎo)入,然后調(diào)用ImportChildren(),實現(xiàn)導(dǎo)入引擎的遞歸調(diào)用;
最后,各個節(jié)點的Import ()函數(shù),主要是完成程序中與該節(jié)點對應(yīng)的 對象的創(chuàng)建及其屬性的設(shè)置,同時需要設(shè)置好新創(chuàng)建的對象與其父對象的 關(guān)聯(lián)關(guān)系,然后就是調(diào)用ImportChildren()函數(shù)從而實現(xiàn)整個文檔數(shù)據(jù) 的導(dǎo)入。
進一步,在實現(xiàn)低版本程序兼容高版本程序制作的文件的過程中,在 進行步驟(2)之前先將高版本程序中的當前文檔導(dǎo)出生成一個標準XML文件。
本發(fā)明的效果在于采用本發(fā)明的方法,可以方便的對多種文檔結(jié)構(gòu) 進行兼容,也能夠?qū)崿F(xiàn)低版本程序?qū)Ω甙姹境绦蛑谱鞯奈募募嫒?,同時 也最大程度的重用代碼,對未來需要兼容新的第三方文件也具有良好的擴 展性。
圖1是本發(fā)明所述具體實施方式
中的數(shù)據(jù)流轉(zhuǎn)示意圖; 圖2是一個XML Schema數(shù)據(jù)結(jié)構(gòu)的簡單示意圖; 圖3是本發(fā)明所述方法的流程圖。
具體實施例方式
下面結(jié)合附圖及具體實施對本發(fā)明作進一步詳細說明 如圖l和圖3所示, 一種利用XML內(nèi)存樹實現(xiàn)多種文件兼容的方法, 包括如下步驟
(1)針對當前程序中所有需要保存的數(shù)據(jù)內(nèi)容(包括程序環(huán)境設(shè)置) 定義一個完整Schema (步驟S31),這個Schema就是后續(xù)生成標準XML的規(guī) 范。所謂完整就是要求對所有需要存儲的數(shù)據(jù)定義到Schema中。
定義一個完整的Schema,首先需要分析當前程序中所有需要存儲到文 檔中的數(shù)據(jù),按照程序中數(shù)據(jù)的層次結(jié)構(gòu)定義具有相同層次結(jié)構(gòu)的Schema,以DocRoot節(jié)點作為文檔的根節(jié)點,對于程序中復(fù)雜的數(shù)據(jù)定義 為Schema中的一個節(jié)點,對于程序中筒單的數(shù)據(jù)定義為Schema中的節(jié)點 的屬性,另外還需要結(jié)合數(shù)據(jù)的語義來最終確定程序中的數(shù)據(jù)是作為 Schema中的節(jié)點還是屬性。定義后的Schema的簡單示意圖如圖2所示。
XML Schema是用來描述和約束XML文檔的一種XML語言,從功能上看, 它和早期的DTD是非常類似的,^旦是它比DTD的更加強大。
本實施例中,文檔對象Cv_Doc是一個復(fù)雜數(shù)據(jù)類型,對應(yīng)定義上述定 義的Schema是以DocRoot節(jié)點作為文檔的才艮節(jié)點,vers ion是Cv一Doc的 一個屬性,對應(yīng)定義為DocRoot節(jié)點的一個屬性,Cv_Doc下一級是 Cv-DocEnv、 Cv — Article、 Cv—Tables也是復(fù)雜節(jié)點,對應(yīng)定義到DocRoot 的子節(jié)點,依次類推定義一個完整的Schema。
(2 )按照步驟(1 )中得到Schema定義一系列的數(shù)據(jù)結(jié)構(gòu)(步驟SM), 參看圖1中的"XML內(nèi)存樹結(jié)構(gòu),,。
在面向?qū)ο蟮腃+ +語言中,對于Schema中的每一個節(jié)點定義一個 數(shù)據(jù)結(jié)構(gòu),對于所有的屬性都定義到相應(yīng)數(shù)據(jù)結(jié)構(gòu)中的成員變量。利用 設(shè)計模式中的Composite模式,對于Schema中的中間節(jié)點都應(yīng)該從 CompositeObject類派生,對于Schema中的葉子節(jié)點都應(yīng)該從 Compos i teLeaf Object派生。 示意代碼如下 class CDocRoot
:public CompositeObject :public Iv-Import :public Iv_Export :public Iv_Parser :public Iv_Dump
Public:
//用于實現(xiàn)導(dǎo)入的Import函數(shù) Bool Import(CXMLNode* pNode);Bool ImportChildren(CXMLNode* pNode); 〃用于實現(xiàn)導(dǎo)出的Export函數(shù) Bool Export(CXMLNode* pNode); Bool ExportChildren(CXMLNode* pNode); //用于實現(xiàn)XML文件到內(nèi)存樹的解析 Bool Parser (CXNOode* pNode); Bool ParserChildren (CXMLNode* pNode) , //用于實現(xiàn)內(nèi)存樹到XML文件的輸出 Bool Dump(CXMLNode* pNode); Bool D卿Childern (CXMLNode* pNode); Pr i va te:
〃DocRoot中的屬性 String strVer;
(3)將需要兼容的文件轉(zhuǎn)換成步驟(2)中的數(shù)據(jù)結(jié)構(gòu),形成樹型數(shù) 據(jù)結(jié)構(gòu)(步驟S33),具體方法如下
1 )如果要兼容Office文件,則需要利用微軟提供的API函數(shù)把Office 文檔中的各個部分轉(zhuǎn)換生成步驟(2)中的各個數(shù)據(jù)結(jié)構(gòu)。同時都需要掛接 到各自所屬的父節(jié)點之下,形成一棵XML內(nèi)存樹。參看圖l中"Office文 檔,,到"FantArt XML文件"的步驟。
2) 如果要兼容早期版本的歷史文件,由于格式很可能跟現(xiàn)在版本的數(shù) 據(jù)結(jié)構(gòu)相差甚大。所以應(yīng)該先把這種歷史文件按照自己的數(shù)據(jù)格式直接輸 出 一個XML文件,然后通過DOM和XSLT技術(shù)把這個XML文件轉(zhuǎn)換成符合步 驟(1)中要求的標準XML文件,最后再通過步驟(2)中各個數(shù)據(jù)結(jié)構(gòu)的 Parser解析代碼,生成對應(yīng)的XML內(nèi)存樹。參看圖1中"老飛騰文檔"到
"XML文件"再到"FantArt XML文件"的步驟。
3) 如果是要實現(xiàn)低版本程序兼容高版本程序制作的文件,因為高版本 的程序存儲的兼容格式已經(jīng)是基于標準XML擴展的XML文件,這時就可以 直接Load該XML文件,然后通過步驟(2 )中各個數(shù)據(jù)結(jié)構(gòu)的Parser解析代碼,生成對應(yīng)的XML內(nèi)存樹,在這個過程中可能會丟失一些擴展的屬性, 但是已經(jīng)能夠完成低版本程序兼容高版本程序制作的文件的要求。參看圖 l中"兼容格式文檔"到"FantArt XML文件"的步驟。
(4)將步驟(3)中生成的XML內(nèi)存樹導(dǎo)入到當前程序中,從而實現(xiàn) 文件的兼容并能夠展現(xiàn)給客戶(步驟S34),參看圖1中"XML內(nèi)存樹結(jié)構(gòu)" 到"FantArt對象"步驟。具體方法如下
l)這個模塊會復(fù)雜一些,需要從總體上把握整個文檔結(jié)構(gòu),把文檔分 解為幾個大的部分,比如排版軟件——飛騰創(chuàng)意中DocRoot代表整個文 檔結(jié)構(gòu),可以分解為DocEnv(文檔參數(shù))部分、Articles (文章、內(nèi)容)部 分、Tables (表格)部分等等。
2 )針對文檔的每個部分構(gòu)建一個導(dǎo)入引擎——ImportEngine, —方面 需要導(dǎo)入對應(yīng)節(jié)點的屬性(即實現(xiàn)其Import ()函數(shù)),另一方面還需要完 成其子節(jié)點的導(dǎo)入(即實現(xiàn)其ImportChildren()函數(shù)),如果子節(jié)點是簡 單就直接導(dǎo)入;如果是復(fù)雜節(jié)點,就需要調(diào)用該子節(jié)點的導(dǎo)入引擎。
示意代碼如下
CDocRoot:: Import (CXMLNode* pNode) doc0bj = CreatNewDocument ();
string strVer = pNode->GetAttribute (,6131011,,); docObj. SetVersion(strVer); 〃導(dǎo)入自身的屬性 //"….
ImportChildren(pNode);
3 )從根節(jié)點DocRoot開始調(diào)用DocRoot的導(dǎo)入引擎—— DocRootlmportEngine的Import()函數(shù),該函數(shù)中首先完成該節(jié)點的屬性 導(dǎo)入,然后調(diào)用Impor tChi ldren (),實現(xiàn)導(dǎo)入引擎的遞歸調(diào)用。
4)各個節(jié)點的Import ()函數(shù),主要是完成程序中與該節(jié)點對應(yīng)的對 象的創(chuàng)建及其屬性的設(shè)置,同時需要設(shè)置好新創(chuàng)建的對象與其父對象的關(guān) 聯(lián)關(guān)系。比如排版軟件——飛騰創(chuàng)意中DocRoot的導(dǎo)入函數(shù)首先會創(chuàng) 建一個文檔,然后設(shè)置該文檔的相關(guān)屬性。然后就是依次調(diào)用DocEnv、Articles, Tables等等的導(dǎo)入引擎的Import ()函數(shù)從而實現(xiàn)整個文檔數(shù) 據(jù)的導(dǎo)入。
(5 )另外,在實現(xiàn)低版本程序兼容高版本程序制作的文件的過程中需 要完成高版本程序另存為"兼容格式文檔"的功能,其實就是把當前文檔 導(dǎo)出生成一個標準XML文件,參看圖1中"FantArt對象"到"XML內(nèi)存樹 結(jié)構(gòu)"步驟。其實就是第(4)點中的各個部分另外需要實現(xiàn)一個跟導(dǎo)入引 擎功能相反的導(dǎo)出引擎——ExportEngine。其內(nèi)部實現(xiàn)的機理完全類似。 所不同的是導(dǎo)入引擎是完成XML內(nèi)存樹結(jié)構(gòu)到文檔對象的轉(zhuǎn)換,而導(dǎo)出 引擎剛好相反是完成文檔對象到XML內(nèi)存樹結(jié)構(gòu)的轉(zhuǎn)換。然后這個XML內(nèi) 存樹輸出相應(yīng)的XML文件。參看圖1中"XML內(nèi)存樹"到"兼容格式文檔" 步驟。
示意代碼如下
CDocRoot: : Export (CXMLNode* pNode)
string strVer = GetVersion ();
pNode->SetAttribute ("Version", strVer); 〃導(dǎo)出自身的屬性
術(shù)人員根據(jù)本發(fā)明的技術(shù)方案得出其他的實施方式,同樣屬于本發(fā)明的技 術(shù)創(chuàng)新范圍。
,本領(lǐng)域技
權(quán)利要求
1. 一種利用XML內(nèi)存樹實現(xiàn)多種文件兼容的方法,包括如下步驟(1)針對當前程序中所有需要保存的數(shù)據(jù)內(nèi)容定義一個完整Schema;(2)按照步驟(1)中得到Schema定義一系列的數(shù)據(jù)結(jié)構(gòu),即對于Schema中的每一個節(jié)點定義一個數(shù)據(jù)結(jié)構(gòu),對于所有的屬性都定義為相應(yīng)數(shù)據(jù)結(jié)構(gòu)中的成員變量;(3)將需要兼容的文件轉(zhuǎn)換成步驟(2)中的數(shù)據(jù)結(jié)構(gòu),形成一個樹型數(shù)據(jù)結(jié)構(gòu)即XML內(nèi)存樹結(jié)構(gòu);(4)將步驟(3)中生成的XML內(nèi)存樹結(jié)構(gòu)導(dǎo)入到當前程序中,從而實現(xiàn)文件的兼容。
2. 如權(quán)利要求1所述的一種利用XML內(nèi)存樹實現(xiàn)多種文件兼容的方 法,其特征是步驟(l)中定義一個完整的Schema,首先需要分析當前程 序中所有需要存儲到文檔中的數(shù)據(jù),按照程序中數(shù)據(jù)的層次結(jié)構(gòu)定義具有 相同層次結(jié)構(gòu)的Schema,以DocRoot節(jié)點作為文檔的才艮節(jié)點,對于程序中 復(fù)雜的數(shù)據(jù)定義為Schema中的一個節(jié)點,對于程序中簡單的數(shù)據(jù)定義為 Schema中的節(jié)點的屬性,另外還需要結(jié)合數(shù)據(jù)的語義來最終確定程序中的 數(shù)據(jù)是作為Schema中的節(jié)點還是屬性。
3. 如權(quán)利要求2所述的一種利用XML內(nèi)存樹實現(xiàn)多種文件兼容的方 法,其特征是步驟(3)中,如果要兼容Office文件,則利用微軟提供的 API函數(shù)把Office文檔中的各個部分轉(zhuǎn)換生成步驟(2)中的各個數(shù)據(jù)結(jié) 構(gòu),同時將各個對象掛接到各自所屬的父節(jié)點之下,形成一棵XML內(nèi)存樹結(jié)構(gòu)。
4. 如權(quán)利要求2所述的一種利用XML內(nèi)存樹實現(xiàn)多種文件兼容的方 法,其特征是步驟(3)中,如果要兼容早期版本的歷史文件,則先把這種 歷史文件按照自己的數(shù)據(jù)格式直接輸出一個XML文件,然后通過DOM和 XSLT技術(shù)把這個XML文件轉(zhuǎn)換成符合步驟(1 )中要求的標準XML文件, 最后再通過步驟(2)中各個數(shù)據(jù)結(jié)構(gòu)的Parser解析代碼,生成對應(yīng)的XML 內(nèi)存樹結(jié)構(gòu)。
5. 如權(quán)利要求2所述的一種利用XML內(nèi)存樹實現(xiàn)多種文件兼容的方 法,其特征是步驟(3)中,如果要實現(xiàn)低版本程序兼容高版本程序制作的 XML文件,則直接讀入該XML文件,然后通過步驟(2)中各個數(shù)據(jù)結(jié)構(gòu)的Parser解析代碼,生成對應(yīng)的XML內(nèi)存樹結(jié)構(gòu)。
6. 如權(quán)利要求1、 2、 3、 4或5所述的一種利用XML內(nèi)存樹實現(xiàn)多種 文件兼容的方法,其特征是步驟(4)中,將XML內(nèi)存樹結(jié)構(gòu)導(dǎo)入到當前程 序中的方法包括以下步驟首先,針對文件的每個部分構(gòu)建一個導(dǎo)入引擎ImportEngine,所述的 導(dǎo)入引擎ImportEngine —方面要導(dǎo)入對應(yīng)節(jié)點的屬性,另 一方面還要完成 其子節(jié)點的導(dǎo)入,如果子節(jié)點是簡單節(jié)點就直接導(dǎo)入,如果是復(fù)雜節(jié)點, 就需要調(diào)用該子節(jié)點的導(dǎo)入引擎;然后,從根節(jié)點DocRoot開始調(diào)用DocRoot的導(dǎo)入引擎 DocRootlmportEngine的Import()函凄t,該函lt中首先完成該節(jié)點的屬性 導(dǎo)入,然后調(diào)用ImportChildren(),實現(xiàn)導(dǎo)入引擎的遞歸調(diào)用;最后,各個節(jié)點的Import ()函數(shù),主要是完成程序中與該節(jié)點對應(yīng)的 對象的創(chuàng)建及其屬性的設(shè)置,同時需要設(shè)置好新創(chuàng)建的對象與其父對象的 關(guān)聯(lián)關(guān)系,然后就是調(diào)用ImportChindren()函數(shù)從而實現(xiàn)整個文檔數(shù)據(jù) 的導(dǎo)入。
7. 如權(quán)利要求6所述的一種利用XML內(nèi)存樹實現(xiàn)多種文件兼容的方 法,其特征是在實現(xiàn)低版本程序兼容高版本程序制作的文件的過程中, 在進行步驟(2)之前先將高版本程序中的當前文件導(dǎo)出生成一個標準XML 文件。
全文摘要
本發(fā)明涉及一種利用XML內(nèi)存樹實現(xiàn)多種文件兼容的方法,屬于計算機印刷排版技術(shù)領(lǐng)域?,F(xiàn)有的文件兼容方法大部分是基于二進制流進行文件兼容的,通過對二進制格式進行解析直接生成新格式的文檔。如果需要對多種文件進行兼容則需要多個解析模塊,并且包含類似的轉(zhuǎn)換代碼。本發(fā)明所述的方法通過引入XML內(nèi)存樹作為中間結(jié)構(gòu),然后僅僅對這種XML結(jié)構(gòu)進行兼容。采用本發(fā)明所述的方法,可以方便的對多種文檔結(jié)構(gòu)進行兼容,同時也能夠?qū)崿F(xiàn)低版本程序?qū)Ω甙姹境绦蛑谱鞯奈募募嫒荨?br>
文檔編號G06F17/30GK101436185SQ20071017720
公開日2009年5月20日 申請日期2007年11月12日 優(yōu)先權(quán)日2007年11月12日
發(fā)明者余忠華, 閻國龍, 魏超鵬 申請人:北大方正集團有限公司;北京北大方正電子有限公司