張 濤,方少卿
(銅陵職業技術學院,安徽銅陵 244061)
[通訊作者]方少卿(1965- ),男,教授,碩士,從事Web數據挖掘研究。
目前,云計算技術與應用正在蓬勃發展,大數據處理技術也取得了長足的進步,企業和單位在積極進行智慧化建設,紛紛把業務處理和數據處理搬到云端,提升了數據指導決策的應用價值。隨著云計算、移動互聯網、物聯網的快速發展,數據增長規模加快,半結構化及非結構化的數據呈指數級增長。云計算、大數據時代的到來將給各行各業帶來根本性的變革。
XML(eXtensible Markup Language),即可擴展標識語言,對結構化、半結構化的數據表示具有先天的優勢。在云計算技術廣泛應用和發展的今天,XML業已成為數據表示和交換的標準[1]。當前,用XML描述的數據在云計算、大數據時代增長迅猛,應用領域也在不斷擴大。對于云計算環境下XML的研究,大部分是基于XML查詢的[2],對XML更新研究的較少,往往借助傳統標準進行實現,缺少標準支持。因此,把XML數據遷移到云計算平臺中,對XML更新標準和技術的研究成為一項具有重要意義的內容。
XML在云平臺上架起了各類數據之間交互的橋梁,是不同平臺、組件間進行數據交換、集成的中間表示形式,是配置文件的重要數據載體,信息表示方便[1]。對于XML文檔的管理方式主要有:文件系統平面文件、關系數據庫、面向對象數據庫、Native XML數據庫。Native XML數據庫保存XML文檔能做到不丟失信息,在管理XML數據上具有突出優勢。在云平臺進行原生XML數據存儲和管理,對原始數據的結構化、非結構化的展現和數據安全有著重要的意義。XML技術將成為云計算、大數據發展的基礎技術[3]。當前,Native XML數據庫的研究已進入相對成熟的時期,基于DBaaS技術,將Native XML數據庫與云計算平臺整合可以進一步拓展云平臺的處理能力,并為XML數據管理提供一個良好的方式。
XPath和XQuery是W3C推薦的XML文檔查詢語言。更新作為管理XML數據的一個重要功能,當前還沒有一個統一的語言和操作標準,XML文檔更新實現主要是基于XQuery語言擴展和自定義模型的更新[4]。XUpdate[5]更新語言為XML數據的更新操作提供了實際規范,推動了XML更新技術以及Native XML數據庫的發展。XUpdate(XML Update Language)由XML∶DB Initiative制定,其功能是更新XML文檔中的數據。XUpdate是一種基于XML的詞匯表,類似于XSLT,但比XSLT要簡單。XUpdate語言僅對如何修改XML數據作了明確定義,查詢文檔節點是通過XPath語法實現的。
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數據。
XUpdate更新XML數據,通過XPath查詢更新節點,更新XML文檔的操作為:insert、update、append、rename、remove等。同時,為了更好地執行更新指令,還應包含自定的variables。
(1)Insert指令用于向XML文檔中添加新的內容,可在節點后(xupdate∶insert-after)添加和節點前(xupdate∶insert-before)添加數據,通過XPath表達式表示的select屬性獲取待操作的節點。Insert指令可向XML文檔中添加的數據類型有元素、文本、預處理指令、屬性、注解、節點。語法示例:
xmlns∶xupdate="http://www.xmldb.org/xupdate">
(2)xupdate∶append指令用于向XML文檔中追加新建的元素節點,其select屬性用于選擇操作節點,child屬性(整型值)用于定位新建節點在被選擇節點中子節點的位置(默認為最后一個子節點)。xupdate∶append指令可追加的元素與Insert指令類似。語法示例:
(3)xupdate∶update指令用于更新節點內容,其屬性select指定待更新節點。語法示例:
Greatest Hits
(4)xupdate∶remove指令用來刪除XML文檔數據節點,其屬性select獲取待刪除節點。語法示例:
(5)xupdate∶rename指令用于對XML數據的屬性或者元素節點進行重命名操作,通過select屬性(值須為元素或屬性節點集)獲取待重命名的節點。語法示例:
title
(6)xupdate∶variable元素用于自定義更新變量。變量名通過name屬性定義,變量的值可通過XPath表達式獲取。對變量的引用xupdate∶value-of元素獲取。語法示例:
XUpdate的基礎語法、語義都簡單明確,通過基礎更新指令間的組合,可構建出多變的更新語句,為云平臺下的XML數據更新提供了一個良好的機制。

圖1 XUpdate更新架構
基于對Native XML數據庫的拓展,結合開源框架類庫,對XUpdate語言進行實現。采用模塊化、低耦合開發實現,處理框架見圖1。
基于XUpdate更新語言處理XML文檔的開發實現由1個協調控制器和5個子模塊組成。5個子模塊為:XUpdate語言編譯、XML文檔存取、XUpdate指令執行、結果輸出以及事務處理模塊。
XUpdate更新命令通過XUpdate語言編譯模塊進行解析,轉換成內部命令表示;基于命令中的select屬性值進XPath表達式解析,獲取待更新的數據信息;XUpdate協調控制器調用XUpdate命令執行模塊遍執行命令集中的具體命令操作; XML文檔存取模塊負責把更新后的XML文檔存入存儲介質(如:Native XML數據庫);通過對文檔加鎖機制和延遲寫入實現更新過程中的事務處理模塊。
3.2.1 XUpdate語言編譯
XUpdate更新命令以XML來描述,基于SAX解析XUpdate更新命令[6],生成基礎的更新處理信息,通過Vector數據結構保存解析結果,完成內部命令表示。主要算法思想如下:
遍歷XUpdate更新語句文檔{
對于命名空間URL,加入命名空間Vector;
對于文本節點,添加文本處理指令,保存到文本Vector,在文本節點末,添加文本處理結束標志;
對于元素節點開始標記,
若該元素為更新指令元素,把指令轉化為內部整數表示,添加該指令及其屬性分別到命令、屬性Vector;
若為Insert、Append指令的待更新元素,在命令Vector里添加元素指示指令和屬性指示指令,對元素名進行命名空間映射,并添加到屬性Vector中。對待更新元素的子元素進行同樣的遍歷操作。
對于元素節點結束標記,
若該元素為更新指令元素,在命令Vector里添加命令結束指令;
若為Insert、Append指令的待更新元素,在命令Vector里添加元素指示結束指令;
}
對于下面XUpdate語句,解析后,更新命令Vector表示見表1。

表1 更新命令Vector
3.2.2 XML文檔更新實現
更新命令表示為內部定義的整型常量。XML文檔更新基于XUpdate編譯后Vector內部命令對待更新的XML文檔進行操作。XUpdate操作實現算法如下:
獲取待更新的XML文檔;
遍歷命令Vector,根據select屬性選擇上下文節點{
對于屬性指示指令,構建屬性元素;
對于文本節點,構建字符串元素,
對于variable命令,把屬性seclect指定的節點集保存在HashTable中;
對于其他命令,根據命令類型,調用響應的execute()方法執行對應的更新操作;
}
保存更新后的結果。
XUpdate的命令主要為:插入、刪除、更新。定義一個基礎命令處理類,具體命令的實現繼承于基礎命令類,并改寫自己命令的實現,實現調用格式的統一。基本算法如下:
(1)remove指令
被刪除的對象為屬性,獲取其所屬節點元素,調用節點刪除屬性方法刪除;
被刪除的對象為元素,獲取其父節點元素,調用節點刪除子節點方法刪除;
(2)append指令
獲取待追加的元素及其屬性;
遍歷所選擇節點集,在child屬性指定位置,追加命令操作對象。
(3)insert操作
獲取待插入的元素及其屬性;
遍歷所選擇節點集,在每個節點的前/后追加命令操作對象。
insert-after算法與insert-before算法類似。進行插入操作(包括append)需要基于namespaces、characters、attributes信息創建新節點,基于DOM模型構建出attribute、element、comment、text、CDATA,processing instruction以及variable對應的節點集,用于對XML文檔進行更新。
(4)update操作
遍歷所選擇節點集{
對于元素節點,刪除節點對應的文本節點,在追加上更新的文本節點;
對于文本節點,改變當前節點的值;
對于屬性、注釋等節點,直接設置其替換值即可;
}
(5)rename操作
遍歷所選擇節點集,獲取所更新節點的父節點{
對于屬性節點,獲取屬性所屬節點元素,添加新屬性,刪除原有屬性;
對于處理指令節點,創建新處理指令節點替換原有的指令節點;
對于元素節點,創建新元素節點{
遍歷待重命名元素的屬性,轉換命名空間后,在新元素節點上添加之;
遍歷待重命名元素的子元素,轉換命名空間后,在新元素節點上添加之;
父節點替換原有的元素節點為新創建的元素節點;
}
}
rename操作的對象須為元素節點、屬性節點或者處理指令。
結合以上XUpdate更新處理架構,基于Java語言和開源框架,在Eclipse開發環境進行編碼測試,結合云計算實驗平臺,通過虛擬機和PaaS平臺部署測試代碼,能夠成功地對XML數據進行更新,為云平臺基于模板的配置文件更新、XML數據管理提供了一種有意義的方式。
XUpdate更新實施主要包括XUpdate語言解析和XUpdate更新命令執行,經測試,對XUpdate更新文檔的解析一般為30ms左右,對常規XML文檔的處理,根據命令的復雜度和文檔規模的不同,用時一般基于200~1000ms之間。更新性能與傳統的基于DOM的XML文檔更新進行比較[6],在小規模XML文檔更新上兩者相率相當,但隨著XML文檔規模的提升,基于XUpdate的更新處理顯示了較好的更新性能,效率提高15%~40%。
云計算、大數據技術的發展進一步促進了XML數據的應用和快速增長,本文基于XUpdate語言對XML文檔的更新技術進行了研究和實施,提供了XML文檔更新操作的基礎規范和體系結構,對云計算環境下基于XUpdate的XML更新研究有著一定的實踐意義。XML文檔的更新是一個復雜的過程,更新時的事務處理、XML更新標準、基于云計算平臺的XML更新技術以及Native XML 數據庫、XUpdate與云平臺的融合,都是需要進一步解決的問題。
[參考文獻]
[1]趙偉,卓偉,李占波,等.基于云計算的一種新的數據交換架構[J].計算機工程與科學,2013(8):15-19.
[2]魏永山,張峰,陳欣,等.一種云計算環境下的XML查詢數據服務的優化方法[J].計算機工程與科學,2013(6):31-36.
[3]王向陽.基于Hadoop的海量小型XML數據挖掘的研究[D].西安:西安郵電大學,2016.
[4]馬程,徐海燕.基于CB+-tree的時態XML索引動態更新方法[J].廣東石油化工學院學報,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文檔解析技術研究[J].常州工學院學報,2013(5):36-41.