Forums Développement Multimédia

Les formations Mediabox
Les formations Mediabox

Charger et lire un XML en ActionScript 3

Compatible ActionScript 3. Cliquer pour en savoir plus sur les compatibilités.

Article écrit le 27/05/2008 22:58.
Par tannoy ( Antony Chauviré ).

Le langage XML permet de structurer et hiérarchiser des données. La syntaxe du langage est proche de l'HTML avec l'énorme avantage de pouvoir créer ses propres nom d'éléments (balises).

Nous allons examiner à travers cet exemple comment il est possible d'utiliser un document au format XML dans Flash avec le langage ActionScript 3. Le chargement et l'utilisation d'un fichier XML va se dérouler en 3 étapes :

  • Chargement du fichier XML
  • Récupération du flux XML à la fin du chargement
  • Lecture du flux XML

1. Le chargement du fichier XML

Comme pour le chargement de fichiers textes, on utilise la classe URLLoader pour charger notre fichier XML.

La classe URLLoader télécharge des données à partir d’une URL sous forme de texte, de données binaires ou de variables de code URL. Elle est utile pour télécharger des fichiers texte, XML ou d'autres informations destinées à être utilisées dans une application dynamique de donnée.

On va donc déclarer et instancier un objet de type URLLoader.

var chargementXML:URLLoader = new URLLoader();// objet de chargement

Le chargement du fichier XML va être réaliser grâce à la méthode load() d'un objet URLLoader.

Cette méthode prend un seul paramètre, qui correspond à une instance URLRequest. Une instance URLRequest contient toutes les informations d'une requête HTTP unique, telles que l'URL cible.

On va donc déclarer et instancier un objet de type URLRequest. Il s'agit d'un exemple de carnet d'adresses.

var fichier:URLRequest = new URLRequest("carnet.xml");
// url du fichier chargé
<?xml version="1.0" encoding="iso-8859-1"?>
<carnet>
	<personne sexe="M">
		<nom>Peltry</nom>
		<prenom>Christan</prenom>
		<email>cpeltry@worldmac.com</email>
	</personne>
	<personne sexe="F">
		<nom>Ramtaine</nom>
		<prenom>Karence</prenom>
		<email>kramtaine@design.net</email>
	</personne>
	<personne sexe="F">
		<nom>Rafèvre</nom>
		<prenom>Marianne</prenom>
		<email>arafeve@mediaplus.org</email>
	</personne>
	<personne sexe="M">
		<nom>Chevathon</nom>
		<prenom>Jévan</prenom>
		<email>jchevathon@sakhatan.com</email>
	</personne>
	<personne sexe="M">
		<nom>Malard</nom>
		<prenom>Benippe</prenom>
		<email>bmalard@isasecurity.com</email>
	</personne>
</carnet>

Les données XML chargées ne sont disponibles à l'utilisation dans Flash que lorsque la totalité du fichier est chargé.

Nous allons donc utiliser l'événement COMPLETE pour accéder aux données à la fin du chargement.

Un écouteur d'événement va être ajouté à notre objet URLLoader. L'événement écouté sera l'événement Event.COMPLETE et la fonction chargementComplet sera appelée dès lors que l'événement aura lieu.

chargementXML.addEventListener( Event.COMPLETE, chargementComplet );

Puis on va lancer le chargement du fichier XML avec la méthode load().

chargementXML.load( fichier );

2. Récupération du flux XML à la fin du chargement

La fonction chargement s'exécute lorsque le chargement du fichier XML est terminé.

Un objet Event est transmit à la fonction en tant que paramètres lorsque l'événement COMPLETE se produit.

// chargement terminé du fichier xml
function chargementComplet(pEvt:Event):void { }

Le paramètre de type Event contient une propriété target dans laquelle est stocké l'objet associé à l'écouteur d'événements. Dans notre cas, il s'agit de l'objet URLLoader.

Les données reçues, une fois le chargement terminé, sont stockées dans la propriété data de l'objet URLLoader. Ces données étant des données XML, on va pouvoir les stocker dans un objet de type XML.

// chargement terminé du fichier xml
function chargementComplet(pEvt:Event):void
{
// on récupère notre xml
var adresses:XML = new XML( pEvt.target.data );
//la classe XML est une classe native de Flash, on la trouve 
//dans le package Top Level.
}

3. Lecture du flux XML

Le document XML est constitué d'une liste d'éléments (noeuds) XML, en l'occurrence ici, une liste de personnes.

Cette liste va donc pouvoir être stockée dans un objet de type XMLList.

On accèdera à liste des éléments en utilisant la méthode elements() de l'objet XML.

var personnes:XMLList = adresses.elements(); 
//le document XML est constitué d'une liste d'éléments XML, 
//en l'occurence ici, une liste de personnes

Pour parcourir toute la liste d'éléments, on utilise une une boucle for each. Chaque élément (nœud) contenu dans la liste des éléments, est un objet de type XML.

for each(var contact:XML in personnes)
//pour chaque nœud enfant dans la liste des personnes { }

On accède aux éléments enfants d'un nœud XML en utilisant la syntaxe pointée et le nom des éléments (balises) XML.

Dans notre exemple, on souhaite afficher le nom et le prénom de toutes les personnes de notre carnet d'adresses.

for each(var contact:XML in personnes)
//pour chaque nœud enfants dans la liste des personnes
{
trace(contact.nom + " " + contact.prenom); 
//on utilise la syntaxe pointée pour accéder aux nœuds 
// enfants d'un nœud XML
}

Un nœud XML peut posséder des attributs. On utilise la syntaxe pointée et l'arobase pour accéder aux attributs d'un objet XML.

for each(var noeudContact:XML in personnes)
//pour chaque nœud enfant dans la liste des personnes
{
trace(noeudContact.prenom+", de sexe "+noeudContact.@sexe); 
//on utilise la syntaxe pointée et l'arobase pour accéder aux attributs d'un objet XML
}

Il est possible de filtrer des éléments dans le document XML. Dans ce cas, on utilise les parenthèses pour indiquer le critère de filtre.

Dans cet exemple, on souhaite afficher le prénom des personnes de sexe féminin.

for each(var descendant:XML in personnes)
//pour chaque nœud enfant dans la liste des personnes
{
trace(descendant.(@sexe=="F").prenom);
//on utilise les parenthèses pour filtrer un élément
}

Il est aussi possible d'accéder à des nœuds enfants, quelque soit la hiérarchie de nœuds. On utilise la syntaxe nomObjetXML..nomNoeud . C'est le nœud qui renvoyé et non son contenu.

trace(adresses..email); 
//permet de récupérer tous les descendants dont le nom est email
Vous trouverez ici une petite application très pratique de Nataly qui permet de se familiariser avec toutes les possibilités de parcours d'un XML.
Note de lilive, le 19/09/2011

Le script complet

var chargementXML:URLLoader = new URLLoader();
// objet de chargement
var fichier:URLRequest = new URLRequest("carnet.xml");
// url du fichier chargé
chargementXML.addEventListener( Event.COMPLETE, chargementComplet );
chargementXML.load( fichier );
// chargement terminé du fichier xml
function chargementComplet(pEvt:Event):void {
// on récupère notre xml
var adresses:XML = new XML( pEvt.target.data );
//la classe XML est une classe native de Flash, on la trouve dans le package Top Level.
var personnes:XMLList = adresses.elements(); 
//le document XML est constitué d'une liste d'éléments XML, en l'occurence ici, une liste de personnes
for each(var contact:XML in personnes)
//pour chaque nœud enfant dans la liste des personnes
{
trace(contact.nom + " " + contact.prenom);
 //on utilise la syntaxe pointée pour accéder aux noeuds enfants d'un noeud XML
}
for each(var noeudContact:XML in personnes)
//pour chaque nœud enfant dans la liste des personnes
{
trace(noeudContact.prenom+", de sexe "+noeudContact.@sexe);
 //on utilise la syntaxe pointée et l'arobase pour accéder aux attributs d'un objet XML
}
for each(var descendant:XML in personnes)
//pour chaque nœud enfant dans la liste des personnes
{
trace(descendant.(@sexe=="F").prenom);
//on utilise les parenthèses pour filtrer un élément
}
trace(adresses..email);
//permet de récupérer tous les descendants dont le nom est email 
}