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