問題的提出:
我做了一個圖書管理系統,是用三層結構實現的,客戶端,服務器處理端和數據端。客戶端提出請求,服務器端響應,同時將從數據服務器得來的結果以SOAP消息發送回客戶端,客戶端解析SOAP消息,將結果顯示給用戶。
實現方法:
好了,話不多說,現在開始進入正題:
在接到客戶端發來的請求後,我用ADO連接數據服務器並查詢(我用的是Access),得到結果集Recordset以後,將結果集中有關圖書信息格式化成XML文檔,將其以SOAP消息形式發送回客戶端
//************************封裝成SOAP消息發送回客戶端************************//
int MaxRows=0;//用來獲得總的行數
while(!pRs->EndOfFile)
{
MaxRows++;
pRs->MoveNext();
}
pRs->MoveFirst();//這是必須的,現在記錄已是最後一行了
int nFIElds;
nFields=pRs->FIElds->GetCount(); //得到字段總數
CMarkup XML;
xml.SetDoc("<?XML version="1.0" encoding="GB2312"?>
");
XML.AddElem( "RESULT" );
for(int j=0;j<MaxRows;j++)
{
XML.AddChildElem( "BOOK" );
XML.IntoElem();
for(int k=0;k<nFIElds;k++) //獲取字段名
{
_bstr_t name=pRs->FIElds->GetItem((long)k)->GetName();
_bstr_t value=pRs->FIElds->GetItem((long)k)->GetValue();
XML.AddChildElem((char *)name,(char *)value);
}
XML.OutOfElem();
pRs->MoveNext();
}
xml.Save("Temp.XML");
//MessageBox("XML文件生成成功");
CFile file;
file.Open("Temp.XML",CFile::modeRead | CFile::typeBinary);
byte buf[64*1024];
memset(buf,0,64*1024);
file.ReadHuge(buf,file.GetLength());
//用socket發送
send(m_sockClIEnt[i],(char *)buf,file.GetLength()+1,0);
file.Close();
在這裡我要說明一下,在解析XML文件的時候,我借用了CMarkup類,十分感謝它的作者,因為他們的努力使得我們在解析XML文件的時候可以輕而已舉,這裡再一次感謝他們!也推薦大家在解析XML文件的時候不妨試試這個類,非常的好用!
上面的代碼還比較好懂,我也就不多解釋什麼了(高手們可別笑話我哦~~)
在接受到服務器端的SOAP消息後,客戶端就可以解析SOAP消息並把結果顯示出來了:
CFile file;
file.Open("Temp.XML",CFile::modeCreate | CFile::typeBinary | CFile::modeWrite );
file.WriteHuge(recvBuf,strlen(recvBuf));
file.Flush();
file.Close();
CMarkup XML;
if(!xml.Load("Temp.XML"))
{
MessageBox("加載XML文件失敗!");
return ;
}
...
int item=0;
XML.ResetMainPos(); //make sure to move the point to the begin
while (XML.FindChildElem("BOOK"))
{
int subItem=0;
XML.IntoElem(); //into BOOK
m_listCtrl.InsertItem(item,"",0); //插入一行
CString index;
index.Format("%d",item+1); //每行的序號
m_listCtrl.SetItemText(item,subItem,index);
while(XML.FindChildElem()) //循環得到節點值,也就是書的各個信息
{
XML.IntoElem();
CString value=XML.GetData(); //得到值
//MessageBox(value);
m_listCtrl.SetItemText(item,subItem+1,value);
subItem++;
XML.OutOfElem();
}
item++;
XML.OutOfElem(); //out BOOK
}
好了,這就是格式化SOAP消息和解析SOAP消息主要的部分,這是本人的一點心得,願與大家一起分享,有不對之處還請大家多多指教。