一種大型xml文檔轉(zhuǎn)換方法
【專利摘要】一種大型XML文檔轉(zhuǎn)換方法,首先設(shè)定一個(gè)大型XML文檔,然后再對(duì)該文檔進(jìn)行分割處理,最后再利用XSLT對(duì)分割生成的多個(gè)XML目標(biāo)文檔進(jìn)行轉(zhuǎn)換處理。其中,分割處理采用的是迭代的方式,且每一次分割處理過程都類似相同,具體可表述為包含以下步驟:1)設(shè)定分割閾值;2)進(jìn)行初步分割處理,得到兩個(gè)非“形式良好”的XML文檔;3)進(jìn)行初步重構(gòu)處理,得到兩個(gè)新XML文檔,分別是“已刪除不完整數(shù)據(jù)”的XML文檔和“已添加不完整數(shù)據(jù)”的XML文檔;4)進(jìn)行再重構(gòu)處理,得到兩個(gè)“形式良好”的XML文檔。本發(fā)明能夠有效處理大型XML文檔特別大的情況,該方法準(zhǔn)確度和精度較高、數(shù)據(jù)處理耗費(fèi)時(shí)間較短、計(jì)算復(fù)雜度較低。
【專利說明】一種大型XML文檔轉(zhuǎn)換方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及一種XML文檔轉(zhuǎn)換方法。
【背景技術(shù)】
[0002]XML (Extensible Markup Language,可擴(kuò)展標(biāo)記語言)是 W3C (World Wide WebConsortium,萬維網(wǎng)聯(lián)盟)于1998年2月10日推出的用于數(shù)據(jù)傳輸和存儲(chǔ)的標(biāo)準(zhǔn),它是Internet上的不兼容系統(tǒng)之間進(jìn)行數(shù)據(jù)交換的最常用的工具。
[0003]一個(gè)擁有正確語法的XML文檔被稱為“形式良好的”(well-formed) XML文檔,它應(yīng)該滿足以下5個(gè)特性:
[0004]I) XML文檔必須要有關(guān)閉標(biāo)簽。在XML中,開始標(biāo)簽和結(jié)束標(biāo)簽必須配套,例如:<age>…〈/age〉??赵貥?biāo)簽必須被關(guān)閉,例如:〈age/>。
[0005]2) XML標(biāo)簽對(duì)大小寫敏感。在XML中,標(biāo)簽〈Name〉與標(biāo)簽〈name〉是不同的。
[0006]3) XML元素必須被正確的嵌套。在XML中,所有的標(biāo)簽都必須合理嵌套,例如:〈patientXname〉…〈/nameX/patient〉。在此例中,正確嵌套的意思是:〈name>元素是在〈patient〉元素內(nèi)打開的,那么它必須在〈patient〉元素內(nèi)關(guān)閉。
[0007]4) XML文檔必須有根元素。XML文檔必須有一個(gè)元素是所有其他元素的父元素。該元素稱為根元素。
[0008]5) XML屬性必須加引號(hào)。所有標(biāo)簽的屬性值都必須使用雙引號(hào)或單引號(hào)。
[0009]XML文檔形成了一種樹結(jié)構(gòu),它從“根部”開始,然后擴(kuò)展到“枝葉”。圖1所示為一個(gè)簡(jiǎn)單的XML文檔的樹結(jié)構(gòu)。
[0010]在此樹形結(jié)構(gòu)中,樹上的每個(gè)元素都可稱為節(jié)點(diǎn)(node),頂層元素〈hospital〉稱為“根節(jié)點(diǎn)”,節(jié)點(diǎn)之間的關(guān)系具體包括:父節(jié)點(diǎn)(parent)、子節(jié)點(diǎn)(child)、兄弟節(jié)點(diǎn)(sibling)、祖先節(jié)點(diǎn)(ancestor)和后代節(jié)點(diǎn)(descendant)。
[0011]其中,祖先節(jié)點(diǎn)是指包含上下文節(jié)點(diǎn)的祖先節(jié)點(diǎn)。上下文節(jié)點(diǎn)的祖先節(jié)點(diǎn)由上下文的父節(jié)點(diǎn),以及父節(jié)點(diǎn)的父節(jié)點(diǎn),依此類推組成。如果上下文節(jié)點(diǎn)不是根節(jié)點(diǎn),那么它的祖先節(jié)點(diǎn)總是包含根節(jié)點(diǎn)。例如,元素<age>的祖先節(jié)點(diǎn)包含其父節(jié)點(diǎn)〈patient〉,父節(jié)點(diǎn)的父節(jié)點(diǎn)〈patients〉,以及根節(jié)點(diǎn)〈hospital〉;元素<id>的祖先節(jié)點(diǎn)包含其父節(jié)點(diǎn)〈department〉,父節(jié)點(diǎn)的父節(jié)點(diǎn)〈departments〉,以及根節(jié)點(diǎn)〈hospital〉。
[0012]為了實(shí)現(xiàn)異構(gòu)信息的交換與共享,我們通常需要把一種格式的XML文檔轉(zhuǎn)換成另外一種格式的XML文檔。目前,典型的XML文檔格式轉(zhuǎn)換的方法包括:
[0013]I)使用 DOM (Document Object Model,文檔對(duì)象類型);
[0014]2)使用SAX (Simple API for XML,簡(jiǎn)單應(yīng)用程序編程接口);
[0015]3)使用 XSLT (XSL Transformations, XSL 轉(zhuǎn)換)。
[0016]其中,XSLT作為現(xiàn)在最流行的實(shí)現(xiàn)XML文檔格式轉(zhuǎn)換的技術(shù)之一,
[0017]是在1999年11月16日被確立為W3C標(biāo)準(zhǔn)的,其功能十分強(qiáng)大。XSLT指XSL轉(zhuǎn)換,它是XSL中最重要的部分,可將一種XML文檔轉(zhuǎn)換為另外一種XML文檔。[0018]XSLT轉(zhuǎn)換的基本思想是將XML文檔視為一種樹結(jié)構(gòu),轉(zhuǎn)換過程就是從源文檔樹生成結(jié)果文檔樹的過程,具體實(shí)現(xiàn)過程如圖2所示。XSLT轉(zhuǎn)換通常涉及三個(gè)文檔:源文檔、目標(biāo)文檔和含有模板規(guī)則的文檔。其中,含有模板規(guī)則的XSL文檔也被稱作是XSLT轉(zhuǎn)換樣式表,它的每條模板規(guī)則都包含一個(gè)模板,并對(duì)應(yīng)一種模式。
[0019]在轉(zhuǎn)換過程中,XML源文檔先是被解析成DOM樹存放在內(nèi)存中,然后將DOM樹中的每一個(gè)節(jié)點(diǎn)與XSL文檔中的一個(gè)模式相比較,當(dāng)二者相匹配時(shí),就會(huì)按照模板中定義的規(guī)則進(jìn)行轉(zhuǎn)換;否則,將繼續(xù)向下匹配。如此循環(huán),直至整個(gè)文檔處理完畢。
[0020]近年來,隨著計(jì)算機(jī)技術(shù)和信息化的快速普及,各種信息系統(tǒng)收集了大量數(shù)據(jù)。這些數(shù)據(jù)經(jīng)過不同的計(jì)算機(jī)系統(tǒng)收集、加工、處理,形成多種異構(gòu)數(shù)據(jù)源。當(dāng)對(duì)這些異構(gòu)數(shù)據(jù)源進(jìn)行處理時(shí),首先要解決的問題就是將存儲(chǔ)格式不同的數(shù)據(jù)進(jìn)行轉(zhuǎn)換,形成統(tǒng)一的數(shù)據(jù)格式,然后才能對(duì)其進(jìn)行處 理。為此,基于XML的文檔或數(shù)據(jù)轉(zhuǎn)換算法就被提出。
[0021]但是,傳統(tǒng)XML數(shù)據(jù)轉(zhuǎn)換算法難以適應(yīng)當(dāng)前海量數(shù)據(jù)轉(zhuǎn)換的要求。即,如果需要處理的數(shù)據(jù)過大,特別是海量數(shù)據(jù),那么XML文檔也就很大,文檔進(jìn)行轉(zhuǎn)換時(shí)就會(huì)消耗大量的內(nèi)存、占用大量的時(shí)間,導(dǎo)致系統(tǒng)速度變慢。
[0022]例如專利申請(qǐng)?zhí)?201210495961.5的中國(guó)發(fā)明專利申請(qǐng),公開了一種XML解析中數(shù)據(jù)塊劃分方法和XML解析方法,它并沒有提到內(nèi)存不足問題,只是單純的進(jìn)行數(shù)據(jù)分割,也就是說,如果XML文檔特別大,它是無法處理的。該方法采用的是傳統(tǒng)的一次性分割法,最終將劃分成多個(gè)數(shù)據(jù)塊,并沒有生成“形式良好”的XML文檔,這使得各部分?jǐn)?shù)據(jù)的解析無法獨(dú)立進(jìn)行,也使得接下來可能涉及到的快速拆分和組裝等操作更加困難、復(fù)雜。該方法僅是為了提高解析效率,它在利用多線程進(jìn)行并行解析之前并沒有經(jīng)過轉(zhuǎn)換處理,更沒有考慮接下來的傳輸處理過程。
【發(fā)明內(nèi)容】
[0023]為了克服已有XML文檔轉(zhuǎn)換方法的無法處理XML文檔特別大的情況、準(zhǔn)確度和精度較低、數(shù)據(jù)處理耗費(fèi)時(shí)間較長(zhǎng)、計(jì)算復(fù)雜度較高的不足,本發(fā)明提供了一種有效處理XML文檔特別大的情況、準(zhǔn)確度和精度較高、數(shù)據(jù)處理耗費(fèi)時(shí)間較短、計(jì)算復(fù)雜度較低的大型XML文檔轉(zhuǎn)換方法。
[0024]本發(fā)明解決其技術(shù)問題所采用的技術(shù)方案是:
[0025]一種大型XML文檔轉(zhuǎn)換方法,所述轉(zhuǎn)換方法包括以下步驟:
[0026]I)分割XML源文檔,過程如下:
[0027]設(shè)定一個(gè)將要進(jìn)行轉(zhuǎn)換的XML源文檔Fs,其大小為Ts,計(jì)算機(jī)可用的最大內(nèi)存為Tm,如果XML文檔非常大,遠(yuǎn)遠(yuǎn)大于計(jì)算機(jī)可用的最大內(nèi)存,即Ts?Tm,或者說,若滿足條件:Ts ^ ηΤω, η>>1,那么在進(jìn)行轉(zhuǎn)換之前需要對(duì)該文檔進(jìn)行分割處理,其具體包括以下步驟:
[0028]1.1)設(shè)定分割閾值T,T = 即,文檔轉(zhuǎn)換時(shí)只使用不超過一半的內(nèi)存空間;
[0029]1.2)進(jìn)行第一次分割,分割后得到兩個(gè)形式良好的XML文檔:
[0030]①Fsl,大小記為 Tsl,Tsl ^ T ;
[0031]②Fbl,大小記為 Tbl,Tbl=Ts-Tsl ^ Ts-T ;
[0032]1.3)若Tba^PTm,進(jìn)行第k次分割,分割后得到兩個(gè)形式良好的XML文檔:
[0033]①Fsk,大小記為 Tsk, Tsk ^ T ;[0034]②Fbk,大小記為 Tbk, Tbk=Tb(H)-Tsk ^ [Ts- (k-1) T] _T=Ts_kT ;
[0035]1.4)若Tb(n_1} > T = $進(jìn)行第η次分割,分割后得到兩個(gè)形式良好的XML文檔:
[0036]①Fsn,大小記為 Tsn,Tsn^T;
[0037]②Fbn,大小記為 Tbn, Tbn=Tb(m)-Tsn ^ [Ts- (n-1) T] _T=Ts_nT ;
[0038]這時(shí)分割生成的XML文檔Fbn的大小不超過所設(shè)的分割閾值,即Tbn ( T,不再滿足分割條件時(shí)分割結(jié)束;
[0039]2)利用XSLT轉(zhuǎn)換分割生成的多個(gè)XML目標(biāo)文檔。
[0040]進(jìn)一步,所述步驟1.2)中,第一次分割的處理過程如下:
[0041]( I)設(shè)定分割閾值T,T =
[0042](2)初步分割XML源文檔Fs,生成兩個(gè)非“形式良好的” XML文檔:
[0043]①Fsl,大小記為 Tsl,Tsl ~T ; [0044]②Fbl,大小記為 Tbl, Tbl = Ts-Tsl ^ Ts-T ;
[0045](3)重構(gòu)上一步生成的兩個(gè)XML文檔Fsl和Fbl,具體實(shí)現(xiàn)過程如下:
[0046](3.1)讀取初步分割生成的XML文檔Fsl ;
[0047](3.2)將指針定位到尾部;
[0048](3.3)向前搜索結(jié)束標(biāo)簽的開始標(biāo)記“〈/”,并記錄其位置為L(zhǎng)1 ;
[0049](3.4)從L1開始向后搜索相應(yīng)的結(jié)束標(biāo)記“〉”,并記錄其位置為L(zhǎng)2,此時(shí)會(huì)有兩種可能:
[0050]如果能夠搜到結(jié)束標(biāo)記“>”,那么L2的值就是該標(biāo)記的位置值;
[0051]反之,如果未能搜到結(jié)束標(biāo)記“>”,這時(shí)應(yīng)將指針定位到L1處,再一次執(zhí)行步驟(3.3),得到新的L1值后,再執(zhí)行步驟(3.4),獲取新的L2值,這個(gè)新的L2值才是該情況下結(jié)束標(biāo)記的真正位置;
[0052](3.5)將因分割而導(dǎo)致的不完整數(shù)據(jù)從Fsl的尾部移到Fbl的首部;
[0053](3.6)獲取因分割而缺失的所有祖先節(jié)點(diǎn)的標(biāo)簽名字,具體步驟如下:
[0054](3.6.1)設(shè)定讀取標(biāo)志fIag=True,當(dāng)讀取的值的長(zhǎng)度大小或等于O時(shí),fIag=False ;
[0055](3.6.2)讀取步驟(3.5)得到的已刪除不完整數(shù)據(jù)的XML文檔Fsl,將每個(gè)節(jié)點(diǎn)標(biāo)簽名字,空標(biāo)簽名字除外,添加到列表中;
[0056](3.6.3)統(tǒng)計(jì)列表中的不同元素及其個(gè)數(shù),根據(jù)形式良好的XML文檔的開始標(biāo)簽和結(jié)束標(biāo)簽應(yīng)配套,空標(biāo)簽要關(guān)閉的原理,個(gè)數(shù)為奇數(shù)的元素,第一個(gè)元素除外,即為因分割而缺失的祖先節(jié)點(diǎn)標(biāo)簽名字,將這些標(biāo)簽名字放入另一個(gè)列表中,獲取這些節(jié)點(diǎn)標(biāo)簽名字時(shí),應(yīng)保持其在列表中的原有順序不變;
[0057](3.7)將步驟(3.5)得到的兩個(gè)XML文檔Fsl和Fbl構(gòu)造成形式良好的XML文檔:
[0058](3.7.1)把步驟(3.6.3)得到的列表中的元素用作結(jié)束標(biāo)簽倒序地添加到已刪除不完整數(shù)據(jù)的XML文檔Fsl的尾部;
[0059](3.7.2)把步驟(3.6.3)得到的列表中的元素,第一個(gè)元素除外,用作開始標(biāo)簽正序地添加到已添加不完整數(shù)據(jù)的XML文檔Fbl的首部;
[0060](3.7.3)將步驟(3.6.3)得到的列表中的第一個(gè)元素,即聲明標(biāo)簽名字,用作開始標(biāo)簽添加到上一步得到的XML文檔Fbl的首部,此時(shí),第一次分割就已全部處理完畢。
[0061]其中,第k次分割和第η次分割的過程與第一次分割過程類似。
[0062]本發(fā)明的有益效果主要表現(xiàn)在:有效處理XML文檔特別大的情況、準(zhǔn)確度和精度較高、數(shù)據(jù)處理耗費(fèi)時(shí)間較短、計(jì)算復(fù)雜度較低。
【專利附圖】
【附圖說明】
[0063]圖1是XML樹狀結(jié)構(gòu)圖。
[0064]圖2是XSLT轉(zhuǎn)換過程示意圖。
[0065]圖3是分割式轉(zhuǎn)換大型XML文檔的總體框架圖。
[0066]圖4是分割XML文檔的整體流程圖。
[0067]圖5是第一次分割XML文檔的流程圖。
[0068] 圖6是分割點(diǎn)在開始標(biāo)簽內(nèi)的示意圖,其中,Ca)為分割生成的XML文檔Fsl的尾部,(b)為分割生成的XML文檔Fbl的首部。
[0069]圖7是分割點(diǎn)在結(jié)束標(biāo)簽內(nèi)的示意圖,其中,Ca)為分割生成的XML文檔Fsl的尾部,(b)為分割生成的XML文檔Fbl的首部。
[0070]圖8是第一次初步重構(gòu)處理過程示意圖。
[0071]圖9是第一次再重構(gòu)處理過程示意圖。
【具體實(shí)施方式】
[0072]下面結(jié)合附圖對(duì)本發(fā)明作進(jìn)一步描述。
[0073]參照?qǐng)D1~圖9,一種大型XML文檔轉(zhuǎn)換方法,所述轉(zhuǎn)換方法包括以下兩個(gè)步驟:
[0074]I)分割XML源文檔,過程如下:
[0075]設(shè)定一個(gè)將要進(jìn)行轉(zhuǎn)換的XML源文檔Fs,其大小為Ts,計(jì)算機(jī)可用的最大內(nèi)存為Tm,如果XML文檔非常大,遠(yuǎn)遠(yuǎn)大于計(jì)算機(jī)可用的最大內(nèi)存,即Ts?Tm,或者說,若滿足條件:Ts ^ ηΤω, η>>1,那么在進(jìn)行轉(zhuǎn)換之前需要對(duì)該文檔進(jìn)行分割處理,其具體包括以下步驟:
[0076]1.1)設(shè)定分割閾值Τ,Τ = ^。即,文檔轉(zhuǎn)換時(shí)只使用不超過一半的內(nèi)存空間;
[0077]1.2)進(jìn)行第一次分割,分割后得到兩個(gè)形式良好的XML文檔:
[0078]①Fsl,大小記為 Tsl,Tsl ^ T ;
[0079]②Fbl,大小記為 Tbl, Tbl=Ts-Tsl ^ Ts-T ;
[0080]1.3)若Tba^PTm,進(jìn)行第k次分割,分割后得到兩個(gè)形式良好的XML文檔:
[0081]①Fsk,大小記為 Tsk, Tsk ~T ;
[0082]②Fbk,大小記為 Tbk, Tbk=Tb(H)-Tsk ^ [Ts- (k-1) T] _T=Ts_kT ;
[0083]1.4)> T = 進(jìn)行第η次分割,分割后得到兩個(gè)形式良好的XML文檔:
[0084]①Fsn,大小記為 Tsn,Tsn ~T ;
[0085]②Fbn,大小記為 Tbn, Tbn=Tb(Jri)-Tsn ^ [Ts- (n-1) T] _T=Ts_nT ;
[0086]這時(shí)分割生成的XML文檔Fbn的大小不超過所設(shè)的分割閾值,即Tbn ( T,不再滿足分割條件時(shí)分割結(jié)束;
[0087]2)利用XSLT轉(zhuǎn)換分割生成的多個(gè)XML目標(biāo)文檔。[0088]本實(shí)施例采用先分割后轉(zhuǎn)換的方式,即先以迭代的方式,對(duì)大型XML文檔進(jìn)行分害I],然后將分割生成的多個(gè)形式良好的XML目標(biāo)文檔進(jìn)行轉(zhuǎn)換,其總體框架圖如圖3所示。
[0089]由圖3可見,分割式轉(zhuǎn)換大型XML文檔的實(shí)現(xiàn)包括兩個(gè)重要環(huán)節(jié):
[0090]I)分割XML源文檔。此過程包括兩個(gè)步驟:初步分割和重構(gòu)。
[0091]2)利用XSLT轉(zhuǎn)換分割生成的多個(gè)XML目標(biāo)文檔。
[0092]分割處理過程:假設(shè)現(xiàn)在有一個(gè)將要進(jìn)行轉(zhuǎn)換的XML源文檔Fs,其大小為Ts,計(jì)算機(jī)可用的最大內(nèi)存為Tm。如果XML文檔非常大,遠(yuǎn)遠(yuǎn)大于計(jì)算機(jī)可用的最大內(nèi)存,即Ts?Tm,或者說,若滿足條件:TS ^ ηΤω, η>>1,那么在進(jìn)行轉(zhuǎn)換之前需要對(duì)該文檔進(jìn)行分割處理,其具體包括以下幾個(gè)步驟:
[0093]I)設(shè)定分割閾值T,T = 即,文檔轉(zhuǎn)換時(shí)只使用不超過一半的內(nèi)存空間。
[0094]2)進(jìn)行第一次分割,分割后得到兩個(gè)形式良好的XML文檔:
[0095]①Fsl,大小記為 Tsl,Tsl ^ T ;
[0096]②Fbl,大小記為 Tbl, Tbl=Ts-Tsl ^ Ts-T。
[0097]3)若Tba^PTm,進(jìn)行第k次分割,分割后得到兩個(gè)形式良好的XML文檔:
[0098]①Fsk,大小記為 Tsk, Tsk ^ T ;
[0099]②Fbk,大小記為 Tbk, Tbk=Tb(H)-Tsk ^ [Ts- (k-1) T] _T=Ts_kT。
[0100]4)若Tb(^D)T= ?-進(jìn)行第η次分割,分割后得到兩個(gè)形式良好的XML文檔:
[0101]①Fsn,大小記為 Tsn,Tsn ~T ;
[0102]②Fbn,大小記為 Tbn,HkD-Tsn ^ [Ts- (n-l)T]-T=Ts-nTo
[0103]這時(shí)分割生成的 XML文檔Fbn的大小不超過所設(shè)的分割閾值,即Tbn ( T,不再滿足分割條件,分割結(jié)束。
[0104]由于上述的分割處理過程十分復(fù)雜,為了方便大家的理解與分析,我們將用一個(gè)整體流程圖來表示整個(gè)實(shí)現(xiàn)過程,如圖4所示。
[0105]綜上所述,對(duì)大型XML文檔Fs進(jìn)行所有的分割處理后將得到n+1個(gè)大小約為T的小XML目標(biāo)文檔,它們分別是Fsl,F(xiàn)s2,…,F(xiàn)sk,…Fsn和Fbn。分割處理前,源XML文檔非常大,遠(yuǎn)遠(yuǎn)大于計(jì)算機(jī)可用的最大內(nèi)存,即Ts?Tm。當(dāng)進(jìn)行第k次分割處理時(shí),將要被分割的XML文檔Fbari)的大小就只是略大于計(jì)算機(jī)可用最大內(nèi)存Tm,即TbariAT1^當(dāng)進(jìn)行第η次分割處理時(shí),將要被分割的XML文檔Fb(Iri)的大小就只是略大于分割閾值T,即且此次分割生成的XML文檔Fbn不再滿足分割條件,分割結(jié)束。
[0106]第一次分割處理過程:
[0107]由于每一次分割方法都是相同的,因此我們將以第一次分割為例,詳細(xì)地介紹每次分割處理都涉及哪些環(huán)節(jié)和內(nèi)容。根據(jù)圖4,我們可以得到第一次分割XML文檔的流程圖如圖5所示。
[0108]假設(shè)現(xiàn)在有一個(gè)將要進(jìn)行轉(zhuǎn)換的XML文檔Fs,大小為Ts,計(jì)算機(jī)可用的最大內(nèi)存為Tm。如果XML文檔非常大,遠(yuǎn)遠(yuǎn)大于計(jì)算機(jī)可用的最大內(nèi)存,即Ts?Tm,或者說,若滿足條件:TS ^ nTm,n?l,那么在進(jìn)行轉(zhuǎn)換之前需要對(duì)該文檔進(jìn)行分割處理,其具體包括以下3個(gè)步驟:
[0109](I)設(shè)定分割閾值T,T =[0110](2)初步分割XML源文檔Fs,生成兩個(gè)非“形式良好的” XML文檔:
[0111]①Fsl,大小記為 Tsl,Tsl ~T;
[0112]②Fbl,大小記為 Tbl, Tbl=Ts-Tsl ^ Ts-T ;
[0113](3)重構(gòu)上一步生成的兩個(gè)XML文檔Fsl和Fbl,具體實(shí)現(xiàn)過程如下:
[0114](3.1)讀取初步分割生成的XML文檔Fsl ;
[0115](3.2)將指針定位到尾部;
[0116](3.3)向前搜索結(jié)束標(biāo)簽的開始標(biāo)記“〈/”,并記錄其位置為L(zhǎng)1 ;
[0117](3.4)從L1開始向后搜索相應(yīng)的結(jié)束標(biāo)記“〉”,并記錄其位置為L(zhǎng)2,此時(shí)會(huì)有兩種可能:
[0118]如果能夠搜到結(jié)束標(biāo)記“〉”,那么L2的值就是該標(biāo)記的位置值。例如,當(dāng)分割點(diǎn)在開始標(biāo)簽內(nèi)時(shí),如圖6所示,就滿足此種情況;
[0119]反之,如果未能搜到結(jié)束標(biāo)記“>”,這時(shí)應(yīng)將指針定位到L1處,再一次執(zhí)行步驟(3.3),得到新的L1值后,再執(zhí)行步驟(3.4),獲取新的L2值,這個(gè)新的L2值才是該情況下結(jié)束標(biāo)記的真正位置。例如,當(dāng)分割點(diǎn)在結(jié)束標(biāo)簽內(nèi)時(shí),如圖7所示,就滿足此情況。
[0120](3.5)將因分割而導(dǎo)致的不完整數(shù)據(jù)從Fsl的尾部移到Fbl的首部。
[0121](3.6)獲取因分割而缺失的所有祖先節(jié)點(diǎn)的標(biāo)簽名字,具體步驟如下:
[0122](3.6.1)設(shè)定讀取標(biāo)志fIag=True,當(dāng)讀取的值的長(zhǎng)度大小或等于O時(shí),fIag=False ;
[0123](3.6.2)讀取步驟(3.5)得到的已刪除不完整數(shù)據(jù)的XML文檔Fsl,將每個(gè)節(jié)點(diǎn)標(biāo)簽名字,空標(biāo)簽名字除外,添加到列表中;
[0124]3.6.3)統(tǒng)計(jì)列表中的不同元素及其個(gè)數(shù),根據(jù)1.1節(jié)介紹的形式良好的XML文檔的開始標(biāo)簽和結(jié)束標(biāo)簽應(yīng)配套,空標(biāo)簽要關(guān)閉的原理,個(gè)數(shù)為奇數(shù)的元素,第一個(gè)元素除外,即為因分割而缺失的祖先節(jié)點(diǎn)標(biāo)簽名字,將這些標(biāo)簽名字放入另一個(gè)列表中。值得注意的是,獲取這些節(jié)點(diǎn)標(biāo)簽名字時(shí),應(yīng)保持其在列表中的原有順序不變。
[0125](3.7)將步驟(3.5)得到的兩個(gè)XML文檔Fsl和Fbl構(gòu)造成形式良好的XML文檔:
[0126](3.7.1)把步驟(3.6.3)得到的列表中的元素用作結(jié)束標(biāo)簽倒序地添加到已刪除不完整數(shù)據(jù)的XML文檔Fsl的尾部;
[0127](3.7.2)把步驟(3.6.3)得到的列表中的元素,第一個(gè)元素除外,用作開始標(biāo)簽正序地添加到已添加不完整數(shù)據(jù)的XML文檔Fbl的首部;
[0128](3.7.3)將步驟(3.6.3)得到的列表中的第一個(gè)元素,即聲明標(biāo)簽
[0129]名字,用作開始標(biāo)簽添加到上一步得到的XML文檔Fbl的首部。
[0130]此時(shí),第一次分割就已全部處理完畢。其中,步驟(3.1)至(3.5)實(shí)現(xiàn)了初步重構(gòu)處理過程,生成了“已刪除不完整數(shù)據(jù)的XML文檔Fsl"和“已添加不完整數(shù)據(jù)的XML文檔Fbl”,該過程的流程圖如圖8所示。步驟(3.3)和(3.4)完成了由開始標(biāo)記“〈/”和結(jié)束標(biāo)記“〉”構(gòu)成的完整標(biāo)簽的查找,從而獲得了此完整標(biāo)簽后的所有數(shù)據(jù)內(nèi)容,這里將其稱作是“不完整數(shù)據(jù)”。步驟(3.6)和(3.7)被稱作是再重構(gòu)過程,最終生成了兩個(gè)形式良好的XML文檔Fsl和Fbl,具體的實(shí)現(xiàn)流程圖如圖9所不。
[0131]本實(shí)施例中,分割處理,解決了大XML文檔因內(nèi)存限制而無法轉(zhuǎn)換的問題。
[0132]XML作為數(shù)據(jù)傳輸和存儲(chǔ)的標(biāo)準(zhǔn),處理的數(shù)據(jù)量越大,如海量數(shù)據(jù),用于存儲(chǔ)數(shù)據(jù)的XML文檔越大。由于在轉(zhuǎn)換的過程中,需要先將XML文檔解析成DOM樹存放在內(nèi)存中,因此文檔過大可能導(dǎo)致內(nèi)存溢出,轉(zhuǎn)換也就無法進(jìn)行。
[0133]本方案的主要思想是先將一個(gè)大XML文檔分割成多個(gè)形式良好的小XML文檔,然后再對(duì)這些形式良好的小XML文檔進(jìn)行轉(zhuǎn)換。這樣就不會(huì)出現(xiàn)因內(nèi)存不足而無法進(jìn)行轉(zhuǎn)換的現(xiàn)象。
[0134]采用“迭代”的分割方式,處理簡(jiǎn)單;且相對(duì)于當(dāng)前常用的“隨機(jī)”的分割方式,不會(huì)出現(xiàn)漏分割和多次重復(fù)分割的現(xiàn)象。
[0135]本方案采用的是“迭代”的分割方式,即先對(duì)大型XML源文檔Fs進(jìn)行第一次分割處理,生成兩個(gè)XML文檔Fsl和Fbl,然后再對(duì)Fbl進(jìn)行第二次分割處理,生成兩個(gè)XML文檔Fs2和Fb2,然后再對(duì)Fb2進(jìn)行第三次分割處理,依此類推,直到某一次分割處理后生成的Fbi的大小Tbi不再滿足分割條件:
[0136]Tbi>T,i=l, 2,…η
[0137]為止。這樣做的好處是:
[0138]I)簡(jiǎn)單、易處理。如果采用“一次性”分割的方式,將會(huì)同時(shí)生成多個(gè)小XML文檔,在對(duì)其中一個(gè)文檔,第一個(gè)和最后一個(gè)文檔除外,進(jìn)行下一步處理的過程中,還需要考慮它的前一個(gè)和后一個(gè)文檔,這樣操作起來比較復(fù)雜、困難。
[0139]2)相對(duì)于“隨機(jī)”分割方式而言,不會(huì)發(fā)生漏分割和多次重復(fù)分割的現(xiàn)象。如果采用隨機(jī)分割方 式,難免會(huì)出現(xiàn)對(duì)某次分割生成的仍舊很大的XML文檔漏分割,和已經(jīng)很小的XML文檔多次分割的現(xiàn)象,也就是說,不僅仍存在大XML文檔因內(nèi)存限制而無法進(jìn)行轉(zhuǎn)換的問題,還增添了小XML文檔因多次進(jìn)行無用的分割處理而產(chǎn)生的耗時(shí)大、系統(tǒng)速度變慢等問題。
[0140]分割處理后產(chǎn)生的所有小XML目標(biāo)文檔都是“形式良好的”,使得下一步的解析操作成為可能,且解析具有相對(duì)獨(dú)立性、高效性和高可靠性;分割處理后的這些形式良好的小XML文檔仍然可以進(jìn)行獨(dú)立、快速的拆分、組裝等操作。
[0141 ] 本方案中,每一輪分割處理后,都將對(duì)所生成的兩個(gè)XML文檔Fsi和Fbi進(jìn)行重構(gòu)處理,且處理后得到的XML文檔都是“形式良好的”。這樣做的好處是:
[0142]I)對(duì)分割后生成的XML文檔可以進(jìn)行解析操作。傳統(tǒng)的XML分割算法中,只是對(duì)XML文檔進(jìn)行單純的分割處理,將生成多個(gè)非“形式良好的”XML文檔,這樣的XML文檔是無法進(jìn)行解析的。
[0143]2)解析具有相對(duì)獨(dú)立性。由于分割生成的每一個(gè)小XML文檔都是“形式良好的”,因此,任意一個(gè)小XML文檔的解析都不依賴于其它的小XML文檔,也就是說,每一個(gè)小XML文檔都可以獨(dú)立地完成解析操作。
[0144]3)解析具有高效性。由于解析具有相對(duì)獨(dú)立性,因此,我們除了可以采用流式解析方法,還可以采用并行式解析方法,這樣就大大地提高了解析的效率。
[0145]4)解析具有高可靠性。由于解析具有相對(duì)獨(dú)立性,因此,一個(gè)小XML文檔的丟失并不會(huì)影響其它小XML的解析,也就是說,每一個(gè)解析出來的結(jié)果都是有效的,接收端只需要通知發(fā)送端重新發(fā)送已丟失的文檔,再對(duì)它們進(jìn)行解析即可,這也就大大地提高了解析的可靠性。
[0146]5)分割生成的小XML文檔仍然可以執(zhí)行各種并行操作,如拆分和組裝。由于分割生成的每一個(gè)小XML文檔都是“形式良好的”,我們可以采用并行的方式,對(duì)這小XML文檔進(jìn)行快速地拆分和組裝等操作。
[0147]具有普遍適用性和應(yīng)用的靈活性??蛇m用于任意內(nèi)存大小的設(shè)備或任意大小的XML文檔,特別適用于一些內(nèi)存較小的手持設(shè)備和嵌入式系統(tǒng),也特別適用于海量數(shù)據(jù)的轉(zhuǎn)換處理。具體表現(xiàn)在:
[0148]I)可用于任意內(nèi)存大小的設(shè)備或任意大小的XML文檔。無論文檔的大小Ts有沒有超過計(jì)算機(jī)可用內(nèi)存^的限制,我們都可以合理地設(shè)定一個(gè)分割閾值T,對(duì)文檔進(jìn)行分割處理后,再進(jìn)行轉(zhuǎn)換處理,這樣做不僅可以減小轉(zhuǎn)換過程中所占用的內(nèi)存空間,還可以提高轉(zhuǎn)換的效率。
[0149]2)特別適用于一些內(nèi)存較小的手持設(shè)備或嵌入式系統(tǒng)。目前,常見的嵌入式系統(tǒng)和手持設(shè)備的內(nèi)存大小各異,小的只有幾KB,多的有幾GB。傳統(tǒng)XML數(shù)據(jù)轉(zhuǎn)換算法無法同時(shí)滿足這些設(shè)備的要求。使用本算法對(duì)原始XML文檔進(jìn)行分割,分割生成的小XML文檔,一方面“形式良好”,另一方面其大小也適合相應(yīng)的嵌入式系統(tǒng)或手持設(shè)備,就可以使用這些設(shè)備進(jìn)行分步轉(zhuǎn)換和后續(xù)處理。[0150]3)特別適用于海量數(shù)據(jù)的轉(zhuǎn)換處理。雖然有些設(shè)備的內(nèi)存很大,但是對(duì)于海量數(shù)據(jù)的轉(zhuǎn)換處理卻是遠(yuǎn)遠(yuǎn)不夠的。經(jīng)過本方案的分割處理后,只需要較小的內(nèi)存空間就可以實(shí)現(xiàn)所有小XML文檔的轉(zhuǎn)換。
[0151]應(yīng)用廣泛,既可以用于轉(zhuǎn)換,也可以用于解析和傳輸。
[0152]I)可應(yīng)用于轉(zhuǎn)換的過程中,解決了大XML文檔因內(nèi)存限制而無法轉(zhuǎn)換的問題。
[0153]2)可應(yīng)用于解析的過程中,且可以采用兩種方式進(jìn)行解析:流式和并行式。其中,“流式”解析法是指按次序地逐個(gè)進(jìn)行解析,在本算法中就是指按著分割生成的文檔次序逐個(gè)進(jìn)行解析;“并行式”解析法是指同時(shí)進(jìn)行解析,在本算法中就是指同時(shí)對(duì)所有分割生成的文檔進(jìn)行解析,該方法使得解析具有更高的效率。
[0154]3)可應(yīng)用于傳輸?shù)倪^程中,提高了傳輸?shù)男屎腿蒎e(cuò)性。
[0155]a) “高效性”:由于解析可以采用流的方式,因此在發(fā)送端我們可以采用邊解析邊傳輸?shù)姆绞?,而無需等待其全部解析完后再傳輸,而且,在接收端也可以采用邊接收邊組裝的方式,這樣就大大地提高了發(fā)送和接收的效率。
[0156]b) “容錯(cuò)性”:如果分割生成的小XML文檔是非“形式良好的”,那么當(dāng)接收端接收到的某個(gè)文檔出現(xiàn)傳輸錯(cuò)誤、與其它文檔不匹配時(shí),就需要發(fā)送端重新發(fā)送全部數(shù)據(jù)內(nèi)容。反之,若是“形式良好的”,則只需要重新發(fā)送錯(cuò)誤的數(shù)據(jù)內(nèi)容。有效地提高了傳輸?shù)目煽啃院托省?br>
【權(quán)利要求】
1.一種大型XML文檔轉(zhuǎn)換方法,其特征在于:所述轉(zhuǎn)換方法包括以下步驟: 1)分割XML源文檔,過程如下: 設(shè)定一個(gè)將要進(jìn)行轉(zhuǎn)換的XML源文檔Fs,其大小為Ts,計(jì)算機(jī)可用的最大內(nèi)存為Tm,如果XML文檔非常大,遠(yuǎn)遠(yuǎn)大于計(jì)算機(jī)可用的最大內(nèi)存,即Ts?Tm,或者說,若滿足條件:Ts ^ ηΤω, η>>1,在進(jìn)行轉(zhuǎn)換之前對(duì)該文檔進(jìn)行分割處理,包括以下步驟: 1.0設(shè)定分割閾值Τ,τ = ¥,即,文檔轉(zhuǎn)換時(shí)只使用不超過一半的內(nèi)存空間; 1.2)進(jìn)行第一次分割,分割后得到兩個(gè)形式良好的XML文檔: ①Fsl,大小記為Tsl,Tsl乂 T ;
②Fbl,大小記為 Tbl,Tbl=Ts-Tsl ^ Ts-T ; 1.3)若進(jìn)行第k次分割,分割后得到兩個(gè)形式良好的XML文檔: ①Fsk,大小記為Tsk,Tsk~T;
②Fbk,大小記為 Tbk,Tbk=Tb(H)-Tsk ^ [Ts-(k-l)T]-T=Ts-kT ; 1.4) ^Tb(n_t) > T = 進(jìn)行第η次分割,分割后得到兩個(gè)形式良好的XML文檔: ①Fsn,大小記為Tsn,Tsn^ T ;
②Fbn,大小記為 Tbn,Tbn=Tb(Jri)-Tsn ^ [Ts-(n-l)T]-T=Ts-nT ; 這時(shí)分割生成的XML文檔Fbn的大小不超過所設(shè)的分割閾值,即Tbn ( T,不再滿足分割條件時(shí)分割結(jié)束; 2)利用XSLT轉(zhuǎn)換分割生成的多個(gè)XML目標(biāo)文檔。
2.如權(quán)利要求1所述的一種大型XML文檔轉(zhuǎn)換方法,其特征在于:所述步驟1.2)中,第一次分割的處理過程如下: (1)設(shè)定分割閾值1',1'= ¥; (2)初步分割XML源文檔Fs,生成兩個(gè)非“形式良好的”XML文檔: ①Fsl,大小記為Tsl,Tsl乂 T ;
②Fbl,大小記為 Tbl,Tbl=Ts-Tsl ^ Ts-T ; (3)重構(gòu)上一步生成的兩個(gè)XML文檔Fsl和Fbl,具體實(shí)現(xiàn)過程如下: (3.1)讀取初步分割生成的XML文檔Fsl ; (3.2)將指針定位到尾部; (3.3)向前搜索結(jié)束標(biāo)簽的開始標(biāo)記“〈/”,并記錄其位置為L(zhǎng)1 ; (3.4) WL1開始向后搜索相應(yīng)的結(jié)束標(biāo)記“〉”,并記錄其位置為L(zhǎng)2,此時(shí)會(huì)有兩種可倉(cāng)泛: 如果能夠搜到結(jié)束標(biāo)記“〉”,那么L2的值就是該標(biāo)記的位置值; 反之,如果未能搜到結(jié)束標(biāo)記“>”,這時(shí)應(yīng)將指針定位到L1處,再一次執(zhí)行步驟(3.3),得到新的L1值后,再執(zhí)行步驟(3.4),獲取新的L2值,這個(gè)新的L2值才是該情況下結(jié)束標(biāo)記的真正位置; (3.5)將因分割而導(dǎo)致的不完整數(shù)據(jù)從Fsl的尾部移到Fbl的首部; (3.6)獲取因分割而缺失的所有祖先節(jié)點(diǎn)的標(biāo)簽名字,具體步驟如下: (3.6.1)設(shè)定讀取標(biāo)志fIag=True,當(dāng)讀取的值的長(zhǎng)度大小或等于O時(shí),fIag=False ;(3.6.2)讀取步驟(3.5)得到的已刪除不完整數(shù)據(jù)的XML文檔Fsl,將每個(gè)節(jié)點(diǎn)標(biāo)簽名字,空標(biāo)簽名字除外,添加到列表中; (3.6.3)統(tǒng)計(jì)列表中的不同元素及其個(gè)數(shù),根據(jù)形式良好的XML文檔的開始標(biāo)簽和結(jié)束標(biāo)簽應(yīng)配套,空標(biāo)簽要關(guān)閉的原理,個(gè)數(shù)為奇數(shù)的元素,第一個(gè)元素除外,即為因分割而缺失的祖先節(jié)點(diǎn)標(biāo)簽名字,將這些標(biāo)簽名字放入另一個(gè)列表中,獲取這些節(jié)點(diǎn)標(biāo)簽名字時(shí),應(yīng)保持其在列表中的原有順序不變; (3.7)將步驟(3.5)得到的兩個(gè)XML文檔Fsl和Fbl構(gòu)造成形式良好的XML文檔: (3.7.1)把步驟(3.6.3)得到的列表中的元素用作結(jié)束標(biāo)簽倒序地添加到已刪除不完整數(shù)據(jù)的XML文檔Fsl的尾部; (3.7.2)把步驟(3.6.3)得到的列表中的元素,第一個(gè)元素除外,用作開始標(biāo)簽正序地添加到已添加不完整數(shù)據(jù)的XML文檔Fbl的首部; (3.7.3)將步驟(3.6.3)得到的列表中的第一個(gè)元素,即聲明標(biāo)簽名字,用作開始標(biāo)簽添加到上一步得到的X ML文檔Fbl的首部,此時(shí),第一次分割就已全部處理完畢。
【文檔編號(hào)】G06F17/30GK103544260SQ201310484662
【公開日】2014年1月29日 申請(qǐng)日期:2013年10月16日 優(yōu)先權(quán)日:2013年10月16日
【發(fā)明者】王冬雪, 麻銳, 孟利民, 王輝, 張標(biāo)標(biāo) 申請(qǐng)人:銀江股份有限公司