Navigation dans un fichier xml

Soyez le premier à donner votre avis sur cette source.

Vue 5 304 fois - Téléchargée 517 fois

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

Ajouter un commentaire Commentaires
Messages postés
618
Date d'inscription
mercredi 4 avril 2007
Statut
Membre
Dernière intervention
27 août 2010
2
Et pour ceux qui comme moi copie-collerons humblement le code... il y a juste une petite faute :
dans les filtres artist doit être remplacé par author
C'est génial !, Un peu comme noël en juillet !
Messages postés
618
Date d'inscription
mercredi 4 avril 2007
Statut
Membre
Dernière intervention
27 août 2010
2
Ouahhhh ! Mille merci pour tout cela. Je viens de regarder (copie colle avec l'exemple de xml que tu m'as donné et c'est génial ! J'étais en train d'essayer de me faire une interface qui recensait dessin et tableaux que j'ai fais, mais comme tu me le faisais remarquer, j'avais un gros problème pour le tri (vue la tronche de mon xml). Ce qui fais que j'avançais à reculons. C'est pas une porte que tu m'as ouvert... c'est un monde nouveau !
Merci d'avoir pris autant de temps pour m'expliquer la "chose". Si je peux te rendre la pareille (bon pas en as c'est sur), je suis à ton service.
Merci à vous deux pour votre attention.
Messages postés
1158
Date d'inscription
vendredi 21 février 2003
Statut
Membre
Dernière intervention
6 août 2010

Une classe static est unobjet qui ne possède aucune référence interne.
L'usage d'un "this" n'est pas possible.

Qund tu créer une classe si la fonction n'as pas besoin de référence propre à l'objet. C'est a dire qu'elle n'utilise que des référerences externes arguments, variables locales, etc.. Alors il est préférable de la passer en static. Comme dans mon exemple ci-dessus "__aNoeud()".
Messages postés
1158
Date d'inscription
vendredi 21 février 2003
Statut
Membre
Dernière intervention
6 août 2010

Prend ton ficher.
Ajoute une "ComboBox" à la bibliothèque.
Attribue la classe "Index" à ton fla.

Contenu de la classe "index":

package{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.net.URLRequest;
import flash.net.URLLoader;
import fl.controls.List;
import fl.controls.Button;
import fl.controls.ComboBox;
import fl.data.DataProvider;
//

public class Index
extends Sprite
{

private var __playList :XML = new XML();
private var __conteneur : Sprite = new Sprite;
private var __filtresCB : ComboBox = new ComboBox;
private var __choixCB : ComboBox = new ComboBox;
private var __trackList : List = new List();

public function Index():void{
//
// Pas besoin de garder le loader, ca utilise de la mémore pour rien...
var loader :URLLoader= new URLLoader();
loader.load(new URLRequest("xml/liste.xml"));
loader.addEventListener(Event.COMPLETE, __analyseData );
//
// Liste des filtres..-.
var dpCB :XML= <filtres>
<label>Catégorie</label><data>category</data>
<label>Artiste</label><data>artist</data>
<label>Album</label><data>album</data>
<label>Titre</label><data>title</data>
<label>Année</label><data>year</data>
</filtres> ;
//
__filtresCB.setSize(150,22);
__filtresCB.dataProvider = new DataProvider(dpCB);
__filtresCB.prompt= "Voir par..."
__filtresCB.rowCount= 20 ;
__filtresCB.addEventListener(Event.CHANGE,__montrerFiltres );
__conteneur.addChild(__filtresCB );

__trackList.y= 50 ;
__trackList.setSize(150,200) ;
__conteneur.addChild(__trackList ) ;

__choixCB.y= 25 ;
__choixCB.setSize(150,22) ;
__choixCB.rowCount= 20 ;
__choixCB.addEventListener(Event.CHANGE,__montrerChoix );
}
//

private function __analyseData( eventObj:Event ):void {
__playList= new XML(eventObj.currentTarget.data);
addChild(__conteneur ) ;
}
//

private function __montrerFiltres( $e:Event ):void{
__trackList.dataProvider= new DataProvider();
// Vide la liste actuelle...

var filtre :String= $e.target.selectedItem.data ;
// Le filtre choissi par l'utilisateur...

var liste :XMLList ;
var tableau :Array= [] ;
var value :String ;
var child :XML ;
var track :XML ;

// Pour tous les noeuds "track" de la liste...
for each( track in __playList.track )
{
// La liste des noeuds ayant le nom demandé (filtre)...
liste= track[filtre].children();

// Pour chaque noeud de la liste (au sein de track)
// On vérifie qu'il se soit pas déjà dans le tableau
for each( child in liste )
{
// SI N'EST PAS DANS LA LISTE L'AJOUTER:
// Utilisé un "string" et non un XML, car sinon Flash considera
// chaque XMl comme différent même si leur contenu est absolument identique...
value= child ;
if( tableau.indexOf(value)==-1 ) tableau.push(value);
}
}
__choixCB.dataProvider= __tableauEnProvider(tableau);
if(__choixCB.stage==null ) __conteneur.addChild(__choixCB ) ;
}
//

private function __montrerChoix( $e:Event ):void{
var filtre :String= __filtresCB.selectedItem.data ;
var choix :String= $e.target.selectedItem.data ;
// On recommence mais avec le nouveau choix et sans enlever les doubles
// Car on souhaite voir TOUTES les chansons du même filtre...

var selection :XML= <selection/> ;
var tableau :Array= [] ;
var value :String ;
var child :XML ;
var track :XML ;

// Pour tous les noeuds "track" de la lite...
for each( track in __playList.track )
{
// La liste des noeuds ayant le nom demandé (filtre)...
if( __aNoeud(track,filtre,choix) ) selection.appendChild( track.copy() );
}
__trackList.dataProvider= __listeEnProvider( selection.track ) ;
}
//

private static function __tableauEnProvider( tableau:Array ):DataProvider{
var element :String ;
var dp :DataProvider= new DataProvider() ;
for each( element in tableau ) dp.addItem( {label:element,data:element} );
return dp ;
}
//

private static function __listeEnProvider( liste:XMLList ):DataProvider{
var element :XML ;
var dp :DataProvider= new DataProvider() ;
for each( element in liste ){
trace( element );
dp.addItem( {label:element.title,data:element} );
}
return dp ;
}
//

private static function __aNoeud( track:XML, name:String, value:String ):Boolean{
var liste :XMLList= track.child(name);
if( liste.length()==0 ) return false ;
//
var noeud :XML ;
for each( noeud in liste ) if ( noeud.text()[0]==value) return true ;
return false ;
}
}
}
Et voila...
Messages postés
618
Date d'inscription
mercredi 4 avril 2007
Statut
Membre
Dernière intervention
27 août 2010
2
Oups, j'avais pas vu ta remarque sur le "plusieurs catégorie" !
Afficher les 16 commentaires

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.