AS3:从XML解析的对象数组保持零长度

时间:2010-04-09 23:24:43

标签: xml actionscript-3 arrays object

我正在尝试解析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数据。

1 个答案:

答案 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时,您需要编写代码以使其受事件驱动,或者您将尝试使用尚未检索的数据。

祝你好运