Le but est de naviguer dans un fichier XML (façon playliste) dont on connait la structure mais dont on ne connait pas le contenu... ce qui m'a poser jusqu'ici beaucoup de problème ; problème a priori résolu.
Vous pourrez en fin de code attribuer la fonction que vous voulez.
Source / Exemple :
package org{
/**********************************************************************************************************************************************\
\ I M P O R T /
/ \
\**********************************************************************************************************************************************/
// --------------- >>> DISPLAY
import flash.display.Sprite;
// --------------- >>> EVENT
import flash.events.Event;
import flash.events.MouseEvent;
// --------------- >>> NET
import flash.net.URLRequest;
import flash.net.URLLoader;
// --------------- >>> CONTROLS / DATA
import fl.controls.List;
import fl.controls.Button;
import fl.data.DataProvider;
public class NavXml extends Sprite {
/**********************************************************************************************************************************************\
\ V A R I A B L E S /
/ \
\**********************************************************************************************************************************************/
// --------------- >>> --------------- >>> V A R I A B L E S D U X M L !
//-------------------------------------------------------------------------------------------------- !
public var XMLLoader:URLLoader = new URLLoader();
public var languageXML:XML = new XML();
public var listeXML : XMLList;
// tableau permettant de mettre en place le nombre de catégorie même si on ne le connait pas
public var categorie : Array = new Array()
public var nbreCategorie : int = new int();
// --------------- >>> --------------- >>> V A R I A B L E S D ' A F F I C H A G E !
//------------------------------------------------------------------------------------------------------------ !
public var globalLecteur : Sprite = new Sprite;//sprite qui portera les éléments d'affichage
public var conteneurListe : List = new List();//composant List pour naviguer dans le xml
//série de outon permettant le retour au niveau précédent
public var retourCategorie : Button = new Button();
public var retourArtiste : Button = new Button();
public var retourAlbum : Button = new Button();
//variable permettant de savoir à quel niveau de choix on est
public var niveau : int = 0;
//variable permettant de stoker le genre par son identifiant pour naviguer ensuite dans le XML
public var numGenre : int;
//variable permettant de stoker l'artiste par son identifiant pour naviguer ensuite dans le XML
public var numArtiste : int;
//variable permettant de stoker l'album par son identifiant pour naviguer ensuite dans le XML
public var numAlbum : int;
/**********************************************************************************************************************************************\
\ F O N C T I O N S /
/ \
\**********************************************************************************************************************************************/
// --------------- >>> --------------- >>> F O N C T I O N S D E T R A I T T E M E N T X M L !
//-------------------------------------------------------------------------------------------------------------------------- !
public function NavXml(){
//appel du XML
XMLLoader.load(new URLRequest("xml/liste.xml"));
XMLLoader.addEventListener(Event.COMPLETE, completXML);
}
private function completXML(eventObj:Event):void {
//trace("!!! completeHandlerArr >> lance XML !!!");
languageXML = new XML(eventObj.currentTarget.data);
//trace("languageXML = "+languageXML);// --> renvoie le xml entier
listeXML = languageXML.children();
// pour déterminer le nbre de catégorie on utilisse la boucle ci-dessous... ne me demander pas comment j'en suis arrivé là !
for ( var item in listeXML){
trace("item = "+item);
var dp:Array = new Array();
dp.push(item);
}
//détermination du nbre de catégorie
nbreCategorie = dp.length + 1;
//trace("nbreCategorie = "+nbreCategorie);
miseEnPlace();
}
private function miseEnPlace() : void {
//affichage du sprite
addChild(globalLecteur);
globalLecteur.x = 100;
globalLecteur.y = 10;
//affichage du composant List
globalLecteur.addChild(conteneurListe);
// !!! listeXML[i].@id -- > renvoie les intitulé de l'identifiant des genres (catégorie)
for (var i : int = 0; i < nbreCategorie; i++) {
//on prend le nom (id de la balise xml) et on lui attribue un identifiant
//on rentre les catégories dans le tableau categorie
categorie.push({label:listeXML[i].@id , id : i});
}
//on interdit la sélection multiple
conteneurListe.allowMultipleSelection = false;
//on remplit le composant
conteneurListe.dataProvider = new DataProvider(categorie);
conteneurListe.addEventListener(Event.CHANGE, choix);
}
private function choix(pEvt : Event):void{
//trace(" - - - - - - - - - - - - > > CHOIX CATÉGORIE");
//trace("pEvt.target = "+pEvt.currentTarget.selectedItem.id);
//on supprime l'écouteur
conteneurListe.removeEventListener(Event.CHANGE, choix);
//on met "niveau" sur 1 pour savoir ou l'on est --> cela servira pour les bouton de retour à savoir les éouteur qu'il faudra annuler
niveau = 1;
//on met en stock le numéro (id) du genre selectionné
numGenre = pEvt.currentTarget.selectedItem.id;
//on place un bouton de retour au catégorie
globalLecteur.addChild(retourCategorie);
retourCategorie.label = "retour catégorie";
retourCategorie.x = 0;
retourCategorie.y = 120;
retourCategorie.addEventListener(MouseEvent.CLICK , retourCat);
//on met en place l'affichage des artistes de la catégorie
//on crée un nouveau xml relatif à l'identifiant (pEvt.currentTarget.selectedItem.id) de la selection
var XMLTrans = new XML(languageXML.legenre.(@id==listeXML[pEvt.currentTarget.selectedItem.id].@id));
//trace("XMLTrans = "+XMLTrans);
var XMLListeTrans:XMLList = XMLTrans.children();
var limite : int = XMLListeTrans.length();// renvoie le nombre de référence total
//trace("limite = "+limite);
var dp:Array = new Array();
for (var i : int = 0; i < limite; i++) {
dp.push({label:XMLListeTrans[i].@id , id : i});
// dp.push({label:artiste.children()[i].@id , id : i}); --> renvoie les morceau
}
conteneurListe.allowMultipleSelection = false;
conteneurListe.dataProvider = new DataProvider(dp);
conteneurListe.addEventListener(Event.CHANGE, choixArtiste);
}
private function choixArtiste(pEvt : Event):void{
trace(" - - - - - - - - - - - - > > CHOIX ARTISTE");
//trace("pEvt.target = "+pEvt.currentTarget.selectedItem.id);
//on supprime l'écouteur
conteneurListe.removeEventListener(Event.CHANGE, choixArtiste);
//on met "niveau" sur 1 pour savoir ou l'on est --> cela servira pour les bouton de retour à savoir les éouteur qu'il faudra annuler
niveau = 2;
//on met en stock le numéro (id) du genre selectionné
numArtiste = pEvt.currentTarget.selectedItem.id;
//on place un bouton de retour au catégorie
globalLecteur.addChild(retourArtiste);
retourArtiste.label = "retour artistes";
retourArtiste.x = 0;
retourArtiste.y = 150;
retourArtiste.addEventListener(MouseEvent.CLICK , retourArt);
//var XMLTrans = new XML(languageXML.legenre.(@id==listeXML[numGenre].@id));//renvoie tout jazz si jazz sélectionné
//var XMLTrans = new XML(languageXML.legenre.(@id==listeXML[numGenre].@id).auteur[pEvt.currentTarget.selectedItem.id].@id);// renvoie le nom de l'artiste
var XMLTrans = new XML(languageXML.legenre.(@id==listeXML[numGenre].@id).auteur[pEvt.currentTarget.selectedItem.id]);//renvoie tout ce qui a trait à l'auteur
//languageXML.legenre.(@id==listeXML[pEvt.currentTarget.selectedItem.id].@id)
//trace("XMLTrans = "+XMLTrans);
var XMLListeTrans:XMLList = XMLTrans.children();
var limite : int = XMLListeTrans.length();// renvoie le nombre de référence total
//trace("limite = "+limite);
var dp:Array = new Array();
for (var i : int = 0; i < limite; i++) {
dp.push({label:XMLListeTrans[i].@id , id : i});
// dp.push({label:artiste.children()[i].@id , id : i}); --> renvoie les morceau
}
conteneurListe.allowMultipleSelection = false;
conteneurListe.dataProvider = new DataProvider(dp);
conteneurListe.addEventListener(Event.CHANGE, choixAlbum);
}
private function choixAlbum(pEvt : Event):void{
trace(" - - - - - - - - - - - - > > CHOIX ALBUM");
//trace("pEvt.target = "+pEvt.currentTarget.selectedItem.id);
//on supprime l'écouteur
conteneurListe.removeEventListener(Event.CHANGE, choixAlbum);
//on met "niveau" sur 1 pour savoir ou l'on est --> cela servira pour les bouton de retour à savoir les éouteur qu'il faudra annuler
niveau = 3;
//on met en stock le numéro (id) du genre selectionné
numAlbum = pEvt.currentTarget.selectedItem.id;
//on place un bouton de retour au catégorie
globalLecteur.addChild(retourAlbum);
retourAlbum.label = "retour album";
retourAlbum.x = 0;
retourAlbum.y = 180;
retourAlbum.addEventListener(MouseEvent.CLICK , retourAlb);
var XMLTrans = new XML(languageXML.legenre.(@id==listeXML[numGenre].@id).auteur[numArtiste].album[pEvt.currentTarget.selectedItem.id]);//renvoie tout ce qui a trait à l'auteur
//languageXML.legenre.(@id==listeXML[pEvt.currentTarget.selectedItem.id].@id)
trace("XMLTrans = "+XMLTrans);
var XMLListeTrans:XMLList = XMLTrans.children();
var limite : int = XMLListeTrans.length();// renvoie le nombre de référence total
trace("limite = "+limite);
var dp:Array = new Array();
for (var i : int = 0; i < limite; i++) {
dp.push({label:XMLListeTrans[i].@id , id : i});
// dp.push({label:artiste.children()[i].@id , id : i}); --> renvoie les morceau
}
conteneurListe.allowMultipleSelection = false;
conteneurListe.dataProvider = new DataProvider(dp);
conteneurListe.addEventListener(Event.CHANGE, choixMorceau);
}
private function choixMorceau(pEvt : Event):void{
//trace("pEvt.target = "+pEvt.currentTarget.selectedItem.id);
//ici appel de fonction fonction du morceau choisi
trace("choixMorceau :: "+languageXML.legenre.(@id==listeXML[numGenre].@id).auteur[numArtiste].album[numAlbum].titre[pEvt.currentTarget.selectedItem.id]);//renvoie la partie xml entière
trace("choixMorceau :: titre = "+languageXML.legenre.(@id==listeXML[numGenre].@id).auteur[numArtiste].album[numAlbum].titre[pEvt.currentTarget.selectedItem.id].@id);
trace("choixMorceau :: url = "+languageXML.legenre.(@id==listeXML[numGenre].@id).auteur[numArtiste].album[numAlbum].titre[pEvt.currentTarget.selectedItem.id].morceau);
//ou bien
/*var target = languageXML.legenre.(@id==listeXML[numGenre].@id).auteur[numArtiste].album[numAlbum].titre[pEvt.currentTarget.selectedItem.id];
trace("choixMorceau :: url = "+target.morceau);*/
}
// --------------- >>> --------------- >>> F O N C T I O N S D E S B O U T O N S D E R E T O U R !
//-------------------------------------------------------------------------------------------------------------------------------- !
//RETOUR AUX CATÉGORIES
private function retourCat(pEvt : MouseEvent){
conteneurListe.removeEventListener(Event.CHANGE, choixMorceau);
trace("retourCat :: niveau = "+niveau);
//on désactive le bouton
conteneurListe.removeEventListener(Event.CHANGE, choixArtiste);
globalLecteur.removeChild(retourCategorie);
retourCategorie.removeEventListener(MouseEvent.CLICK , retourCat);
//on teste pour savoir si d'autre bouton sont affichés -- > suppression des boutons d'un niveau supérieur
if(niveau == 2){
trace("retourCat :: niveau (2) = "+niveau);
conteneurListe.removeEventListener(Event.CHANGE, choixAlbum);
retourArtiste.removeEventListener(MouseEvent.CLICK , retourArt);
globalLecteur.removeChild(retourArtiste);
}
else if(niveau == 3){
trace("retourCat :: niveau (3) = "+niveau);
retourArtiste.removeEventListener(MouseEvent.CLICK , retourArt);
globalLecteur.removeChild(retourArtiste);
conteneurListe.removeEventListener(Event.CHANGE, choixAlbum);
retourAlbum.removeEventListener(MouseEvent.CLICK , retourAlb);
globalLecteur.removeChild(retourAlbum);
}
//on remet le niveau à 0
niveau = 0;
//on réatribue les catégories à la List
conteneurListe.allowMultipleSelection = false;
conteneurListe.dataProvider = new DataProvider(categorie);
conteneurListe.addEventListener(Event.CHANGE, choix);
}
//RETOUR AUX ARTISTES
private function retourArt(pEvt : MouseEvent){
conteneurListe.removeEventListener(Event.CHANGE, choixMorceau);
//on désactive le bouton
conteneurListe.removeEventListener(Event.CHANGE, choixAlbum);
retourArtiste.removeEventListener(MouseEvent.CLICK , retourArt);
globalLecteur.removeChild(retourArtiste);
if(niveau == 3){
trace("retourArt :: niveau (3) = "+niveau);
conteneurListe.removeEventListener(Event.CHANGE, choixAlbum);
retourAlbum.removeEventListener(MouseEvent.CLICK , retourAlb);
globalLecteur.removeChild(retourAlbum);
}
//on remet le niveau à 1
niveau = 1;
//on réatribue les artistes.
var XMLTrans = new XML(languageXML.legenre.(@id==listeXML[numGenre].@id));
//trace("XMLTrans = "+XMLTrans);
var XMLListeTrans:XMLList = XMLTrans.children();
var limite : int = XMLListeTrans.length();// renvoie le nombre de référence total
//trace("limite = "+limite);
var dp:Array = new Array();
for (var i : int = 0; i < limite; i++) {
dp.push({label:XMLListeTrans[i].@id , id : i});
// dp.push({label:artiste.children()[i].@id , id : i}); --> renvoie les morceau
}
conteneurListe.allowMultipleSelection = false;
conteneurListe.dataProvider = new DataProvider(dp);
conteneurListe.addEventListener(Event.CHANGE, choixArtiste);
}
//RETOUR AUX ALBUMS
private function retourAlb(pEvt : MouseEvent){
conteneurListe.removeEventListener(Event.CHANGE, choixMorceau);
conteneurListe.removeEventListener(Event.CHANGE, choixAlbum);
retourAlbum.removeEventListener(MouseEvent.CLICK , retourAlb);
globalLecteur.removeChild(retourAlbum);
var XMLTrans = new XML(languageXML.legenre.(@id==listeXML[numGenre].@id).auteur[numArtiste]);//renvoie tout ce qui a trait à l'auteur
//languageXML.legenre.(@id==listeXML[pEvt.currentTarget.selectedItem.id].@id)
trace("XMLTrans = "+XMLTrans);
var XMLListeTrans:XMLList = XMLTrans.children();
var limite : int = XMLListeTrans.length();// renvoie le nombre de référence total
trace("limite = "+limite);
var dp:Array = new Array();
for (var i : int = 0; i < limite; i++) {
dp.push({label:XMLListeTrans[i].@id , id : i});
// dp.push({label:artiste.children()[i].@id , id : i}); --> renvoie les morceau
}
conteneurListe.allowMultipleSelection = false;
conteneurListe.dataProvider = new DataProvider(dp);
conteneurListe.addEventListener(Event.CHANGE, choixAlbum);
}
/**********************************************************************************************************************************************\
\ F I N D U P A C K A G E /
/ \
\**********************************************************************************************************************************************/
}
}
Conclusion :
Il est tout à fait possible que ma source soit optimisable... je serais d'ailleurs heureux si certains ont des idées. Bien sur le code est valable pour la forme de xml que j'ai utilisé, mais je pense qu'il serait facile de l'adapter pour d'autres formes.
J'espère que cela aidera certains comme cela m'a aidé
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.