ASP 與 XML part 2 - 聖殿英雄傳說 MUD
By Tracy
at 2012-03-17T17:57
at 2012-03-17T17:57
Table of Contents
最近在公司以單純的 ASP(非 ASP.NET) 寫了兩支程式,這裡
做個分享。以底下的 xml 為例
<sanc>
<playerdata>
<player>
<id>laechan</id>
<level>120</level>
<race>human</race>
</player>
<player>
<id>norr</id>
<level>120</level>
<race>devil</race>
</player>
</playerdata>
</sanc>
我使用 response.cookies 的方式(簡單的說就是土法煉鋼)
來儲存上面的資訊,做法如下...
<%
' 先 create 一個 xml 用的物件
Set Https = Server.CreateObject("MSXML2.XMLHTTP")
' 把這個物件設為指向打開下列網址的 xml 資料傳送用物件
' 然後把資料 send 給它(new_str 就是我編好的 xml 東西)
Https.open "POST","http://網址/api",false
Https.send new_str
' 若傳送有成功(state=4)就執行底下
if Https.readystate=4 then
' create 出一個存放 xml 資料的物件
set xml = Server.CreateObject("MSXML2.DOMDocument")
xml.Async = false
' 讓這個物件去做 loadXML 的動作, 其目標是從上述網址
' response 回來的東西, 假設就是我上面打的那一串 xml
xml.loadXML Https.ResponseText
' 下面這個動作, 可以把「每一個」 <player> ... </player>
' 裡面的東西撈出來存放到 players 裡頭,類似底下這樣
' players = ({ ({"laechan","120","human"}), ({"norr","120","devil"}),.. })
set players = xml.getElementsByTagName("player")
' 這個類似 sizeof(players) < 1 的判斷式
if players.length < 1 then
response.write "沒有撈到任何資料喔.<p>"
' 底下類似程式執行到這裡就 end 掉(結束)
response.end
end if
' 把 k 存成長度的整數, 我實測過若不經過這個轉換
' players.length 無法被判斷為整數, 很怪
k = CInt(players.length)
dim keyname(100)
for i = 0 to k-1
' playerxml = 每一筆 <player> ... </player>
set playerxml = player.item(i)
' playerxml 的第 0 筆資料就是 <id> 資料
' 令 playerid = 該值而且強制其變成字串
' .childNodes(n) 就是取出第 n 筆子節點, .text 代表取出節點的值
playerid = CStr(playerxml.childNodes(0).text)
' 並把每一個 playerid 另外存起來
keyname(i) = playerid
' 接著, 就去撈每一個 <player> ... </player> 底下的子節點
' 也就是 <id> , <level>, <race> 那些
for each nodes in playerxml.childNodes
' 取得子節點名字, 就是 "id", "level", "race" 等
' 上面的 for each nodes 的目的就是為了取得 nodes 這個東西
tmp=CStr(nodes.NodeName)
' 把資料用類似 mapping 的方式存起來
' cookies("laechan")("level") = "120" 這樣
response.cookies(playerid)(tmp) = playerxml.childNodes(j).text
next
next
end if
到這裡就讀完了,接著就是驗證結果
strs = "<table border=1><tr><th>玩家ID</th><th>等級</th><th>種族</th></tr>"
for i = 0 to k-1
playerid = keyname(i)
' 底下就類似 strs = strs + xxx
strs = strs & "<tr><th>" & request(playerid)("level") & "</th>"
strs = strs & "<tr><th>" & request(playerid)("race") & "</th></tr>"
next
response.write strs & "</table>"
%>
其網頁執行結果就類似底下
┌────┬──┬───┐
│ 玩家ID │等級│ 種族 │
├────┼──┼───┤
│laechan │120 │human │
├────┼──┼───┤
│norr │120 │devil │
└────┴──┴───┘
跟自己熟悉的語言對照一下就能理解上面的寫法,這是一種土法
煉鋼的方式,為的就是以最快的速度開發出我想要的東西。
LAechan
--
做個分享。以底下的 xml 為例
<sanc>
<playerdata>
<player>
<id>laechan</id>
<level>120</level>
<race>human</race>
</player>
<player>
<id>norr</id>
<level>120</level>
<race>devil</race>
</player>
</playerdata>
</sanc>
我使用 response.cookies 的方式(簡單的說就是土法煉鋼)
來儲存上面的資訊,做法如下...
<%
' 先 create 一個 xml 用的物件
Set Https = Server.CreateObject("MSXML2.XMLHTTP")
' 把這個物件設為指向打開下列網址的 xml 資料傳送用物件
' 然後把資料 send 給它(new_str 就是我編好的 xml 東西)
Https.open "POST","http://網址/api",false
Https.send new_str
' 若傳送有成功(state=4)就執行底下
if Https.readystate=4 then
' create 出一個存放 xml 資料的物件
set xml = Server.CreateObject("MSXML2.DOMDocument")
xml.Async = false
' 讓這個物件去做 loadXML 的動作, 其目標是從上述網址
' response 回來的東西, 假設就是我上面打的那一串 xml
xml.loadXML Https.ResponseText
' 下面這個動作, 可以把「每一個」 <player> ... </player>
' 裡面的東西撈出來存放到 players 裡頭,類似底下這樣
' players = ({ ({"laechan","120","human"}), ({"norr","120","devil"}),.. })
set players = xml.getElementsByTagName("player")
' 這個類似 sizeof(players) < 1 的判斷式
if players.length < 1 then
response.write "沒有撈到任何資料喔.<p>"
' 底下類似程式執行到這裡就 end 掉(結束)
response.end
end if
' 把 k 存成長度的整數, 我實測過若不經過這個轉換
' players.length 無法被判斷為整數, 很怪
k = CInt(players.length)
dim keyname(100)
for i = 0 to k-1
' playerxml = 每一筆 <player> ... </player>
set playerxml = player.item(i)
' playerxml 的第 0 筆資料就是 <id> 資料
' 令 playerid = 該值而且強制其變成字串
' .childNodes(n) 就是取出第 n 筆子節點, .text 代表取出節點的值
playerid = CStr(playerxml.childNodes(0).text)
' 並把每一個 playerid 另外存起來
keyname(i) = playerid
' 接著, 就去撈每一個 <player> ... </player> 底下的子節點
' 也就是 <id> , <level>, <race> 那些
for each nodes in playerxml.childNodes
' 取得子節點名字, 就是 "id", "level", "race" 等
' 上面的 for each nodes 的目的就是為了取得 nodes 這個東西
tmp=CStr(nodes.NodeName)
' 把資料用類似 mapping 的方式存起來
' cookies("laechan")("level") = "120" 這樣
response.cookies(playerid)(tmp) = playerxml.childNodes(j).text
next
next
end if
到這裡就讀完了,接著就是驗證結果
strs = "<table border=1><tr><th>玩家ID</th><th>等級</th><th>種族</th></tr>"
for i = 0 to k-1
playerid = keyname(i)
' 底下就類似 strs = strs + xxx
strs = strs & "<tr><th>" & request(playerid)("level") & "</th>"
strs = strs & "<tr><th>" & request(playerid)("race") & "</th></tr>"
next
response.write strs & "</table>"
%>
其網頁執行結果就類似底下
┌────┬──┬───┐
│ 玩家ID │等級│ 種族 │
├────┼──┼───┤
│laechan │120 │human │
├────┼──┼───┤
│norr │120 │devil │
└────┴──┴───┘
跟自己熟悉的語言對照一下就能理解上面的寫法,這是一種土法
煉鋼的方式,為的就是以最快的速度開發出我想要的東西。
LAechan
--
Tags:
線上
All Comments
Related Posts
模組測試
By Edwina
at 2012-03-17T17:56
at 2012-03-17T17:56
jwalker
By William
at 2012-03-17T17:54
at 2012-03-17T17:54
封測信發送了!
By Annie
at 2012-03-17T17:36
at 2012-03-17T17:36
蕾娜是否不理空降角色?
By Valerie
at 2012-03-17T17:33
at 2012-03-17T17:33
活動-求愛大作戰!少女愛菈告白四部曲
By Anthony
at 2012-03-17T17:32
at 2012-03-17T17:32