NAVIGATION DANS UN FICHIER XML

cs_inaden Messages postés 618 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 27 août 2010 - 29 janv. 2010 à 14:30
cs_inaden Messages postés 618 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 27 août 2010 - 2 févr. 2010 à 09:49
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/51206-navigation-dans-un-fichier-xml

cs_inaden Messages postés 618 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 27 août 2010 2
2 févr. 2010 à 09:49
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 !
cs_inaden Messages postés 618 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 27 août 2010 2
2 févr. 2010 à 09:29
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.
top30 Messages postés 1158 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 6 août 2010
2 févr. 2010 à 02:24
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()".
top30 Messages postés 1158 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 6 août 2010
1 févr. 2010 à 21:40
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...
cs_inaden Messages postés 618 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 27 août 2010 2
1 févr. 2010 à 18:55
Oups, j'avais pas vu ta remarque sur le "plusieurs catégorie" !
cs_inaden Messages postés 618 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 27 août 2010 2
1 févr. 2010 à 18:52
Salut Top30,
bon, ok, je suis dans l'impro totale... et merci de ton aide. Donc, si j'ai bien compris, tu mets plusieurs catégorie si un morceau appartient à plusieurs catégories ?
Il va falloir tout revoir... désolé... je commence à avoir honte de ma source ! Peut-être faudrait-il la retirer !

Sinon, juste une question pour Peg... si tu avais la gentillesse d'aller jeter un oeil sur http://inaden.free.fr/load/essai_xml_static.zip juste pour me dire si c'est comme ça qu'il faut commencer pour créer une classe statique. Merci d'avance.

Et à l'occasion, comme je le disais, il faudrait peut-être supprimer cette source qui ne semble pas correcte... je commence à avoir des remords... si ça embrouille, autant annuler !
En tout cas merci à vous.
top30 Messages postés 1158 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 6 août 2010
1 févr. 2010 à 18:15
OOOOHH !

Alors on va commencer par le XML.
Trop fouilli. Ta liste est classée par genre.
Si je veux classer par titre ou auteur comment fera-tu ??? Réécrire l'XML ???
Le XML en AS3, c'est PLUS que simple, c'est enfantin regarde:

1/ L'XML:
<?xml version="1.0" encoding="UTF-8"?>

<track>
<category>jazz</category>
<category>pop-rock</category>
The Kicker
Bobby Hutcherson
<title>The Kicker zik</title>
<cover>zik/image/illus0.jpg</cover>
zik/zik0.mp3
<description>Jazz cool. Vive le vibraphone !</description>
</track>
<track>
<category>jazz</category>
<category>blues</category>
Point of View
Dave Hollande
<title>The Balance</title>
<cover>zik/image/illus3.jpg</cover>
zik/zik3.mp3
<description>Du vrai, du bon, de la composition comme on aimerait en voir plus souvent</description>
</track>
<track>
<category>pop-rock</category>
<category>blues</category>
Point of View
Dave Hollande
<title>The Balance</title>
<cover>zik/image/illus3.jpg</cover>
zik/zik3.mp3
<description>Du vrai, du bon, de la composition comme on aimerait en voir plus souvent</description>
</track>
<track>
<category>jazz</category>
<category>blues</category>
<category>pop-rock</category>
Point of View
Dave Hollande
<title>Serenade</title>
<cover>zik/image/illus4.jpg</cover>
zik/zik3.mp3
<description>Et de la vrai balade</description>
</track>
<track>
<category>pop-rock</category>
Across The Universe Of Languages
Be for bang
Beattles
<title>Come together</title>
<cover>zik/image/illus1.jpg</cover>
zik/zik0.mp3
<description>Une reprise des Beatles</description>
</track>
<track>
<category>pop-rock</category>
Catch
Meshuggah
<title>Greed</title>
<cover>zik/image/illus2.jpg</cover>
zik/zik2.mp3
<description>Pour se défouler</description>
</track>

Tu remarqueras que un "track" peut avoir plusieurs genre, comme plusieurs si nécessaire.
cs_inaden Messages postés 618 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 27 août 2010 2
1 févr. 2010 à 17:33
Ok, je vais essayer.
À dans un mois ! :-)
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
1 févr. 2010 à 16:52
là il y a autant de classes que tu veux ... un Sprite étant déjà une classe de base.

Mais ne va pas te compliquer la vie :
- classe statique de tri de XML
- classe dynamique d'interfaçage

Ce sera déjà bien ;)

Peg'
cs_inaden Messages postés 618 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 27 août 2010 2
1 févr. 2010 à 15:58
Je crois que je commence à saisir... je m'étais même posé le problème de façon intuitive et me disant que ce serait chouette de dissocier le tri de l'affichage... mais cela me paraissait (et me parait encore) compliqué.
Je suis aussi allé voir http://www.bases-as3.fr/index.php/2009/03/14/singleton-actionscript-3 qui me parait plus compréhensible.
Je vais donc essayer de reprendre le code... mais cela me prendra peut-être... quelques mois :-)
Une dernière question.
Pour toi, il y aurais donc deux classes : celles pour le tri et celle pour l'interface. Celle du tri est de type statique, l'autre non ?
En tout cas, merci de ta patience.
D.
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
1 févr. 2010 à 15:51
ça sert à ne pas avoir à mélanger les fonctions de tri de ton XML avec les fonctions d'interfaçage de ton menu.
La classe statique ne fera que renvoyer les données du XML, et tu n'auras plus à te soucier de savoir où tu cherches telle ou tel truc dans ton code.

Imagine que tu doives restructurer ton XML et que tu ais tes appels e4x discéminés dans 3500 lignes de code ....

Peg'
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
1 févr. 2010 à 15:49
Une classe statique est comme la classe "Math", par exemple. Elle n'a pas d'instances et ne requiert pas de "new" pour l'appeler.

Il suffit de déclarer tes var/const et fonctions en static, de rendre la classe et ses méthodes publiques et tu peux l'utiliser sans la créer.

Peg'
cs_inaden Messages postés 618 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 27 août 2010 2
1 févr. 2010 à 15:44
Bon, je suis allé voir là http://livedocs.adobe.com/flash/9.0_fr/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts_bak&file=00000779.html
pour comprendre ce qu'est une classe statique... si j'ai bien compris, c'est une classe qui permet d'appeler certains de ses éléments (fonction ou propriété) sans avoir à créer une occurence de la classe.
Certes ! Mais je ne comprends pas bien le rapport avec ce que j'ai fais. Le but est d'appeler l'ensemble des fonctions et propriétés de la classe, pour faire tourner le "menu".
Tout cela est bien compliqué pour un autodidacte !
cs_inaden Messages postés 618 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 27 août 2010 2
1 févr. 2010 à 15:25
Et moi qui était tout content !!!
En fait, je croyais avoir créé une classe qui gérait les infos... et contrairement à mes premier pas en XML ou je faisiat des tableaux comportant des objet qui regroupait les données du XML... enfin bref, un truc beaucoup plus compliqué et fouilli encore !
Et c'est quoi une classe statique ???
Bon, je vais retravailler le truc, mais si tu as une piste (tuto, ou autre) merci de me mettre sur la voix !
En tout cas, merci de ton avis et de tes conseils.
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
1 févr. 2010 à 15:18
Effectivement, c'est fouillis ....

Pourquoi ne pas avoir fait une classe statique qui gèrerait les infos de ton XML ?
Ca te permettrai de ne faire qu'une seule demande du genre "ListManager.getTitleByArtist("Joe Dassin");" et ça te crache une liste des titres de l'artiste demandé.

Ensuite tu as des doublons de liste .. autant piocher dans le XML directement, car ça t'évite de dupliquer les variables qui y sont déjà.

N'hésite pas à décomposer en classes .. la POO ça sert à ça ;)

Peg'
cs_inaden Messages postés 618 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 27 août 2010 2
29 janv. 2010 à 14:30
Et puisqu'il n'est pas encore trop tard... Bonne année à tous !
Rejoignez-nous