我正在尝试解析XML文件并从其数据中创建一个对象数组。数据将转换为MediaAlbum类(我自己的类)。正确解析XML并加载对象,但是当我实例化它时,Albums
数组的长度为零,即使数据加载正确也是如此。
我真的不知道问题是什么......有什么提示吗?
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数据。
答案 0 :(得分: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处理程序中添加对update方法的调用。 (以下列方式改变它。)
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时,您需要编写代码以使其受事件驱动,或者您将尝试使用尚未检索的数据。
祝你好运