作者laechan (小太保)
看板mud_sanc
标题[分享] 写 ASP 网页做 xml 的 Request/Response
时间Wed Mar 7 19:06:14 2012
这是我今天学会的东西。往後我在公司有学会什麽我觉得
不错的,能够分享出来的话我都会分享。这东西很简单,
我以前不会,现在会了,我就希望有看的人也都能会。
==================================================
所谓 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)