嵌入式環(huán)境下Web Service技術(shù)的實現(xiàn)
2.2.2 XML解析
SOAP消息是由XML語言組成的,因此對XML的解析是處理SOAP消息的一個重點。當(dāng)今有2種流行的XML解析API,它們是DOM(Document Obj ect Model)和SAX(Simple API for XML),盡管這兩種方法都能用來解析XML數(shù)據(jù),但相互間卻有很多本質(zhì)的不同:DOM一次性把整個XML文檔讀入內(nèi)存并建立完整的樹結(jié)構(gòu),而SAX則基于事件驅(qū)動模型,一次只讀取一個XML元素,每當(dāng)遇到一個讀取事件時就會觸發(fā)一個事件處理器。兩種方法各有優(yōu)缺點:DOM在處理單個元素之前必須把其他所有的元素都讀入內(nèi)存建立樹結(jié)構(gòu),這既費時間又費內(nèi)存,在這方面SAX的性能
更為優(yōu)異,但DOM一旦建立樹結(jié)構(gòu)之后,就可以方便地處理文檔中的任意元素,因為整個XML結(jié)構(gòu)都在內(nèi)存里,而SAX則必須從頭逐個解析XML文檔每一個元素,直到需要的那個元素。
考慮到SOAP消息的解析是一次性的過程,不需要進(jìn)行元素的隨機(jī)訪問,而且嵌入式環(huán)境下資源有限,為此采用SAX做為XML的解析方式。定義以下結(jié)構(gòu)體用來存儲節(jié)點結(jié)構(gòu)。
另外建立一個列表用來存儲XML文檔中聲明的命名空間,避免XML文檔里的元素名或?qū)傩悦嗷ブg可能會發(fā)生的語義沖突。在XML文檔的解析過程中,保留當(dāng)前節(jié)點及其父節(jié)點的結(jié)構(gòu)體,除此之外的節(jié)點在讀取完畢后立即釋放其占用的資源,必要時還可以關(guān)閉對節(jié)點屬性的解析,進(jìn)一步降低內(nèi)存消耗。當(dāng)遇到新的讀取事件時(節(jié)點開始、節(jié)點結(jié)束、發(fā)現(xiàn)節(jié)點值),將此次事件的相關(guān)信息作為參數(shù)傳入回調(diào)函數(shù),在回調(diào)函數(shù)中對節(jié)點信息進(jìn)行處理:
2.2.3 具體服務(wù)實現(xiàn)
為了方便查找服務(wù),程序里將所有支持的服務(wù)函數(shù)的名稱以及對應(yīng)的命名空間預(yù)先保存在一個列表中。當(dāng)進(jìn)入XML解析的回調(diào)函數(shù)后,根據(jù)XML節(jié)點的節(jié)點名稱以及命名空間,首先試圖從列表中搜索本次SOAP消息所請求的服務(wù),如果所請求的服務(wù)函數(shù)存在,則將XML節(jié)點信息傳入該服務(wù)函數(shù)對應(yīng)的初始化函數(shù),完成對服務(wù)函數(shù)的參數(shù)列表的初始化,為之后的服務(wù)函數(shù)執(zhí)行做好準(zhǔn)備。圖3給出了該過程的程序框圖。XML解析完畢后退出XML解析器,此時服務(wù)函數(shù)也已經(jīng)完成初始化,直接調(diào)用服務(wù)函數(shù)的執(zhí)行部分,并將結(jié)果打包成SOAP格式發(fā)送回客戶端。鑒于動態(tài)生成XML文檔需要耗費較多的資源,程序中為每個服務(wù)函數(shù)預(yù)存了一個模板,模板中已經(jīng)定義好了回復(fù)消息的整體結(jié)構(gòu),僅需在服務(wù)函數(shù)被實際調(diào)用后往模板中填入結(jié)果即可,另外可以在發(fā)送回復(fù)消息的過程中復(fù)用之前的接收緩沖區(qū),這樣一來同時節(jié)省了處理時間和資源消耗。本文引用地址:http://www.ex-cimer.com/article/149382.htm linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
c++相關(guān)文章:c++教程
評論