Probleme chargement XML et Listener
Bonjour,
Je suis actuellement en train d'essayer de charger un fichier XML à partir de ActionScript 3.
J'ai chercher sur beaucoup de forum et je retombe souvent sur la même solution qui est d'utiliser un objet URLLoader et de lui mettre un listener lors de la fin du chargement du fichier XML.
Le soucis est qu'à l'appel de ma fonction charger() (dans laquelle j'ajoute le listener) il n'attend pas la fin de mon chargement.
Du coup quand je veux récuperer les donnees XML que j'ai charger dans un tableau ça ne marche pas.
J'ai fait un affichage de "1" lors du chargement et un affichage de "2" après avoir lancer le chargement de mon XML et l'affichage de 2 de fait avant le 1, donc il ne passe pas en premier dans le chargement;
Je ne sais pas si je suis clair...
Je mets le code utile :
Voici la classe de chargement au sein de laquelle un tableau de donnees est rempli
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
|
package {
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.net.URLLoader;
import flash.net.URLRequest;
public class QuizzData extends EventDispatcher
{
private static const XML_FILE:String = "./xml/quizz.xml"; //url du fichier contenant les quizzs
private var donnees : Array; //tableau contenant les donnees du fichier XML
public function QuizzData()
{
super();
this.donnees = new Array();
}
//fonction executée après le chargement du fichier XML
private function onXMLLoaded(evt:Event) : void
{
var quizzXML : XML = new XML(evt.target.data); // creation d'un objet XML dans lequel sera stcoké le contenu du fichier quizz.xml
quizzXML.ignoreWhitespace = true;
//recuperation de l'ensemble des quizzs
var mesQuizzs : XMLList = quizzXML.elements("quizz");
for(var q:int = 0; q < mesQuizzs.length(); q++)
{
var sujet : String = mesQuizzs[q].attribute("sujet");
var questionsArray:Array = new Array();
// parcours de l'ensemble des questions du quizz
var mesQuestions : XMLList = mesQuizzs[q].elements("question");
for(var i:int = 0; i < mesQuestions.length(); i++)
{
var monNiveau:int = mesQuestions[i].attribute("niveau"); //recuperation du niveau de la question
var monEnonce:String = mesQuestions[i].enonce; //recuperation de l'enonce de la question
//parcours des differentes solutions pour la question
var mesReponses:XMLList = mesQuestions[i].elements("reponse");
// creation d'un tableau 2D pour contenir la reponse et sa valeur
var reponsesArray:Array = new Array(mesReponses.length());
for(var j:int = 0; j < reponsesArray.length; j++)
{
reponsesArray[j] = new Array(2);
}
//ajout de la reponse et de sa valeur
for(var k:int = 0; k < mesReponses.length(); k++)
{
reponsesArray[k][0] = mesReponses[k]; // ajout du texte de la reponse
reponsesArray[k][1] = mesReponses[k].attribute("bonne"); // ajout de la valeur de la reponse
}
//creation du tableau des questions
questionsArray.push(new Question(monEnonce, reponsesArray, monNiveau));
}
//ajout du quizz au tableau de données
this.donnees.push(new Quizz(sujet, questionsArray));
trace("1");
dispatchEvent(new Event(Event.COMPLETE)); /* UTILE ?*/
}
}
//chargement du fichier XML
public function charger() : void
{
var chargeur:URLLoader = new URLLoader(); //creation d'un chargeur pour le fichier XML
chargeur.addEventListener(Event.COMPLETE, onXMLLoaded, false, 0, true); //ajout d'un listener. La fonction onXMLLoaded est exécutée quand le fichier sera entierement chargé
chargeur.load(new URLRequest(XML_FILE)); //chargement du fichier XML
}
// accesseur sur les donnees
public function getDonnees() : Array
{
return this.donnees;
}
}
} |
Voici ma classe Quizz
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
package {
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.events.Event;
//import flash.events.ProgressEvent;
public class Quizz
{
private var sujet : String; // sujet du quizz
private var questions : Array; // tableau contenant les questions du quizz
// constructeur par defaut
public function Quizz(s : String, q : Array)
{
this.sujet = s;
this.questions = q;
}
// affichage d'un quizz
public function affiche() : void
{
trace("Sujet : " + this.sujet);
for each(var q:Question in questions)
q.affiche();
}
}
} |
Voici le .fla pour tester mon code
Code:
1 2 3 4 5 6 7
|
var monQuizzData:QuizzData = new QuizzData();
monQuizzData.charger();
trace(monQuizzData.getDonnees().length);
trace("2"); |
Merci d'avance pour le coup de main