2010-04-09 42 views
1

我試圖解析XML文件並從其數據創建對象數組。數據轉換爲MediaAlbum類(我自己的類)。 XML被正確解析並且對象被加載,但是當我實例化它時,Albums數組的長度爲零,即使數據加載正確。AS3:從XML解析的對象數組保持爲零長度

我真的不知道問題是什麼......任何提示?

import Nem.Media.*; 
var mg:MediaGallery = new MediaGallery("test.xml"); 
trace(mg.Albums.length); 

MediaGallery類:

package Nem.Media 
{ 
    import flash.net.URLRequest; 
    import flash.net.URLLoader; 
    import flash.events.*; 

    public class MediaGallery 
    { 
     private var jsonGalleryData:Object; 
     public var Albums:Array = new Array(); 

     public function MediaGallery(xmlSource:String) 
     { 
      var loader:URLLoader = new URLLoader(); 
      loader.load(new URLRequest(xmlSource)); 

      loader.addEventListener(Event.COMPLETE, loadGalleries); 
     } 

     public function loadGalleries(e:Event):void 
     { 
      var xmlData:XML = new XML(e.target.data); 
      var album; 

      for each (album in xmlData.albums) 
      { 
       Albums.push(new MediaAlbum(album.attribute("name"), album.photos)); 
      } 
     } 
    } 
} 

XML測試來源:

<gallery> 
    <albums> 
     <album name="Fútbol 9"> 
      <photos> 
       <photo width="600" height="400" filename="foto1.jpg" /> 
       <photo width="600" height="400" filename="foto2.jpg" /> 
       <photo width="600" height="400" filename="foto3.jpg" /> 
      </photos> 
     </album> 
     <album name="Fútbol 8"> 
      <photos> 
       <photo width="600" height="400" filename="foto4.jpg" /> 
       <photo width="600" height="400" filename="foto5.jpg" /> 
       <photo width="600" height="400" filename="foto6.jpg" /> 
      </photos> 
     </album> 
    </albums> 
</gallery> 

解決

添加回調函數來構造器,一旦加載完成處理XML數據。

回答

2

這裏的問題是您正在創建MediaGallery對象,它正在解析xml,然後在準備好之前檢查解析數據的大小。我會建議使用回調函數。要做到這一點,你只需要改變你的MediaGallery構造函數,如圖所示。

private var callbackObj:Object; 

public function MediaGallery(xmlSource:String, callback:Object) 
    { 
     var loader:URLLoader = new URLLoader(); 
     loader.load(new URLRequest(xmlSource)); 

     loader.addEventListener(Event.COMPLETE, loadGalleries); 
     this.callbackObj = callback; 
    } 

現在,您需要在實例MediaGallery類的更新方法,如:

public function update():void { 
    trace(mg.Albums.length); 
} 

最後,所有你需要做的是一個電話你Event.Complete添加到更新方法處理程序。 (以下面的方式修改)。

public function loadGalleries(e:Event):void 
    { 
     var xmlData:XML = new XML(e.target.data); 
     var album; 

     for each (album in xmlData.albums) 
     { 
      Albums.push(new MediaAlbum(album.attribute("name"), album.photos)); 
     } 

     this.callbackObj.update(); 
    } 

這應該解決您的問題:-D 請記住,當你正在處理一個的URLLoader,你需要所以它是事件驅動的編寫代碼或者你會試圖利用尚未數據檢索到。

好運

+0

我將它通過改變callbackObj成一個函數,然後使用'callbackObj.call(本)'工作。感謝提示馬特! – 2010-04-10 15:18:32