[分享] 寫 ASP 網頁做 xml 的 Request/Response

看板mud_sanc (Sanctuary - 聖殿)作者 (小太保)時間14年前 (2012/03/07 19:06), 編輯推噓0(000)
留言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)
文章代碼(AID): #1FLq4gr1 (mud_sanc)
文章代碼(AID): #1FLq4gr1 (mud_sanc)