Utiliser du XML en ActionScript 3
Date de publication : 21/05/2007
Par
Morgan Loyer (pyrrha.developpez.com)
Découvrez rapidement et simplement comment accéder aux données d'un document xml en ActionScript 3.
Introduction
Il arrive fréquemment, lorsque l'on manipule de l'xml via l' ActionScript 2, que l'on en arrive à écrire une chose du genre :
docXML.firstChild.childNodes[2].childNodes[i].ChildNodes[j].ChildNodes[e].attributes.name
en cherchant une simple propriété de noeud xml...Pas pratique n'est ce pas ?
Nous allons découvrir dans ce cours, la nouvelle façon d'accéder à ces informations, en ActionScript 3 à l'aide de séries d'exemples simples.
II. Rappels sur le chargement de fichiers externes
En ActionScript 2, nous utilisions l'objet XML pour charger et "parser" un document xml.
En ActionScript 3, le système a été repensé, nous utilisons la classe URLLoader pour charger le document. *
Si vous ne savez pas charger une fichier en ActionScript 3, je vous invite dès à présent à lire le chapitre II de mon tutoriel sur les chargements, en vous rendant ici.
Voici, pour rappel, un exemple simple de code qui va nous permettre de charger le fichier xml que je n'expliquerai pas ici, un tutoriel existant déjà là.
import flash.events.IOErrorEvent;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.events.ProgressEvent;
var chargeur:URLLoader = new URLLoader ();
var adresse:URLRequest = new URLRequest ("/fichier/exemple.xml");
var format = URLLoaderDataFormat.TEXT;
chargeur.dataFormat = format;
chargeur.load(adresse);
chargeur.addEventListener(Event.COMPLETE, finDuChargement);
chargeur.addEventListener(ProgressEvent.PROGRESS, avancement);
chargeur.addEventListener(IOErrorEvent.IO_ERROR, indiquerErreur);
function finDuChargement ( event:Event ) {
var contenu = event.target.data;
trace("chargement finit ! "+contenu);
}
function avancement( event:Event) {
trace(event.bytesLoaded+" chargés sur "+event.bytesTotal);
}
function indiquerErreur( event:Event ) {
trace(event);
} |
Nous nous retrouvons donc avec notre objet loader et sa propriété data qui va permettre de récupérer le contenu du fichier xml.
Notez que la propriété dataFormat de l'objet URLLoader sera informée de URLLoaderDataFormat.TEXT;
III. La classe XML en actionScript 3
III-A. Déclarer un objet de type XML
Pour déclarer un objet de type XML, en ActionScript, plusieurs possibilités s'offrent à vous,
Si vous êtes adepte de simplicité, il vous suffit d'opérer comme suit :
var monXML:XML = <root>
<balise variable="testA" />
<balise vairbale="testB" />
<tests>
<test1/>
<test2/>
</tests>
</root>; |
 |
Remarquez l'absence de guillemets ! Ce n'est plus des données formatées en String.
|
Vous pouvez également opérer en instanciant le constructeur de la classe XML :
var monXML:XML = new XML ();
monXML = <balise><test/></balise>; |
Ou bien en instanciant le constructeur de la classe XML, avec le contenu de type String (avec guillemets ou sans guillemets dans les arguments :
var monXML:XML = new XML ("<balise><test/></balise>");
var monXML:XML = new XML (<balise><test/></balise>); |
III-B. Lire un objet de type XML
L'ActionScript 3 nous offre une manière bien plus souple pour accéder aux noeuds xml que l'ActionScript 2 et ActionScript 1.
Nous listerons les principales méthodes/syntaxes à connaître tout en les illustrant par des exemples.
III-B-1. Accéder au noeud principal
L'utilisation de la propriété firstchild de l'ActionScript 2 sur l'objet xml devient inutile, on accédera au contenu directement avec l'instance, sans se soucier de celà.
Ainsi :
var xml:XML = <balise><test>BlaBla</test></balise>;
trace(xml.test); |
Notez que pour connaître le nom du noeud principal, vous pouvez utiliser la méthode localName();
III-B-2. Accéder à l'objet au format String
Vous pouvez utiliser la méthode toXMLString() pour transformer votre objet en objet de type String.
III-B-3. Accéder aux balises
En ActionScript 3, une balise fille est assimilable une propriété de sa balise mère :
var xml:XML = <root><balise>Test</balise></root>;
trace(xml.balise);
trace(xml.balise[0]); |
III-B-4. Accéder aux attribtus d'une balise
En ActionScript 2, nous utilisions .attributes avec d'accéder à un attribut de balise,
En ActionScript 3, pour accéder aux attributs d'une balise, nous utiliserons le préfixe @.
var xml:XML = <root><balise name="Test" text="Je suis un attributs" /></root>;
trace( xml.balise.@name ); |
Notez la syntaxe entre crochets équivalente :
var xml:XML = <root><balise name="Test" text="Je suis un attributs" /></root>;
trace( xml.balise.@["name"] ); |
Il est également possible d'utiliser la méthode attribute();
var xml:XML = <root><balise name="Test" text="Je suis un attributs" /></root>;
trace(xml.balise.attribute("name") ); |
III-C. Parcourir un noeud
Encore une fois, l'ActionScript 3 va vous simplifier la tache, plusieurs façons de parcourir (parser) un noeud XML existe :
var xml:XML = <root>
<balise name="balise1" />
<balise name="balise2"/>
<balise name="balise3"/>
</root>;
for(var i:String in xml..balise) {
trace(xml.balise[i].@name);
} |
Vous pouvez également user de la fonction for each(var i in Array) {};, nouvelle, qui renvoie l'élément et non l'index d'un noeud ou tableau :
for each(var bal:XML in xml..balise) {
trace(bal.@name);
} |
Plus condensé encore, vous pouvez l'écrire comme ceci :
trace(xml..balise.@name); |
Ce code, très condensé, devient particulièrement intéressant lorsque l'on pose une condition pour trouver une balise.
Si nous cherchons la balise dont l'attribut name="balise2", nous ferons :
var xml:XML = <root>
<balise name="balise1" />
<balise name="balise2"/>
<balise name="balise3"/>
</root>;
var balise:XMLList = xml..balise.(@name=="balise2");
trace(balise.toXMLString()); |
III-D. Travailler sur un objet de type XML
III-D-1. Ajouter un noeud
Nous n'avons plus le besoin d'utiliser XMLNodes, il nous suffit de définir un objet monNoeud:XML, que nous ajouterons ensuite avec la méthode appendChild();
var xml:XML = <root><balise name="Test" text="Je suis un attribut" /></root>;
var monNoeud:XML = <balise name="noeud" text="Je suis un attribut" />;
xml.appendChild(monNoeud); |
Il est, bien sûr, possible d'inclure des données dynamiquement, pour cela, utilisez {} avec votre variable.
var xml:XML = <root><balise name="Test" text="Je suis un attribut" /></root>;
var nom:String = "noeuds (dynamique cette fois)";
var monNoeud:XML = <balise name={nom} text="Je suis un attribut" />;
xml.appendChild(monNoeud); |
IV. Conclusion
Ce cours touche à sa fin. Vous devriez à présent être en mesure de manipuler du XML avec l'ActionScript 3.
Pour toute question technique, de compréhension, d'aide, je vous demande de la poser sur le forum, je serais contraint de ne pas vous répondre sur mon mail par manque de temps.
Pour toute remarque, suggestion, correction, n'hésitez pas à me joindre en cliquant ici ou par message privé.
 
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur.
La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.
|