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à.
//
nous
importons
les
classes
necessaires
:
import
flash.
events.
IOErrorEvent;
import
flash.
net.
URLLoader;
import
flash.
net.
URLRequest;
import
flash.
events.
Event;
import
flash.
events.
ProgressEvent;
//
nous
déclarons
un
objet
URLLoader
:
var
chargeur:
URLLoader =
new
URLLoader (
);
//
nous
créons
un
objet
URLRequest
qui
contient
l'url
du
fichier
:
var
adresse:
URLRequest =
new
URLRequest (
"
/fichier/exemple.xml
"
);
//
nous
définissons
le
format
du
fichier
chargé
:
var
format =
URLLoaderDataFormat.
TEXT;
chargeur.
dataFormat =
format;
//
nous
lançons
le
chargement
du
fichier,
en
indiquant
l'adresse
de
celui
ci
par
l'objet
URLRequest
:
chargeur.
load
(
adresse);
//
définition
des
évenements
de
l'objet
chargeur
chargeur.
addEventListener
(
Event.
COMPLETE,
finDuChargement);
chargeur.
addEventListener
(
ProgressEvent.
PROGRESS,
avancement);
chargeur.
addEventListener
(
IOErrorEvent.
IO_ERROR,
indiquerErreur);
//
définition
de
la
fonction
exécutée
par
l'évenement
COMPLETE
:
//
(
déclenchée
lorsque
le
chargement
se
termine
)
function
finDuChargement (
event:
Event ) {
var
contenu =
event.
target
.
data
;
trace
(
"
chargement
finit
!
"
+
contenu);
}
//
définition
de
la
fonction
éxecutée
par
l'évenement
PROGRESS
:
//
déclenchée
à
chaque
avancement
du
chargement
)
function
avancement
(
event:
Event) {
trace
(
event.
bytesLoaded
+
"
chargés
sur
"
+
event.
bytesTotal
);
}
//
fonction
indiquant
si
une
erreur
de
chargmement
survient
:
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>
"
);
//
ou
bien
:
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);
//
affiche
"BlaBla"
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
Test
//
ou
:
trace
(
xml.
balise[
0
]
);
//
trace
Test
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
);
//
trace
Test
Notez la syntaxe entre crochets équivalente :
var
xml:
XML
=
<
root>
<
balise name
=
"
Test
"
text
=
"
Je
suis
un
attributs
"
/
>
<
/
root>
;
trace
(
xml.
balise.
@[
"
name
"
]
);
//
trace
Test
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
"
) );
//
trace
Test
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 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 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 =
xml.
.
balise.
(
@name
=
=
"
balise2
"
);
trace
(
balise.
toXMLString
(
));
//
affiche
<balise
name="balise2"/>
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
attributs
"
/
>
<
/
root>
;
var
monNoeud:
XML
=
<
balise name
=
"
noeud
"
text
=
"
Je
suis
un
attributs
"
/
>
;
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
attributs
"
/
>
<
/
root>
;
var
nom=
"
noeuds
(dynamique
cette
fois)
"
;
var
monNoeud:
XML
=
<
balise name
=
{
nom}
text
=
"
Je
suis
un
attributs
"
/
>
;
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.
Je vous encourage à me joindre pour toute idée, suggestion, correction, en cliquant ici.