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