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