2011年2月24日 星期四

淺談Flash傳值(三)

延續著上一篇淺談Flash傳值(二)獲得更大的迴響之後(FB2篇留言,2個讚,網誌0.4趴的鼓勵獎賞),激起我更強烈的小宇宙(比起上次大約掉了3趴),於是想到了今天要講的主題,如果你以為我要講的是拿到XML的應用,那就必須失望了,沒關係,人生總是如此,就像鼓起勇氣跟心愛的女孩表白,卻發現她下個月就要去上海的感覺一樣,寫到這裡,不禁潸然而淚下;

言歸正傳,其實本來是要開始寫拿到XML的應用,但看到XML,不拿出來講一下,感覺對不起按下讚的那兩個人,就像是我在路上看到老太太就一定會扶她過馬路(即便是在家樂福遇到,也要硬拖著他的拐杖拉去外面),畢竟沒有扶她過馬路,我要怎麼把她推下海呢!?

在講XML之前,先稍微詳述一下之前提到的PHP,Flash因為安全性的問題,無法直接跟資料庫端溝通,必須透過第三方的php或是asp或是能讓你開心的任何語言,基本上,這些甚麼批甚麼批就像是NPC一樣,沒錯,就是像奧格瑪門口那兩個棒槌一般,對付棒槌,就只能用下等的方法,沒辦法,棒槌牽到東京還是棒槌,所以我們要丟給棒槌的值,會有變數名稱以及內容,就像我們第一篇提到的:變數名稱是city,內容是Taipei,如果這個棒槌聽不懂你丟過來的變數名稱,比如說你問奧格瑪門口的棒槌:"請問排骨飯哪裡有賣!?","毫無反應....就只是個棒槌",當他聽到他能夠了解的問題,就會丟回來該有的答案,Flash與第三方溝通串接的方式通常有XML跟JSON,甚麼是JSON呢?(九把刀表示:"那又是另一個故事了"),既然不講為何要提呢?沒辦法,不提不專業,我的人生也是充滿許多無奈的;

終於真的講到XML了,XML我個人把它當作是一種潮撞架構,啪啪啪啪啪啪啪啪啪(想甚麼?這是一段折很多筷子的故事),歐不是,是巢狀架構,甚麼是巢狀,簡單的說,他是個巢,例如下面這個簡單的XML

 
  
   菜菜人
   28
   
    
     菜菜人的大兒子
     1
    
    
     菜菜人的小兒子
     0.5
    
   
  
  
   蛋蛋人
   18
  
 

看看這個完美的結構,要多潮有多潮,將這些另存為【home.xml】利用上次寫的API寫一支as將xml載入到Flash裡
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架構,成為潮到出水的潮男,接下來,我們可以開始做色色的事情了...待續 範例檔下載

2 則留言:

  1. 也可以用node名稱來代替children()喔,例如__xml.first.kid[0].name就是 菜菜人 囉

    回覆刪除
  2. 挖~~Gray大~有神快拜,您的光臨讓小弟感覺蓬蓽生輝

    回覆刪除