Navigation dans un fichier xml

Description

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é

Codes Sources

A voir également

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.