ASP 與 XML part 2 - 聖殿英雄傳說 MUD

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

--

All Comments