Un tableau !
Rassurez-vous, pour naviguer dans notre document XML, il existe une propriété beaucoup plus simple ! Elle renvoie un tableau de tous les noeuds composant la branche courante.
Dans notre exemple, le code ci-dessous renvoie tous les noeuds "livre", chacun dans une cellule du tableau :
this.firstChild.childNodes
On peut donc accéder au premier livre de cette façon :
this.firstChild.childNodes[0].
Avouez que c'est tout de même plus simple ?
Maintenant, petit exercice tout simple, faites-moi apparaître dans la fenêtre de sortie tous les titres des livres !
Secret (cliquez pour afficher)Code : Actionscript 1
2
3
4
5
6
7
8
9
10
11
12
13 | var bibliotheque:XML = new XML();
bibliotheque.ignoreWhite = true;
bibliotheque.onLoad = function(succes) {
if (succes) {
var livres:Array = this.firstChild.childNodes;
for (var i=0;i<livres.length;i++) {
trace(livres[i].firstChild.firstChild);
}
} else {
trace("Une erreur s'est produite");
}
};
bibliotheque.load("bibliotheque.xml");
|
Comme vous le voyez, pour simplifier la boucle, j'ai créé une référence au tableau des livres que j'ai justement appelé
livres.
Vous vous demandez peut-être pourquoi j'ai écrit deux fois
firstChild pour afficher le titre.
En fait, comme nous l'avons vu tout à l'heure, quand on parle de noeud, on comprend les balises qui le matérialisent avec. Or, nous, on ne veut pas les balises
<titre>[...]</titre> dans notre fenêtre de sortie. On rajoute donc un
firstChild qui fait référence au noeud dit "texte", c'est-à-dire au contenu du noeud.
Dans le code ci-dessus, j'ai fait une "erreur" au niveau du typage des variables. En fait, il ne faut pas oublier que firstChild ne renvoie pas une chaîne de caractères, mais un objet XMLNode. Il faut donc rajouter nodeValue, qui va renvoyer la valeur sous forme d'une chaîne. J'aurais donc du écrire trace(livres[i].firstChild.firstChild.nodeValue);
Même si dans le cas d'un trace() on s'en fiche, pour d'autres utilisations, il est préférable de respecter le type des variables !
Exerice de style
Un tuto de ce genre a toujours besoin d'un petit exercice de style pour pouvoir bien appliquer les connaissances !
On va essayer de combler un manque dans les outils que nous donne Flash pour manipuler le XML. Quand on utilise
childNodes, on a un tableau des noeuds enfants. Par exemple, si je suis dans le noeud "livre" et que je veux accéder au "titre", il faudra que j'écrive
childNode[0], car je sais que "titre" est le premier noeud. Le problème, c'est que "titre" ne sera peut-être pas toujours le premier noeud, d'ailleurs, dans un document XML, l'ordre est susceptible de changer...
Vous allez donc créer une méthode pour la classe
XMLNode, qui va renvoyer un tableau de tous les noeuds ayant un certain nom de balise. On lui donnera le même nom que son homologue dans le langage Javascript :
getElementByTagName
Deux nouvelles connaissances pour réaliser cette méthode :
La propriété nodeName
Vous aurez besoin de la propriété
nodeName, qui renvoie
le nom de la balise du noeud courant.
Ainsi, dans notre exemple,
this.firstChild.nodeName correspond à la chaîne de caractères "bibliotheque", qui est bien le nom de notre noeud racine.
Les prototypes
J'ai bien précisé que vous alliez créer une méthode, et non pas une fonction (une méthode est une fonction qui appartient à une classe). On devra donc l'utiliser de cette façon :
Code : Actionscript | trace(un_noeud.getElementByTagName('nom_balise'));
|
Ce qui devra renvoyer un tableau des balises s'appelant "
nom_balise" dans
les enfants directs de
un_noeud.
Il faut donc utiliser la notion de prototype, qui permet de rajouter des méthodes à une classe.
Je vous donne donc notre méthode, vide du code, il ne vous reste plus qu'à la compléter !
Code : Actionscript | XMLNode.prototype.getElementByTagName = function(Tag:String):Array {
// Le code
}
|
Sachez qu'à l'intérieur de cette méthode,
this correspond au noeud qui portera la méthode, et que
Tag sera le nom de la balise à chercher, passée en argument.
Je rappelle que la méthode doit renvoyer un tableau (d'où le
:Array à la fin de la ligne) !
Je vous souhaite bonne chance pour cet exercice, car c'est l'un des plus compliqués depuis le début du tutoriel complet, car il fait appel à beaucoup de nouvelles notions. Je vous conseille donc de le faire sans tricher, car si vous le finissez par vous-mêmes, c'est que vous aurez déjà assimilé des concepts très importants en AS ! Si vous bloquez, utilisez l'aide de Flash !
Correction possible :
Secret (cliquez pour afficher)Code : Actionscript 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 | XMLNode.prototype.getElementByTagName = function(Tag:String):Array {
var bons_noeuds = new Array();
var tous_noeuds = this.childNodes;
for (var i:Number = 0; i<tous_noeuds.length; i++) {
noeud_courant = tous_noeuds[i];
if (noeud_courant.nodeName == Tag) {
bons_noeuds.push(noeud_courant);
}
}
return (bons_noeuds.length<=0)? null : bons_noeuds;
};
//--
var bibliotheque:XML = new XML();
bibliotheque.ignoreWhite = true;
bibliotheque.onLoad = function(succes) {
if (succes) {
trace(this.firstChild.nodeName);
var livres:Array = this.firstChild.childNodes;
for (var i = 0; i<livres.length; i++) {
trace(livres[i].getElementByTagName('titre'));
}
} else {
trace("Une erreur s'est produite");
}
};
bibliotheque.load("bibliotheque.xml");
|