[分享] 寫 ASP 網頁做 xml 的 Request/Response
看板mud_sanc (Sanctuary - 聖殿)作者laechan (小太保)時間14年前 (2012/03/07 19:06)推噓0(0推 0噓 0→)留言0則, 0人參與討論串1/2 (看更多)
這是我今天學會的東西。往後我在公司有學會什麼我覺得
不錯的,能夠分享出來的話我都會分享。這東西很簡單,
我以前不會,現在會了,我就希望有看的人也都能會。
==================================================
所謂 xml 是指類似底下的東西
<sanc>
<player>
<id>"laechan"</id>
<level>120</level>
.
.
</player>
<player>
<id>"norr"</id>
<level>120</level>
.
.
</player>
</sanc>
我今天學會的東西是,把上面的 xml send 給 server 端
,然後讀取 server 端傳回來的 xml 資料。
底下是 asp 檔的內容
<%
' 先 call 個物件,類似 ob = find_object_or_load("/adm/daemons/xmlhttp.c");
' 底下的物件就是專做 xml 的 request/response 用的
set xmlob = server.createobject("MSXML2.XMLHTTP")
' 類似很多程式語言都會看到的 file open, 有 open 的動作才能做
' read, write, etc..., 底下就類似這樣的動作
xmlob.open("POST","server端要跟我互動的API頁面網址",false)
' 接著就把上面那一串 xml 內容用字串包起來後, send 給對方
' xml 內有字串引數時就像這樣 ".....<id>""laechan""</id>....."
' 這樣對方收到的就是 <id>"laechan"</id>
xmlob.send "<sanc><player>.........</sanc>"
' 底下是判斷傳送有沒有成功, 值 4 代表有成功傳給對方
if xmlob.readystate = 4 then
' 就再 call 出一個專門用來存放 xml 資料的物件
' 同樣的底下也是類似 find_object_or_load 一個物件的意思
set xml = server.createobject("MSXML2.DOMDocument")
' 這行固定的
xml.Async = false
' xml call 出來後,就可以用底下動作把 xmlob 接收到的
' response 給存進 xml 這個物件裡頭
' 類似 xml = xmlob->loadXML() 或 xmlob->loadXML(xml)
' 然後 loadXML 函數(方法) 就是把資料存進 xml 裡頭
xml.loadXML = xmlob.ResponseText
' 這時候 xml 這個物件就有了從 server 端回來的資料
' 底下就可以開始從 xml 這個物件裡面撈資料
例如說,我們送去的 xml 長成底下這樣
<sanc>
<request>select-player-data</request>
<sanc>
server 端看到我送上面的東西給它,於是就回給我全聖殿玩
家的資料,並包在 xml 裡頭,如下..
<sanc>
<player>
<id>"laechan"</id>
<level>120</level>
.
.
</player>
<player>
<id>"norr"</id>
<level>120</level>
.
.
</player>
</sanc>
底下就介紹怎麼簡單的解析。比方說我們知道傳回來的資料它
的格式就是長成上面那樣子,我們知道有 sanc、player、id
等欄位,那我要撈資料就是這樣..
' 先撈出 <sanc> 這一層的資料
sancdata = xml.SelectSingleNode("sanc")
' 再往下撈出 <player> 這一層的資料
playerdata = sancdata.SelectSingleNode("player")
而 player 資料如上所示,每一個 player 就一組,有 n 組,
撈法就是這樣..
' playerdata 你可以想成它是一個 m x n 維陣列資料
for i = 0 to playerdata.length - 1
' 這裡可想成讀取每一"排"子陣列
set eachppl = playerdata.item(i)
' 這裡就很像讀取每一"排"子陣列裡面的每個元素
for each ppl in eachppl.ChildNodes
set keyname = ppl.nodeNames
set ppldata = playerdata.SelectSingleNode(keyname)
' 這裡就類似 write(xxx+" = "+ppldata(xxx)+"\n");
Response.write keyname & " = " & ppldata.nodeTypesValue
Next
Next
end if
%>
上面的東西類似底下..
// 假設有個 simul_efun 可以撈出全玩家的資料
mixed playerdata = get_playerdata();
/* 假設資料長這樣
({ ({ "id:laechan","level:120","race:human",...}),
({ "id:norr" ,"level:120","race:stoneman",...}),
.
.
})
*/
// 看有幾排資料
j=sizeof(playerdata);
for(i=0;i<=j-1;i++)
{
// 讀取每一排的 sizeof
jj=sizeof(playerdata[i]);
for(ii=0;ii<=jj-1;ii++)
{
sscanf(playerdata[i][ii],"%s:%s",keyname,v);
write(keyname+" = "+v);
}
}
這就是我今天學會的東西。
Laechan
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 122.117.7.33
※ 編輯: laechan 來自: 122.117.7.33 (03/07 23:13)
討論串 (同標題文章)
mud_sanc 近期熱門文章
PTT遊戲區 即時熱門文章
-22
41