Aller au menu - Aller au contenu

Icône Gestion du XML

Mise à jour : 08/07/2010
4 613 visites depuis 7 jours, dont 50 sur ce chapitre classé 39/786
Si vous avez un peu bourlingué sur le web, ou même juste dans l'aide de Flash, vous avez dû tomber au moins une fois sur cet étrange acronyme : XML

Que se cache-t-il dans ces trois lettres, et en quoi peuvent-elles nous aider quand on programme une application en Flash ?
Voilà la question à laquelle nous allons tenter de répondre !
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Rappel sur le XML

XML est l'acronyme de Extensible Markup Language. En français, ça veut dire : langage de balises extensible. Vous allez me dire que ça ne nous avance pas beaucoup, et vous n'avez pas tout à fait tort ^^ !
En gros, avec le XML, on pourra enregistrer des informations qui seront rangées grâce à des balises.

Si vous voulez des infos sur le XML et sa structure, allez faire un tour sur le tuto : Le point sur XML. Moi, je passe directement à la suite. :p


Pour pouvoir nous amuser, nous allons prendre un petit exemple trivial de fichier XML :

Code : XML
 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
<?xml version='1.0' encoding="UTF-8" ?>
<bibliotheque>
  <livre isbn="2-02-022212-4">
        <titre>Don Quichotte de la Manche</titre>
        <auteur>Miguel De Cervantes</auteur>
        <tome>1</tome>
  </livre>
  <livre isbn="2-02-022213-2">
        <titre>Don Quichotte de la Manche</titre>
        <auteur>Miguel De Cervantes</auteur>
        <tome>2</tome>
  </livre>
  <livre isbn="2-07-037924-8">
        <titre>Du côté de chez Swann</titre>
        <auteur>Marcel Proust</auteur>
  </livre>
  <livre isbn="2-7116-0519-1">
        <titre>De la recherche de la vérité</titre>
        <auteur>Malebranche</auteur>
        <tome>2</tome>
  </livre>
  <livre isbn="2-07-032325-0">
        <titre>La psychanalyse du feu</titre>
        <auteur>Gaston Bachelard</auteur>
  </livre>
</bibliotheque>


Pour l'instant, je vous demanderais d'enregistrer ce fichier XML dans le même dossier que votre animation, vous lui donnerez comme nom : bibliotheque.xml.

Chargement

On va encore utiliser une classe spéciale. :p Il s'agit, vous l'aurez deviné, de la classe XML.

Comme d'habitude, on va commencer par l'instanciation :
Code : Actionscript
1
var bibliotheque:XML = new XML();


Ignorer les blancs



Intéressons-nous à la propriété ignoreWhite de la classe XML. Non, elle n'a rien de raciste :p , elle est au contraire très utile !
Si on la laisse à false (valeur par défaut), rien ne changera dans le fichier XML ; si on la met à true, elle supprimera tous les espaces, tabulations et autres retours à la ligne qui ne font pas partie d'un noeud texte !

En gros elle transformera :
Code : XML
1
2
3
4
<mon_xml>
  <noeud_texte> salut les amis ! </noeud_texte>
  <noeud_vide> </noeud_vide>
</mon_xml>


En
Code : XML
1
<mon_xml><noeud_texte> salut les amis ! </noeud_texte><noeud_vide /></mon_xml>


Elle n'a pas altéré le noeud contenant le texte, mais elle a simplifié le noeud qui ne contenait qu'un espace, supposant alors qu'il était vide.

Dans notre exemple de bibliotheque, on n'a aucun noeud contenant uniquement des espaces, on utilisera donc ignoreWhite uniquement pour que vous vous rappeliez de cette propriété. :)
Code : Actionscript
1
2
var bibliotheque:XML = new XML();
bibliotheque.ignoreWhite = true;


load() et onLoad()



En fait, on retrouve les mêmes méthodes qu'on utilisait avec la classe LoadVars et XML. Donc, si vous vous souvenez bien des chapitres précédents, le code ci-dessous ne devrait pas vous poser de problème :
Code : Actionscript
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
var bibliotheque:XML = new XML();
bibliotheque.ignoreWhite = true;
bibliotheque.onLoad = function(succes) {
        if (succes) {
                trace(this);
        } else {
                trace("Une erreur s'est produite");
        }
};
bibliotheque.load("bibliotheque.xml");


Le ignoreWhite étant sur la valeur true, la fenêtre de sortie devrait vous afficher ça :
Code : XML
1
<?xml version='1.0' encoding="UTF-8" ?><bibliotheque><livre isbn="2-02-022212-4"><titre>Don Quichotte de la Manche</titre><auteur>Miguel De Cervantes</auteur><tome>1</tome></livre><livre isbn="2-02-022213-2"><titre>Don Quichotte de la Manche</titre><auteur>Miguel De Cervantes</auteur><tome>2</tome></livre><livre isbn="2-07-037924-8"><titre>Du côté de chez Swann</titre><auteur>Marcel Proust</auteur></livre><livre isbn="2-7116-0519-1"><titre>De la recherche de la vérité</titre><auteur>Malebranche</auteur><tome>2</tome></livre><livre isbn="2-07-032325-0"><titre>La psychanalyse du feu</titre><auteur>Gaston Bachelard</auteur></livre></bibliotheque>


Le fichier XML a donc bien été chargé dans l'objet bibliotheque, et nous allons voir comment l'exploiter !

Sachez qu'il existe d'autres façons de créer un objet XML dans Flash. Vous pourriez très bien charger le fichier avec l'objet LoadVars, et ensuite utiliser la méthode parseXML() pour le passer à un objet XML.

Une grande famille !

Un document XML peut se représenter sous la forme d'un arbre, c'est pour cela qu'on parle de noeuds entre les branches, il y a des noeuds enfants et noeuds parents.
A l'intérieur de notre objet XML nommé bibliotheque, on va trouver des noeuds qui sont en fait chacun une instance de la classe XMLNode, dont on va voir quelques propriétés et méthodes.

Le premier enfant



La propriété la plus basique est firstChild. Elle fait référence au premier enfant du noeud courant. Pour l'instant, dans l'objet bibliotheque, on ne s'est encore placé dans aucun noeud, même pas le noeud racine matérialisé par les balises <bibliotheque>[...]</bibliotheque>.

Pour voir ce qui se passe, changez donc le trace(this); par trace(this.firstChild);
Cela renvoie le tout premier noeud rencontré, qui se trouve être le noeud racine, c'est-à-dire tout ce qui se trouve entre <bibliotheque>[...]</bibliotheque>, les balises inclues.

Donc, en suivant cette logique, quelle serait la valeur de this.firstChild.firstChild ?

Le premier noeud de bibliotheque correspond au premier livre, cette variable vaudrait donc (en la remettant en forme pour plus de lisibilité) :

Code : XML
1
2
3
4
5
<livre isbn="2-02-022212-4">
        <titre>Don Quichotte de la Manche</titre>
        <auteur>Miguel De Cervantes</auteur>
        <tome>1</tome>
  </livre>


Les frères, les soeurs et le cadet !



Voyons rapidement les autres propriétés du même acabit.

Le cadet


lastChild renvoit, à l'inverse de firstChild, le dernier noeud de la branche courante.
Par exemple, this.firstChild.lastChild correspond au dernier livre de la liste.
Notez qu'on aurait très bien pu écrire this.lastChild.lastChild, qui aurait la même signification, car le noeud racine est à la fois premier et dernier noeud de sa branche.


Les frères et soeurs


Les anglais ont la chance d'avoir un mot qui veut dire "frères et soeurs" : il s'agit de "sibling". On trouve ainsi une propriété nextSibling, qui retourne le noeud suivant sur la même branche que le noeud courant, c'est-à-dire un noeud frère.

this.firstChild.firstChild correspondait au premier livre.
this.firstChild.firstChild.nextSibling correspond donc à son frère suivant, c'est-à-dire le second livre de la liste.

Et on peut continuer ainsi autant que vous le voulez. Par exemple, cette affreuse ligne renvoie au dernier livre de la liste :
this.firstChild.firstChild.nextSibling.nextSibling.nextSibling.nextSibling

Il existe aussi la propriété previousSibling, qui correspond au frère précédent.

Le parent



Là, je vous ai montré les propriétés qui permettent de "descendre" dans la généalogie. Sachez qu'il existe aussi la propriété parentNode, qui permet de remonter au noeud parent.

Par exemple, this.firstChild.parentNode, revient au même que this.

Types et attributs

Les types



Chaque noeud possède un type précis auquel on peut accéder par la propriété nodeType.
Nous verrons seulement les 2 types les plus courants, vous trouverez le tableau complet des valeurs dans l'aide de Flash.


Intéressons-nous au type du noeud racine :
Code : Actionscript
1
trace(this.firstChild.nodeType);


Cela nous renvoie 1, c'est-à-dire qu'il s'agit d'un noeud élément qui contient donc d'autres noeuds.

C'est aussi le type du premier noeud "livre", ainsi que celui de son premier noeud, "titre".

Cela peut paraître étonnant, car <titre>[...]</titre> contient du texte et aucun autre élément. En fait, ActionScript considère que ce qu'il y a àl'intérieur de balises est toujours un noeud : il faut donc aller encore au noeud enfant pour trouver vraiment le texte !
Code : Actionscript
1
2
3
4
trace(this.firstChild.firstChild.firstChild); // Correspond au noeud "titre"
trace(this.firstChild.firstChild.firstChild.nodeType); // Renvoie 1
trace(this.firstChild.firstChild.firstChild.firstChild); // Correspond au texte à l'intérieur de "titre"
trace(this.firstChild.firstChild.firstChild.firstChild.nodeType); // Renvoie 3, car le noeud est textuel


Ce qui nous permet de constater qu'un noeud texte a le type 3.

Les attributs



Les attributs en XML sont les valeurs qu'on explicite à l'intérieur même d'une balise. Dans notre exemple, il s'agit du numéro ISBN, qui est présent dans chaque balise "titre".

Pour récupérer ce numéro, il faut utiliser la propriété attributes, qui ne retourne non pas un tableau des attributs du noeud, mais un objet avec les attributs comme propriété.

Pour accéder à l'ISBN du premier livre, il faudra donc taper :
Code : Actionscript
1
trace(this.firstChild.firstChild.attributes.isbn);

XML tabulaire

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
1
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
1
2
3
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");
Avant de continuer, un bon conseil : travaillez à fond ce que vous venez de voir ! C'est très très important, y compris les explications qui n'ont pas de rapport direct avec le XML, comme les prototypes par exemple !
Chapitre précédent Sommaire Chapitre suivant

Partager

5 commentaires pour "Gestion du XML"
Note moyenne : 3.24 / 4 (137 votes)
Pseudo Commentaire
Hors ligne SatoshiTajiri # Posté le 23/12/2006 à 01:36:14
Avatar

Super ! Ce cours est très bien :)
Flash est dur à maîtriser et grâce à toi je vais pouvoir poursuivre mon apprentissage !
Hors ligne Arthur2sete # Posté le 08/03/2007 à 13:03:43

Vraiment super !!! Je n'ai Qu'une question :
Secret (cliquez pour afficher)
Pour quand la fin de ce super tuto ?

Encore merci
Hors ligne Freak # Posté le 18/04/2007 à 18:38:54

Très très bon cours, merci beaucoup!
J'attend avec impatience la suite!!!
Hors ligne rahjuliano # Posté le 15/05/2009 à 16:40:05

Ville : Montigny-les-metz
Pays : France métropolitaine

Super, mais je ne vais pas le suivre car il est entièrement en AS2 dommage pour moi. A quand un tuto AS3 ? :D
Hors ligne FROZ3N BYT3 # Posté le 19/02/2011 à 17:30:23
Avatar

bonjours;
est ce que ce cours répond aussi du xml du technique web ??

Bon courage.
 

Voir tous les commentaires