問題的提出:
我做了一個圖書管理系統,是用三層結構實現的,客戶端,服務器處理端和數據端。客戶端提出請求,服務器端響應,同時將從數據服務器得來的結果以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\"?>\r\n");
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消息主要的部分,這是本人的一點心得,願與大家一起分享,有不對之處還請大家多多指教。