【问题标题】:Call XML array from public method AS3从公共方法 AS3 调用 XML 数组
【发布时间】:2014-07-18 21:40:44
【问题描述】:

我想获取 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 和在返回之前等待它有关,但不知道该怎么做......

【问题讨论】:

    标签: xml actionscript-3 class load external


    【解决方案1】:

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

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

    parseXML_public.addEventListener("xmlLoadComplete", doSomething);
    parseXML_public.crearXMLArray("xml/xml_tonalidades.xml")); 
    
    function doSomething(e:Event){
        // Array is ready now
    }
    

    当你想要触发事件时,在你的加载器类中添加这个。

    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));
    }
    

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

    【讨论】:

    • 太棒了!我必须实例化该类,因为尝试从静态私有函数中获取 dispatchEvent 不起作用!我在 parseXML_public 中添加了 dispatchEvent(new Event("xmlLoadComplete", true, false));正如你所说,在我的主课中,我做了以下事情: var myExternalXML:parseXML_public = new parseXML_public(); myExternalXML.crearXMLArray("xml/xml_tonalidades.xml"); myExternalXML.addEventListener("xmlLoadComplete", doSomething);在 doSomething 我复制了数组!非常感谢!
    • 几乎忘记了!我还将静态私有变量更改为公共而不是静态的!
    猜你喜欢
    • 1970-01-01
    • 2011-09-19
    • 2011-08-16
    • 2015-08-26
    • 2019-04-14
    • 1970-01-01
    • 2014-08-06
    • 2012-06-10
    • 1970-01-01
    相关资源
    最近更新 更多