張 濤,方少卿
(銅陵職業(yè)技術(shù)學(xué)院,安徽銅陵 244061)
[通訊作者]方少卿(1965- ),男,教授,碩士,從事Web數(shù)據(jù)挖掘研究。
目前,云計算技術(shù)與應(yīng)用正在蓬勃發(fā)展,大數(shù)據(jù)處理技術(shù)也取得了長足的進步,企業(yè)和單位在積極進行智慧化建設(shè),紛紛把業(yè)務(wù)處理和數(shù)據(jù)處理搬到云端,提升了數(shù)據(jù)指導(dǎo)決策的應(yīng)用價值。隨著云計算、移動互聯(lián)網(wǎng)、物聯(lián)網(wǎng)的快速發(fā)展,數(shù)據(jù)增長規(guī)模加快,半結(jié)構(gòu)化及非結(jié)構(gòu)化的數(shù)據(jù)呈指數(shù)級增長。云計算、大數(shù)據(jù)時代的到來將給各行各業(yè)帶來根本性的變革。
XML(eXtensible Markup Language),即可擴展標識語言,對結(jié)構(gòu)化、半結(jié)構(gòu)化的數(shù)據(jù)表示具有先天的優(yōu)勢。在云計算技術(shù)廣泛應(yīng)用和發(fā)展的今天,XML業(yè)已成為數(shù)據(jù)表示和交換的標準[1]。當(dāng)前,用XML描述的數(shù)據(jù)在云計算、大數(shù)據(jù)時代增長迅猛,應(yīng)用領(lǐng)域也在不斷擴大。對于云計算環(huán)境下XML的研究,大部分是基于XML查詢的[2],對XML更新研究的較少,往往借助傳統(tǒng)標準進行實現(xiàn),缺少標準支持。因此,把XML數(shù)據(jù)遷移到云計算平臺中,對XML更新標準和技術(shù)的研究成為一項具有重要意義的內(nèi)容。
XML在云平臺上架起了各類數(shù)據(jù)之間交互的橋梁,是不同平臺、組件間進行數(shù)據(jù)交換、集成的中間表示形式,是配置文件的重要數(shù)據(jù)載體,信息表示方便[1]。對于XML文檔的管理方式主要有:文件系統(tǒng)平面文件、關(guān)系數(shù)據(jù)庫、面向?qū)ο髷?shù)據(jù)庫、Native XML數(shù)據(jù)庫。Native XML數(shù)據(jù)庫保存XML文檔能做到不丟失信息,在管理XML數(shù)據(jù)上具有突出優(yōu)勢。在云平臺進行原生XML數(shù)據(jù)存儲和管理,對原始數(shù)據(jù)的結(jié)構(gòu)化、非結(jié)構(gòu)化的展現(xiàn)和數(shù)據(jù)安全有著重要的意義。XML技術(shù)將成為云計算、大數(shù)據(jù)發(fā)展的基礎(chǔ)技術(shù)[3]。當(dāng)前,Native XML數(shù)據(jù)庫的研究已進入相對成熟的時期,基于DBaaS技術(shù),將Native XML數(shù)據(jù)庫與云計算平臺整合可以進一步拓展云平臺的處理能力,并為XML數(shù)據(jù)管理提供一個良好的方式。
XPath和XQuery是W3C推薦的XML文檔查詢語言。更新作為管理XML數(shù)據(jù)的一個重要功能,當(dāng)前還沒有一個統(tǒng)一的語言和操作標準,XML文檔更新實現(xiàn)主要是基于XQuery語言擴展和自定義模型的更新[4]。XUpdate[5]更新語言為XML數(shù)據(jù)的更新操作提供了實際規(guī)范,推動了XML更新技術(shù)以及Native XML數(shù)據(jù)庫的發(fā)展。XUpdate(XML Update Language)由XML∶DB Initiative制定,其功能是更新XML文檔中的數(shù)據(jù)。XUpdate是一種基于XML的詞匯表,類似于XSLT,但比XSLT要簡單。XUpdate語言僅對如何修改XML數(shù)據(jù)作了明確定義,查詢文檔節(jié)點是通過XPath語法實現(xiàn)的。
Xupdate基于XML語法描述,制定的元素類型有:xupdate∶element、xupdate∶text、xupdate∶comment、xupdate∶processing-instruction、xupdate∶variable、xupdate∶cdata、xupdate∶attribute。XUpdate制定的操作命令有:xupdate∶insert-before、xupdate∶insert-after、xupdate∶update、xupdate∶append、xupdate∶rename、xupdate∶remove、xupdate∶variable、xupdate∶value-of。
XUpdate語言的命名空間是http://www.xmldb.org/xupdate,更新語句使用XML文檔描述,根元素為xupdate∶modifications。xupdate∶modifications元素有一個表示XUpdate使用的版本的version屬性,目前版本為1.0。xupdate∶modifications包含基本更新指令元素,用于更新XML數(shù)據(jù)。
XUpdate更新XML數(shù)據(jù),通過XPath查詢更新節(jié)點,更新XML文檔的操作為:insert、update、append、rename、remove等。同時,為了更好地執(zhí)行更新指令,還應(yīng)包含自定的variables。
(1)Insert指令用于向XML文檔中添加新的內(nèi)容,可在節(jié)點后(xupdate∶insert-after)添加和節(jié)點前(xupdate∶insert-before)添加數(shù)據(jù),通過XPath表達式表示的select屬性獲取待操作的節(jié)點。Insert指令可向XML文檔中添加的數(shù)據(jù)類型有元素、文本、預(yù)處理指令、屬性、注解、節(jié)點。語法示例:
xmlns∶xupdate="http://www.xmldb.org/xupdate">
(2)xupdate∶append指令用于向XML文檔中追加新建的元素節(jié)點,其select屬性用于選擇操作節(jié)點,child屬性(整型值)用于定位新建節(jié)點在被選擇節(jié)點中子節(jié)點的位置(默認為最后一個子節(jié)點)。xupdate∶append指令可追加的元素與Insert指令類似。語法示例:
(3)xupdate∶update指令用于更新節(jié)點內(nèi)容,其屬性select指定待更新節(jié)點。語法示例:
Greatest Hits
(4)xupdate∶remove指令用來刪除XML文檔數(shù)據(jù)節(jié)點,其屬性select獲取待刪除節(jié)點。語法示例:
(5)xupdate∶rename指令用于對XML數(shù)據(jù)的屬性或者元素節(jié)點進行重命名操作,通過select屬性(值須為元素或?qū)傩怨?jié)點集)獲取待重命名的節(jié)點。語法示例:
title
(6)xupdate∶variable元素用于自定義更新變量。變量名通過name屬性定義,變量的值可通過XPath表達式獲取。對變量的引用xupdate∶value-of元素獲取。語法示例:
XUpdate的基礎(chǔ)語法、語義都簡單明確,通過基礎(chǔ)更新指令間的組合,可構(gòu)建出多變的更新語句,為云平臺下的XML數(shù)據(jù)更新提供了一個良好的機制。
圖1 XUpdate更新架構(gòu)
基于對Native XML數(shù)據(jù)庫的拓展,結(jié)合開源框架類庫,對XUpdate語言進行實現(xiàn)。采用模塊化、低耦合開發(fā)實現(xiàn),處理框架見圖1。
基于XUpdate更新語言處理XML文檔的開發(fā)實現(xiàn)由1個協(xié)調(diào)控制器和5個子模塊組成。5個子模塊為:XUpdate語言編譯、XML文檔存取、XUpdate指令執(zhí)行、結(jié)果輸出以及事務(wù)處理模塊。
XUpdate更新命令通過XUpdate語言編譯模塊進行解析,轉(zhuǎn)換成內(nèi)部命令表示;基于命令中的select屬性值進XPath表達式解析,獲取待更新的數(shù)據(jù)信息;XUpdate協(xié)調(diào)控制器調(diào)用XUpdate命令執(zhí)行模塊遍執(zhí)行命令集中的具體命令操作; XML文檔存取模塊負責(zé)把更新后的XML文檔存入存儲介質(zhì)(如:Native XML數(shù)據(jù)庫);通過對文檔加鎖機制和延遲寫入實現(xiàn)更新過程中的事務(wù)處理模塊。
3.2.1 XUpdate語言編譯
XUpdate更新命令以XML來描述,基于SAX解析XUpdate更新命令[6],生成基礎(chǔ)的更新處理信息,通過Vector數(shù)據(jù)結(jié)構(gòu)保存解析結(jié)果,完成內(nèi)部命令表示。主要算法思想如下:
遍歷XUpdate更新語句文檔{
對于命名空間URL,加入命名空間Vector;
對于文本節(jié)點,添加文本處理指令,保存到文本Vector,在文本節(jié)點末,添加文本處理結(jié)束標志;
對于元素節(jié)點開始標記,
若該元素為更新指令元素,把指令轉(zhuǎn)化為內(nèi)部整數(shù)表示,添加該指令及其屬性分別到命令、屬性Vector;
若為Insert、Append指令的待更新元素,在命令Vector里添加元素指示指令和屬性指示指令,對元素名進行命名空間映射,并添加到屬性Vector中。對待更新元素的子元素進行同樣的遍歷操作。
對于元素節(jié)點結(jié)束標記,
若該元素為更新指令元素,在命令Vector里添加命令結(jié)束指令;
若為Insert、Append指令的待更新元素,在命令Vector里添加元素指示結(jié)束指令;
}
對于下面XUpdate語句,解析后,更新命令Vector表示見表1。
表1 更新命令Vector
3.2.2 XML文檔更新實現(xiàn)
更新命令表示為內(nèi)部定義的整型常量。XML文檔更新基于XUpdate編譯后Vector內(nèi)部命令對待更新的XML文檔進行操作。XUpdate操作實現(xiàn)算法如下:
獲取待更新的XML文檔;
遍歷命令Vector,根據(jù)select屬性選擇上下文節(jié)點{
對于屬性指示指令,構(gòu)建屬性元素;
對于文本節(jié)點,構(gòu)建字符串元素,
對于variable命令,把屬性seclect指定的節(jié)點集保存在HashTable中;
對于其他命令,根據(jù)命令類型,調(diào)用響應(yīng)的execute()方法執(zhí)行對應(yīng)的更新操作;
}
保存更新后的結(jié)果。
XUpdate的命令主要為:插入、刪除、更新。定義一個基礎(chǔ)命令處理類,具體命令的實現(xiàn)繼承于基礎(chǔ)命令類,并改寫自己命令的實現(xiàn),實現(xiàn)調(diào)用格式的統(tǒng)一。基本算法如下:
(1)remove指令
被刪除的對象為屬性,獲取其所屬節(jié)點元素,調(diào)用節(jié)點刪除屬性方法刪除;
被刪除的對象為元素,獲取其父節(jié)點元素,調(diào)用節(jié)點刪除子節(jié)點方法刪除;
(2)append指令
獲取待追加的元素及其屬性;
遍歷所選擇節(jié)點集,在child屬性指定位置,追加命令操作對象。
(3)insert操作
獲取待插入的元素及其屬性;
遍歷所選擇節(jié)點集,在每個節(jié)點的前/后追加命令操作對象。
insert-after算法與insert-before算法類似。進行插入操作(包括append)需要基于namespaces、characters、attributes信息創(chuàng)建新節(jié)點,基于DOM模型構(gòu)建出attribute、element、comment、text、CDATA,processing instruction以及variable對應(yīng)的節(jié)點集,用于對XML文檔進行更新。
(4)update操作
遍歷所選擇節(jié)點集{
對于元素節(jié)點,刪除節(jié)點對應(yīng)的文本節(jié)點,在追加上更新的文本節(jié)點;
對于文本節(jié)點,改變當(dāng)前節(jié)點的值;
對于屬性、注釋等節(jié)點,直接設(shè)置其替換值即可;
}
(5)rename操作
遍歷所選擇節(jié)點集,獲取所更新節(jié)點的父節(jié)點{
對于屬性節(jié)點,獲取屬性所屬節(jié)點元素,添加新屬性,刪除原有屬性;
對于處理指令節(jié)點,創(chuàng)建新處理指令節(jié)點替換原有的指令節(jié)點;
對于元素節(jié)點,創(chuàng)建新元素節(jié)點{
遍歷待重命名元素的屬性,轉(zhuǎn)換命名空間后,在新元素節(jié)點上添加之;
遍歷待重命名元素的子元素,轉(zhuǎn)換命名空間后,在新元素節(jié)點上添加之;
父節(jié)點替換原有的元素節(jié)點為新創(chuàng)建的元素節(jié)點;
}
}
rename操作的對象須為元素節(jié)點、屬性節(jié)點或者處理指令。
結(jié)合以上XUpdate更新處理架構(gòu),基于Java語言和開源框架,在Eclipse開發(fā)環(huán)境進行編碼測試,結(jié)合云計算實驗平臺,通過虛擬機和PaaS平臺部署測試代碼,能夠成功地對XML數(shù)據(jù)進行更新,為云平臺基于模板的配置文件更新、XML數(shù)據(jù)管理提供了一種有意義的方式。
XUpdate更新實施主要包括XUpdate語言解析和XUpdate更新命令執(zhí)行,經(jīng)測試,對XUpdate更新文檔的解析一般為30ms左右,對常規(guī)XML文檔的處理,根據(jù)命令的復(fù)雜度和文檔規(guī)模的不同,用時一般基于200~1000ms之間。更新性能與傳統(tǒng)的基于DOM的XML文檔更新進行比較[6],在小規(guī)模XML文檔更新上兩者相率相當(dāng),但隨著XML文檔規(guī)模的提升,基于XUpdate的更新處理顯示了較好的更新性能,效率提高15%~40%。
云計算、大數(shù)據(jù)技術(shù)的發(fā)展進一步促進了XML數(shù)據(jù)的應(yīng)用和快速增長,本文基于XUpdate語言對XML文檔的更新技術(shù)進行了研究和實施,提供了XML文檔更新操作的基礎(chǔ)規(guī)范和體系結(jié)構(gòu),對云計算環(huán)境下基于XUpdate的XML更新研究有著一定的實踐意義。XML文檔的更新是一個復(fù)雜的過程,更新時的事務(wù)處理、XML更新標準、基于云計算平臺的XML更新技術(shù)以及Native XML 數(shù)據(jù)庫、XUpdate與云平臺的融合,都是需要進一步解決的問題。
[參考文獻]
[1]趙偉,卓偉,李占波,等.基于云計算的一種新的數(shù)據(jù)交換架構(gòu)[J].計算機工程與科學(xué),2013(8):15-19.
[2]魏永山,張峰,陳欣,等.一種云計算環(huán)境下的XML查詢數(shù)據(jù)服務(wù)的優(yōu)化方法[J].計算機工程與科學(xué),2013(6):31-36.
[3]王向陽.基于Hadoop的海量小型XML數(shù)據(jù)挖掘的研究[D].西安:西安郵電大學(xué),2016.
[4]馬程,徐海燕.基于CB+-tree的時態(tài)XML索引動態(tài)更新方法[J].廣東石油化工學(xué)院學(xué)報,2016(1):44-47.
[5]Andreas Laux,Lars Martin.XML Update Language(XUpdate)[EB/OL].(2000-09-14)[2017-08-08].http://xmldb-org.sourceforge.net/xupdate/xupdate-wd.html.
[6]王磊,張紅梅,姚保峰,等.XML文檔解析技術(shù)研究[J].常州工學(xué)院學(xué)報,2013(5):36-41.