Me he confeccionado una clase para cargar XML y hacerle un "parse" para pasar todo el contenido a un array.
Parece funcionar bien y el código está copiado de los ejemplos y tutos habituales sobre como cargar un XML y demás, la he convertido en clase "static" para llamarla directamente sin crear instancia. Tiene muchos trace al final para comprobar que todo está OK, y el array me lo enseña completo sin problemas.
Código ActionScript :
package {
import flash.events.Event;
import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.display.MovieClip;
public class XmlLoader {
private static var fichero:String = "";
private static var xml:XML;
private static var i:int;
private static var longitud:Number = 0;
private static var xmlArray:Array = new Array();
private static var esperaAdivinanza:int = 0;
private static var esperaPizarra:int = 0;
private static var empiezaSolucion:int = 0;
private static var empiezaAdivinanza:int = 0;
private static var terminaAdivinanza:String = "0";
private static var empiezaPizarra:int = 0;
// declaro el 'constructor'
public function XmlLoader() {
trace ("no hago nada");
}
//funcion que llamaré despues pasándole el nombre del fichero
//y me devolverá el array
public static function cargaXML(fichero):Array {
var loader:URLLoader = new URLLoader(new URLRequest(fichero));
loader.addEventListener(Event.COMPLETE, xmlLoaded);
return xmlArray;
}
public static function xmlLoaded(e:Event):void {
e.target.removeEventListener(Event.COMPLETE, xmlLoaded);
xml = new XML(e.target.data);
xml.ignoreWhitespace=true;
longitud = xml.adivinanza.length();
esperaAdivinanza = xml.tiempos.tiempo1;
esperaPizarra = xml.tiempos.tiempo2;
empiezaSolucion = xml.tiempos.tiempo3;
empiezaAdivinanza = (esperaAdivinanza + esperaPizarra);
terminaAdivinanza = String(esperaPizarra - 1);
empiezaPizarra = (esperaPizarra - 1);
xmlArray.push(longitud);
xmlArray.push(esperaAdivinanza);
xmlArray.push(esperaPizarra);
xmlArray.push(empiezaSolucion);
xmlArray.push(empiezaAdivinanza);
xmlArray.push(terminaAdivinanza);
xmlArray.push(empiezaPizarra);
for (i=0; i < longitud ; i++) {
xmlArray.push(xml.adivinanza[(i)].linea1);
xmlArray.push(xml.adivinanza[(i)].linea2);
xmlArray.push(xml.adivinanza[(i)].linea3);
xmlArray.push(xml.adivinanza[(i)].linea4);
xmlArray.push(xml.adivinanza[(i)].@solucion);
}
trace ("**********************************");
trace ("* Cargado adivinanzas_config.xml *");
trace ("**********************************");
trace ("");
trace ("Configuración:");
trace ("");
trace (" Tiempo que se muestra la adivinanza a pantalla completa: " + esperaAdivinanza + " segundos.");
trace (" Tiempo que se muestra la pizarra: " + esperaPizarra + " segundos.");
trace (" Tiempo que se muestra la solución: " + empiezaSolucion + " segundos.");
trace ("");
trace ("Fin configuración");
trace ("");
trace ("Adivinanzas:");
trace ("");
trace ("Hay " + longitud + " adivinanzas.");
trace ("");
trace (xmlArray);
trace ("");
trace ("***********************************");
trace ("* OK parse adivinanzas_config.xml *");
trace ("***********************************");
}
}
}
Mi PROBLEMON viene cuando intento llamar esta clase desde, por ejemplo:
Código ActionScript :
package {
import flash.display.MovieClip;
import XmlLoader;
public class Probandoclase extends MovieClip {
public var longitud:Number = 22;//Por darle un valor cualquiera para ver si lo cambia
public var nuevoArray:Array = new Array();
public function Probandoclase():void {
nuevoArray = XmlLoader.cargaXML("imaxina_datos/adivinanzas_config.xml");
trace ("Resultado:");
trace (nuevoArray);
}
}
}
No da ningún error peeeero en el output veo:
Resultado:
*************************
* Cargado adivinanzas_config.xml *
Blah, blah, blah, y todo el trace de la clase XmlLoader sale perfecto, pero el array nuevoArray está vacio como puede comprobarse en la línea en blanco que aparece a continuación de 'Resultado:'
Creo que mis problemas vienen de que no entiendo bien el flujo del script, parece como que el evento que se le pone al loader para que haga el parsing una vez terminado de cargar el fichero XML no se ejecuta donde yo pienso y el flujo principal del script continua y cuando devuelve el array desde la llamada a la clase todavía no está cargado o algo así... Me cuesta explicarlo. Por muchas vueltas que le doy y cientos de pruebas y diferentes versiones, siempre me encuentro con lo mismo, el array continua vacio.
Alguna idea?
Lo que me gustaría es poder llamar a una clase que me cargue un XML de unas características determinadas (no voy a reutilizar la clase para otros XMLs) y lo pase a uno o varios arrays para luego poder disponer de el/ellos durante el resto del script. Parece fácil, pero me está acabando con la paciencia hasta el punto de postear en un foro, cosa que sólo hago cuando ya me he leído todo lo que he encontrado
Agradezco sus comentarios de antemano.
Un saludo
JParis
