从公共方法AS3调用XML数组

时间:2014-07-18 21:40:45

标签: xml actionscript-3 class load external

我想获取xml数据并将其放入对象数组中。我使用这种公共方法:

package 
{
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLRequest;

public class parseXML_public 
{
    static private var myXML:XML;
    static private var xml_array:Array=new Array;

    public function parseXML_public() {

        }

        public static function  crearXMLArray(s:String):Array{

        loadXML(s);
        return xml_array;
        }

        static private function loadXML(s:String):void 
        {
            var myURLRequest:URLRequest;
            var myURLLoader: URLLoader;
            myURLRequest = new URLRequest();
            myURLRequest.url = s;
            myURLLoader = new URLLoader();
            myURLLoader.addEventListener(Event.COMPLETE, onXMLComplete);
            myURLLoader.load(myURLRequest);

        }

        static private function onXMLComplete(e:Event):void 
        {
            myXML = new XML(e.target.data);     
            parseXML();
        }

        static private function parseXML():void 
        {
            var i:Number;
            var j:Number;
            var nodos:Number;
            var my_obj:Object;
            nodos = Math.floor(myXML.*.*.length() / (myXML.*.length()));
            for (i = 0; i < myXML.*.length(); i++) {

                xml_array[i] = new Array();

                for (j = 0; j < nodos; j++) {

                    my_obj = new Object();
                    my_obj.nombre = myXML.child(i).child(j).@nombre;
                    my_obj.posX = myXML.child(i).child(j).@posX;
                    my_obj.posY = myXML.child(i).child(j).@posY;
                    xml_array[i].push(my_obj);
                }   
            }

       //trace(xml_array); //--> It shows the array charged!
        }

}

}

当我从主类中调用数组时,我会这样做:

parseXML_public.crearXMLArray("xml/xml_tonalidades.xml")); 

(如果我追踪它,数组是空的)我认为它与URLLoader有关并在返回之前等待它,但无法知道如何做...

1 个答案:

答案 0 :(得分:0)

数组跟踪为空的原因是因为您需要等待它加载。这就是我要做的。

在主类中添加一个事件监听器以等待数据返回。

parseXML_public.addEventListener("xmlLoadComplete", doSomething);
parseXML_public.crearXMLArray("xml/xml_tonalidades.xml")); 

function doSomething(e:Event){
    // Array is ready now
}

在你的loader类中,当你想要触发事件时添加它。

this.dispatchEvent(new Event("xmlLoadComplete",true,false));

也许是这样的。

static private function parseXML():void 
{
    var i:Number;
    var j:Number;
    var nodos:Number;
    var my_obj:Object;
    nodos = Math.floor(myXML.*.*.length() / (myXML.*.length()));
    for (i = 0; i < myXML.*.length(); i++) {
       xml_array[i] = new Array();
       for (j = 0; j < nodos; j++) {
           my_obj = new Object();
           my_obj.nombre = myXML.child(i).child(j).@nombre;
           my_obj.posX = myXML.child(i).child(j).@posX;
           my_obj.posY = myXML.child(i).child(j).@posY;
           xml_array[i].push(my_obj);
       }   
    }
    this.dispatchEvent(new Event("xmlLoadComplete",true,false));
}

请记住,您可能必须导入一些事件类才能编译。祝你好运!