VB實現Soap XML解析

2021-05-05 04:11:15 字數 4563 閱讀 5818

****************************************==== 簡介

本文中,我們建立乙個簡單的soap服務端和乙個客戶端。服務端用asp編寫,名為soap.asp。這個檔案應存放在個人web伺服器的根目錄下,如:/inetpub/wwwroot。這個伺服器將接受和處理客戶端提出的soap請求。客戶端是乙個簡單的vb可執行檔案,由sub main()啟動。 步驟

眾所周知,soap是乙個「呼叫-響應」機制,按客戶/服務方式執行。客戶端(應用程式)向服務端(位於網際網路上的某個web伺服器)發出函式呼叫請求並傳遞引數;服務端則返回響應。呼叫與響應的內容和資料都是按xml檔案格式進行傳送的。因此,要建立乙個簡單的soap應用系統,就要建立乙個客戶端和乙個服務端,即乙個呼叫-響應體系。

下面是乙個簡單例子:

我們建立乙個服務端來計算銷售交易的稅款。按照傳統的vb術語,即建立乙個函式,定義如下:

public function getsalestax(byval psalestotal as double) as double

getsalestax = psalestotal * 0.04

end function

乙個粗糙的函式,但可作為示例(本例只能用於稅率為4%的地方)。

這個函式定義了乙個函式名(getsalestax),乙個引數(psalestotal – 銷售金額)和乙個返回值(函式返回值)。按照物件導向原則,可以認為psalestotal是乙個"in"引數,getsalestax返回值是乙個"out"引數。因此我們的soap服務端就要偵聽客戶發出的呼叫getsalestax的請求和傳遞的"in"引數(銷售金額),然後返回帶有"out"引數的回應,向客戶返回所需稅款。

客戶端下面是用vb建立乙個呼叫服務的客戶端程式:

dblsalestax = getsalestax(100)

得到返回值$4。

如果getsalestax函式是乙個外部物件,比如在mts伺服器上,就要呼叫伺服器上的dll模組:

dim objtax as new ctaxcalc

dblsalestax = objtax.getsalestax(100)

在soap系統中,遠端呼叫的方式略有不同,呼叫是通過xml檔案傳送到伺服器的。xml檔案裡有呼叫的函式名和相應的引數:

100為確保伺服器能夠識別和解釋客戶請求,呼叫指令被包裝到乙個稱之為soap信封的大檔案裡。這個信封使用的是soap封裝標準的通用命名空間:

100

最後,加入函式呼叫的命名空間,起到函式宣告的作用:

100

現在,已經準備好客戶請求檔案,可以送往服務端了。傳送請求很簡單,可以跟瀏覽器表單一樣,用http  post方式。瀏覽器可以向服務端傳送複雜的表單,.net可以向伺服器傳送vb**,但我使用xmlhttp(ie 5以上版本才能用)。

假設strenvelope含有xml檔案格式的請求,傳送格式如下:

'設定發往本地伺服器

'設定標準soap/ xml檔案頭格式

'設定呼叫函式請求

'呼叫soap

'取得返回值

至此,客戶端完成了向服務端傳送請求的過程。現在回到服務端,看看服務端如何偵聽客戶請求並作出響應。

服務端服務端要能夠接收客戶發出的http請求,在本地伺服器(

http://localhost/soap.asp)接收到客戶請求時作出回應。因此服務端要能夠解析客戶端發出的xml格式(soap封裝)的請求,取出呼叫的函式名和引數。

服務端檔案是soap.asp,它接收客戶請求的做法是:

set objreq = server.createobject("microsoft.xmldom")

objreq.load request

然後用xsl樣式從封裝的xml檔案中取出引數:

strquery = "soap:envelope/soap:body/m:getsalestax/salestotal"

varsalestotal = objreq.selectsinglenode(strquery).text

根據引數計算稅款:

varsalestax = varsalestotal * 0.04

在將結果返回給客戶之前,要按soap標準做格式化封裝。過程與客戶端類似,只是把"in"引數改換為"out"引數,並將函式標記名標為回應:

4

可以用字串方式構造這個回應檔案,也可以建立乙個dom物件,增加乙個節點。

檔案返回給客戶後,客戶經過解碼就能得到結果:

dim objreturn as new msxml.domdocument

objreturn.loadxml strreturn

strquery = _

"soap:envelope/soap:body/m:getsalestaxresponse/salestax"

dbltax = objreturn.selectsinglenode(strquery).text

這樣就完成了乙個簡單的soap服務應用。雖然visual studio 7掩蓋了內在的soap協議,但我希望本文有助於理解soap的操作過程。

下面是客戶端vb**:

vb client code

sub main()

dim strreturn as string

dim objreturn as new msxml.domdocument

dim dbltax as double

dim strquery as string

'建立soap封裝

strenvelope = _

"" & _

"" & _

"" & _

"" & _

"100" & _

"" & _

"" & _ ""

'設定發往本地伺服器

'設定標準soap/ xml格式

'設定呼叫函式頭

'soap呼叫

'取出返回信封

'載入到dom

objreturn.loadxml strreturn

'查詢返回值

strquery = _

"soap:envelope/soap:body/m:getsalestaxresponse/salestax"

dbltax = objreturn.selectsinglenode(strquery).text

debug.print dbltax

end sub

下面是服務端asp**(檔名soap.asp,存放在本地伺服器根目錄下):

<%

set objreq = server.createobject("microsoft.xmldom")

'載入請求到xml dom

objreq.load request

'按照輸入引數查詢

strquery = "soap:envelope/soap:body/m:getsalestax/salestotal"

varsalestotal = objreq.selectsinglenode(strquery).text

'計算varsalestax = varsalestotal * 0.04

'準備返回信封

strtmp = _

"" & _

"" & _

"" & _

"" & _

"" & varsalestax & "" & _

"" & _

"" & _ ""

'回寫結果檔案

response.write strtmp

%>

我就看看不說話 soap XML解析

摘要通過soap請求webservice時,返回的資料是xml型別,有時候也需要解析本地的xml資料等,蘋果自帶類nsxmlparser解析xml還是很方便的,簡單輕便 解析xml nsxmlparser xmlparser ios 本文以解析本地xml為例,網路獲取到的返回值只需轉換成nsdata...

用VB解析網域名稱

private sub command1 click msgbox getip www.sina.com end sub function getip url as string as string shell command.com c ping url n 1 c ping vbhide dim...

VB 實現VC TAbControl控制項

vb 實現vc tabcontrol 控制項新建乙個工程檔案 project1 在左側工具欄中點右鍵 此時,在工具欄的右下角會出現剛新增的元件 sstab 拖動改控制項到 form1 中,該控制項索引是從 0開始算的 在屬性視窗的 tabs 中可以設定控制項中選項頁的頁數,tabsperrow 可以...