言歸正傳,其實本來是要開始寫拿到XML的應用,但看到XML,不拿出來講一下,感覺對不起按下讚的那兩個人,就像是我在路上看到老太太就一定會扶她過馬路(即便是在家樂福遇到,也要硬拖著他的拐杖拉去外面),畢竟沒有扶她過馬路,我要怎麼把她推下海呢!?
在講XML之前,先稍微詳述一下之前提到的PHP,Flash因為安全性的問題,無法直接跟資料庫端溝通,必須透過第三方的php或是asp或是能讓你開心的任何語言,基本上,這些甚麼批甚麼批就像是NPC一樣,沒錯,就是像奧格瑪門口那兩個棒槌一般,對付棒槌,就只能用下等的方法,沒辦法,棒槌牽到東京還是棒槌,所以我們要丟給棒槌的值,會有變數名稱以及內容,就像我們第一篇提到的:變數名稱是city,內容是Taipei,如果這個棒槌聽不懂你丟過來的變數名稱,比如說你問奧格瑪門口的棒槌:"請問排骨飯哪裡有賣!?","毫無反應....就只是個棒槌",當他聽到他能夠了解的問題,就會丟回來該有的答案,Flash與第三方溝通串接的方式通常有XML跟JSON,甚麼是JSON呢?(九把刀表示:"那又是另一個故事了"),既然不講為何要提呢?沒辦法,不提不專業,我的人生也是充滿許多無奈的;
終於真的講到XML了,XML我個人把它當作是一種潮撞架構,啪啪啪啪啪啪啪啪啪(想甚麼?這是一段折很多筷子的故事),歐不是,是巢狀架構,甚麼是巢狀,簡單的說,他是個巢,例如下面這個簡單的XML
看看這個完美的結構,要多潮有多潮,將這些另存為【home.xml】利用上次寫的API寫一支as將xml載入到Flash裡菜菜人 28 菜菜人的大兒子 1 菜菜人的小兒子 0.5 蛋蛋人 18
package {
import flash.display.*
import flash.events.*
import flash.net.*;
import flash.text.*
import as3.ac.net.InternetTransfer
public class netTrans extends Sprite {
public var _net:InternetTransfer
public function netTrans() {
addEventListener(Event.ADDED_TO_STAGE, addToStageHandeler)
}
private function addToStageHandeler(_e:Event) {
removeEventListener(Event.ADDED_TO_STAGE, addToStageHandeler)
preset()
}
private function preset() {
_net = new InternetTransfer()
_net.load("home.xml")//延續上次開發API裡面的讀取函式將home.xml讀進Flash中
_net.addEventListener(Event.COMPLETE, loadCompleteHandeler);//監聽收到回傳值時的Event
}
private function loadCompleteHandeler(_e:Event) {
var __xml:XML=new XML((_e.target.data))
trace(__xml)//trace看看
}
}
}讀進來的xml就像是我家,我生了兩個小孩,大兒子叫菜菜人,小兒子叫蛋蛋人,其中大兒子菜菜人又生了兩個小孩,菜菜人的大兒子,菜菜人的小兒子,那麼我是誰!?對,我是阿西,所以被包在【<>】與【</>】,便是這個tag的下一代,相信經過我精闢的解釋之後,大家一定對XML更加模糊了,那我們就進入下一步,從Flash拆解XML拿資料,先改寫as裡面第23行
trace(__xml.children()[0].children()[0])這時候會拿到
當啷~~~菜菜人的個資就這麼輕易的被你取得了菜菜人 28 菜菜人的大兒子 1 菜菜人的小兒子 0.5
所以用children()[int]可以一層層的取得巢狀結構內的資料
這時候在改寫一下第23行
var __vegatableMan:Object = new Object()//宣告一個物件為菜菜人
__vegatableMan.name = __xml.children()[0].children()[0].children()[0]//菜菜人的系名是xml中第三層的第0筆
__vegatableMan.age = __xml.children()[0].children()[0].children()[1]//菜菜人的年紀是xml中第三層的第1筆
__vegatableMan.totalChild = __xml.children()[0].children()[0].children()[2].children().length()//用length()函式可以取得xml長度,將他指定為菜菜人的子孫人數
__vegatableMan.childArray = new Array()//給菜菜人一個陣列裝他的子孫
var i:int
for (i = 0; i < __vegatableMan.totalChild; i++ ) {
var __child:Object = new Object()//宣告一個物件成為孩子
__child.name = __xml.children()[0].children()[0].children()[2].children()[i].children()[0]//巢狀架構繼續往下挖
__child.age = __xml.children()[0].children()[0].children()[2].children()[i].children()[1]//巢狀架構繼續往下挖
__vegatableMan.childArray.push(__child)//將子孫丟進陣列裡
}
trace("Name : " + __vegatableMan.name)
trace("Age : " + __vegatableMan.age)
trace("TotalChild : " + __vegatableMan.totalChild)
for (i = 0; i < __vegatableMan.totalChild; i++ ) {
trace("Child" + (i + 1) + "-Name : " + __vegatableMan.childArray[i].name)
trace("Child" + (i + 1) + "-Age : " + __vegatableMan.childArray[i].age)
}得到完美的解答
Name : 菜菜人 Age : 28 TotalChild : 2 Child1-Name : 菜菜人的大兒子 Child1-Age : 1 Child2-Name : 菜菜人的小兒子 Child2-Age : 0.5可以拆解完整的XML架構,成為潮到出水的潮男,接下來,我們可以開始做色色的事情了...待續 範例檔下載
也可以用node名稱來代替children()喔,例如__xml.first.kid[0].name就是 菜菜人 囉
回覆刪除挖~~Gray大~有神快拜,您的光臨讓小弟感覺蓬蓽生輝
回覆刪除