萬(wàn)洪莉
摘要:本文介紹了通過(guò)將DOM樹(shù)轉(zhuǎn)換成二叉樹(shù),對(duì)二叉樹(shù)進(jìn)行非遞歸先序遍歷的方法,提高解析SOAP消息的效率。并得出了“將二叉樹(shù)的非遞歸先序解析方法應(yīng)用到SOAP消息的解析過(guò)程,可以優(yōu)化對(duì)web service的訪問(wèn)”的結(jié)論。
關(guān)鍵詞:SOAP;XML;解析算法
1 引言
Web service是SOA架構(gòu)中開(kāi)發(fā)業(yè)務(wù)組件的重要技術(shù)。SOAP是訪問(wèn)web service的重要協(xié)議。目前已有一些研究基于SOAP協(xié)議構(gòu)建松耦合的web應(yīng)用[1,2],但對(duì)SOAP消息的解析算法還有待深入研究。本文利用二叉樹(shù)的非遞歸先序遍歷算法,對(duì)SOAP消息進(jìn)行解析,從而提高對(duì)web service的訪問(wèn)效率。
2 SOAP消息類型
SOAP的全稱是簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議,在現(xiàn)有的研究文獻(xiàn)中,研究者在分析基于SOAP的Web服務(wù)結(jié)構(gòu)以及SOAP消息構(gòu)成后,利用XML的名稱空間給SOAP添加了數(shù)字簽名,從而對(duì)web服務(wù)進(jìn)行了安全擴(kuò)展[3]。在文獻(xiàn)[4]中,還提出了一種基于SOAP的DoS攻擊防范方案。
一組基本的SOAP請(qǐng)求消息sp是一個(gè)二元組,sp=(sh,sb),其中,
(1)sh是SOAP消息頭部分,用于向SOAP消息中以可擴(kuò)展方式添加信息。
(2)sb是SOAP消息的body部分,sb={m1,m2,……,mn},是該SOAP消息中所請(qǐng)求的方法的集合。
m是一個(gè)三元組,m=(n,ipm,opm),其中:
(1)n是SOAP消息請(qǐng)求方法的名稱。
(2)ipm是請(qǐng)求方法的輸入?yún)?shù)集合,ipm={ip1,ip2,……ipn}。
(3)opm是請(qǐng)求方法的輸出結(jié)果集合,opm={op1,op2,……opn}。
下列代碼是一組典型的SOAP請(qǐng)求消息:
xml version="1.0" encoding="utf-8" ?
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
在這組SOAP請(qǐng)求消息中,SOAP 請(qǐng)求的詳細(xì)信息包含在
元素中。上面的示例請(qǐng)求了GetCustomerInfo方法。在本文的第3節(jié)中,以這段SOAP消息代碼為例,利用DOM對(duì)SOAP進(jìn)行文檔對(duì)象解析的原理。
3 文檔對(duì)象模型原理
目前對(duì)XML文檔的解析基于兩個(gè)原理:基于事件流的解析(SAX)[5]和基于對(duì)象樹(shù)的解析(DOM)[6]。使用DOM的相關(guān)類和接口可以將SOAP消息轉(zhuǎn)換成DOM樹(shù)。這種轉(zhuǎn)換后的DOM樹(shù)是一種分層對(duì)象模型,具有唯一的根節(jié)點(diǎn)和若干子節(jié)點(diǎn)。第2節(jié)中的SOAP請(qǐng)求消息經(jīng)過(guò)DOM轉(zhuǎn)換,可以得到唯一的DOM樹(shù),結(jié)構(gòu)如圖1:
4 SOAP消息的二叉樹(shù)轉(zhuǎn)換
通過(guò)第3節(jié)的分析研究可知,DOM樹(shù)符合數(shù)據(jù)結(jié)構(gòu)中對(duì)樹(shù)的定義,但非二叉樹(shù)。為應(yīng)用算法提高對(duì)SOAP消息的訪問(wèn)效率,需要將SOAP消息對(duì)應(yīng)的DOM樹(shù)轉(zhuǎn)換成二叉樹(shù)。算法是:
Input:sp
Output:spBTree
1. spBTree=null;
2. for all(n∈sp.sb){
if(n.hasSiblingNodes){
n.LastChildNodes=sp.nextSiblingNodes;
}
}
3. for all(n∈sp.sb){
if(!sb.firstChildNodes){
sb.ChildNode=null;
}
}
4.return spBTree
5 利用非遞歸先序算法解析SOAP消息
二叉樹(shù)先序遍歷的遞歸算法通常效率很低,而且有的程序設(shè)計(jì)語(yǔ)言不支持遞歸[7]。這時(shí),可以利用堆棧保存操作過(guò)程中指針?biāo)赶虻慕Y(jié)點(diǎn)位置,使得遍歷完左子樹(shù)的葉子結(jié)點(diǎn)時(shí)能夠返回到上一層,然后再訪問(wèn)其右子樹(shù)。文獻(xiàn)[7]中闡述了二叉樹(shù)的非遞歸先序遍歷算法,經(jīng)驗(yàn)證,可以應(yīng)用到由DOM樹(shù)轉(zhuǎn)換成的二叉樹(shù)上,完成對(duì)SOAP消息的解析過(guò)程。
6 結(jié)論
SOAP協(xié)議是SOA體系中的重要協(xié)議。訪問(wèn)web service必須遵守此協(xié)議。由于二叉樹(shù)的簡(jiǎn)便特性,許多算法都是基于二叉樹(shù)。本文成功的進(jìn)行了DOM樹(shù)到二叉樹(shù)的轉(zhuǎn)換。使得針對(duì)二叉樹(shù)的非遞歸先序遍歷算法能夠在解析SOAP協(xié)議時(shí)的到應(yīng)用,提高了訪問(wèn)web service,處理SOAP消息的效率。
參考文獻(xiàn)
[1]楊磊,王建斌,馬光思,程永陽(yáng).基于SOAP協(xié)議和Ajax技術(shù)構(gòu)建Web應(yīng)用[J].計(jì)算機(jī)技術(shù)與發(fā)展.2008,18(1).
[2]翟峰,郝克剛,葛瑋.基于SOAP構(gòu)建Axis上的Web Services[J].計(jì)算機(jī)應(yīng)用與軟件.2008(1).
[3]樊佑磊,張亞珍.基于SOAP安全擴(kuò)展的Web服務(wù)研究[J].網(wǎng)絡(luò)通訊及安全.2008(1).
[4]鄧凱,裴浩.基于SOAP的DoS攻擊防范方案[J].計(jì)算機(jī)工程與設(shè)計(jì).2008,29(3).
[5]王芳,李正凡.用SAX解析XML文檔的實(shí)現(xiàn)方法[J].華東交通大學(xué)學(xué)報(bào).2004,21(1).
[6]王建.基于DOM的XML數(shù)據(jù)訪問(wèn)技術(shù)[J].計(jì)算機(jī)與數(shù)字工程.2008,36(2).
[7]盛魁.二叉樹(shù)的遍歷探究與應(yīng)用.電腦知識(shí)與技術(shù)[J].2008,3(5).