Flash + XML + recuperation de données (variables)

cadoudal56 Messages postés 41 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 2 avril 2005 - 19 févr. 2004 à 09:42
bongawonga Messages postés 83 Date d'inscription lundi 12 janvier 2004 Statut Membre Dernière intervention 12 septembre 2004 - 21 févr. 2004 à 22:49
Bonjour à tous et à toutes,

Désolé, ma question risque de ne rien avoir de passionnant pour certains programmeurs chevronnés, mais je dois bien avouer que cela fait deux jours que je planche sur mon script et je viens enfin d'identifier le probleme mais je n'ai pas trouver la solution>......
Si vous aviez le temps d'y jeter un coup d'oeuil et de me donner la soluce, je ne vous en remercierais jamais assez...

QUELQUES EXPLICATIONS

Voila, j'utilise un fihcier XML pour stocker des variables en grand nombre. Pas de probleme de ce coté là. Je charge le fichier xml avec un script du style :

photos_xml = new XML();
the_data = new Array();
photos_xml.ignoreWhite = true;
photos_xml.onLoad = function(ok) {
if (ok) {
noeuds = photos_xml.firstChild.childNodes;
for (var i=0; i< noeuds.length; i++) {
the_data[i] = noeuds[i].firstChild.attributes.fichier;
}//end for
}
};
photos_xml.load("photos.xml");

Bon je ne suis plus tres sur du code mais en gros c'est cela....
Voila en gros je veux pouvoir parcourir mon fichier xml et stocké les variables dans un tableau que je récupère ensuite

J'ai bien déclaré le tableau avec :
the_data = new Array();

et je charge avec :
the_data[i] = noeuds[i].firstChild.attributes.fichier;

Alors j'ai beau faire des traces, ou des affichages, quand je demande la valeur de the_data[0] ou data[1], il me l'affiche si je suis avant

photos_xml.load("photos.xml");

Mais si je suis après c'est Undefined obligatoire.

Quelqu'un peut-il me dire pourquoi ? Mon tableau est déclaré avant pourtant !!
J'ai beau mettre des _global ou autre, rien a faire...

Le but du script je le rappelle, parse un fichier xml, pour récupérer tout dans un tableau dont je puisse me resservir...

Merci d'avance aux généreux contributeur
@+


Cadoudal56
La Bretagne ca vous gagne !!

11 réponses

Namokun Messages postés 6 Date d'inscription mardi 27 janvier 2004 Statut Membre Dernière intervention 5 mars 2004
19 févr. 2004 à 13:01
Lut

Bon je suis debutant en flash et j'ai eu le même probleme ... enfin presque il ne chargeait que les deux premiers noeuds et pas les suivants, avec des traces et des essais, je me suis aperçu que ça venait d'accents.

Je pense que tu as le même probleme : chargement des 2 premiers noeuds et arret ... donc regarde dans ton fichier Xml si dans le noeud 2 ou 3 tu as des accents ... J'espere que c'est ça ...

@++
0
cadoudal56 Messages postés 41 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 2 avril 2005
19 févr. 2004 à 14:49
helas,

ce serait trop facile....
Il charge bien tout le fichier XML comme il faut, je le vois grace au debuggeur...
Ce que je trouve étrange c'est que les données sont bien chargées tant que je suis dans le chargement du fichier XML, mais dès que j'en sors, mon tableau se vide tout seul....
Cela defie toute logique... C bizarre

En tout cas je te remercie de t'etre arreté sur mon probleme...
Il n'y a pas d'accent dans le fichier XML donc...

Quelqu'un a une autre idée ?
Merci d'avance
Cadoudal56
La Bretagne ca vous gagne !!
0
bongawonga Messages postés 83 Date d'inscription lundi 12 janvier 2004 Statut Membre Dernière intervention 12 septembre 2004
19 févr. 2004 à 15:12
Effectivement Namokum à raison si ton XML contient des cxaractères spéciaux ça va te posé tes problemes au chargement. Pour palier à ce probleme tu as 2solutions:

-soit tu encodes tes infos en URL avec la fonction escape(info.text) et pour décoder unescape(noeud[z])

-soit au début de ton programme tu ajoute cette ligne System.useCodepage = true;
pour les interpréter ton fichier dans le bon encode, c'est une des fonction "caché" de FlashMX pour plus d'info va voir le site officiel, bien sûr

http://www.macromedia.com/support/flash/action_scripts/actionscript_dictionary/actionscript_dictionary723.html

Voilà pour les caractères spéciaux

je n'ai pas tester ton code mais essaye déjà ça
noeuds = photos_xml.childNodes;
plûtot que
noeuds = photos_xml.firstChild.childNodes;

et quand tu parse ton fichier je pense qu'il faut déclarer ton tableau avant et avec une autre méthode que the_data[i]
essaye plutot comme ça pour voir:

the_data=new Array();
for (var i=0; i< noeuds.length; i++) {
trace(noeuds[i].firstChild.attributes.fichier)
the_data.push(noeuds[i].firstChild.attributes.fichier);
}

ça change pas de grand chose par rapport à ce que tu as fait mais quand ça merde toutes les solutions sont bonne lol

au passage tu pourra voir si le probleme ne vient pas de la manière dont tu découpe ton XML

bon courage man
0
cadoudal56 Messages postés 41 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 2 avril 2005
19 févr. 2004 à 15:22
Hello,

Désolé bongawonga, tu n'a peut etre pas lu ma réponse...
Le fichier XML ne contient aucuns accents j'en suis sur, donc le probleme ne peut pas venir de là....

J'ai bien déclarer mon tableau
photos_xml = new XML();
the_data = new Array();

La question est ardue.....

Quand je suis dans la boucle
for (var i=0; i< noeuds.length; i++) {
the_data[i] = noeuds[i].firstChild.attributes.fichier;
}//end for

il affiche bien la valeur de the_data[i]. J'ai essayé via le debuggeur ou via insertion dans un fichier texte tout marche, mais dès que je sors de la boucle

photos_xml.onLoad = function(ok) {
...
};

et bien pour lui le tableau the_data est vide....
Je programme sur plusieurs langages et j'avoue que c'est la première fois que je vois cela.... Pourtant j'ai bien fais attention, mon tableau n'est pas en variable locale. J'ai meme essayer de le mettre en _global et rien a faire !!!

Il y a un truc la dessous... Je sens que je suis bien parti pour faire un copier coller de source existante pour réadapter...
Ca fais chier parce que je bloque sur le dernier truc et là faut que je recommence tout.

Ah les joies de la programmation !!

Quelqu'un d'autre a une idée ??

Donc c'est pas un probleme d'accent
Mon tableau est déclaré a la deuxieme ligne du script...

Merci d'avance

Cadoudal56
La Bretagne ca vous gagne !!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Namokun Messages postés 6 Date d'inscription mardi 27 janvier 2004 Statut Membre Dernière intervention 5 mars 2004
19 févr. 2004 à 19:10
euh c'est ptet debile ... mais tu as essayé de creer ton tableau dans ta fonction (en variable locale: "var the_data = new Array();") et de retourner ce tableau avec un "return" et de creer un tableau exterieur qui le reçoit :"tab = photos_xml.load("photos.xml");" puisque ton tableau recoit bien les valeurs dans la fonction ?

Sinon donne nous le code exact et ton Xml (ou un exemple).

Si ça marche dis le ;)
0
cadoudal56 Messages postés 41 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 2 avril 2005
19 févr. 2004 à 22:40
hello,

De retour a la maison, je suis en mesure de vous balancer les vrais bout de code...

Le fichier xml d'abord

<SLIDES>
<SLIDE>
<NOM fichier="albator" numfichier="6">Albator</NOM>
</SLIDE>
<SLIDE>
<NOM fichier="Sportbilly" numfichier="6">Sport billy</NOM>
</SLIDE>
<SLIDE>
<NOM fichier="Bouba" numfichier="5">Bouba</NOM>
</SLIDE>
</SLIDES>

et maintenant le bout de code

slides_xml = new XML();

new_slides = new Object();
new_slides.numfichier = new Array();
new_slides.nom = new Array();
new_slides.fichier = new Array();

slides_xml.ignoreWhite = true;
slides_xml.onLoad = function() {
noeuds = this.firstChild.childNodes;
for (var i = 0; i < noeuds.length; i++) {
new_slides.nom[i] = noeuds[i].firstChild.firstChild.nodeValue;
new_slides.fichier[i] = noeuds[i].firstChild.attributes.fichier;
new_slides.numfichier[i] = noeuds[i].firstChild.attributes.numfichier;
}//end for i
}//end slide_xml onLoad
slides_xml.load("data.xml");
_root.montexte.text = "texte :" + new_slides.fichier[1];
trace(new_slides.fichier[1]);

Voila et si vous essayer vous verrez que le dernier trace est vide... Alors que dans la boucle il y est...

La c'est une soluce degradé, au debut je voulais remplir un tableau appellé slide et qui aurait été a deux dimensions...

Merci d'avance a ceux qui se penchent sur le probleme...

@+

Cadoudal56
La Bretagne ca vous gagne !!
0
bongawonga Messages postés 83 Date d'inscription lundi 12 janvier 2004 Statut Membre Dernière intervention 12 septembre 2004
19 févr. 2004 à 23:05
DSL pour l'aide sur les caractère spéciaux...j'espère que ce sera utile à quelqu'un

Bon ton probleme est vraiment tres bete
et e dirais même que si je t'avais devant moi je te mettrais des claques tellement c'est betes

en fait ton code est nikel
tout est nikel c'est juste ton test qui est pas au bonne endroit
tu le test avant que ton fichier soit chargé en le mettant juste apres ta fonction pour parser ton XML c'est bon

slides_xml.onLoad = function () {
noeuds = this.firstChild.childNodes;
for (var i = 0; i < noeuds.length; i++) {
trace ("??"+noeuds[i].firstChild.firstChild.nodeValue);
new_slides.nom[i] = noeuds[i].firstChild.firstChild.nodeValue;
new_slides.fichier[i] = noeuds[i].firstChild.attributes.fichier;
new_slides.numfichier[i] = noeuds[i].firstChild.attributes.numfichier;
}
//
trace (new_slides.fichier[1]);
_root.montexte.text = "texte :" + new_slides.fichier[1];
};

Je l'ai tester sur des boutton , ou dans différent endroit de la scene ça fonctionne nikel Chrome du poil.
Je sais pas combien de temps tu as du perdre la dessus mais je pense que tu vas te cognier le tête un bon moment quand tu vas découvrir ça lool

Ou alors j'ai encore rien compris, là je te donne mon adresse et te paye un billet de train pour venir me mettre des claques.
0
Namokun Messages postés 6 Date d'inscription mardi 27 janvier 2004 Statut Membre Dernière intervention 5 mars 2004
20 févr. 2004 à 14:52
euh en fait je resume plus clairemenet parce que pour moi c'était po tres net:

Tu parses ton fichier xml sur l'événement "onLoad" , ça marche.
Tu fais ton test ("trace(...)") dans le onLoad, le fichier est bien chargé quand le onLoad est déclenché.
Tu fais un test hors de la fonction lors de l'initialisation : ça marche pas car ton tableau est pas encore rempli (il se remplira quand l'évenement onLoad sera déclenché).

Pour verifier qu'il est chargé :
Tu peux faire un bouton comme l'a dit Bongawonga, et sur l'action onPress afficher la valeur du tableau (avec un trace)...

En fait ça marche depuis le debut ... tu as perdu du temps pour rien ... enfin si : on apprend toujours de ses erreurs ;)
0
cadoudal56 Messages postés 41 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 2 avril 2005
20 févr. 2004 à 17:59
En fait jai tester des milliars de solutions...
Avec pleins de bout de codes a droite et a gauche...
C'est pour cela que j'ai perdu du temps et c'est parce que je ne comprends pas que je demande des précisions.

En fait si j'interprete mon code en langage humain moi je comprends ceci :

Je declare le tableau
Je previens que je vais ouvrir un objet XML

Je charge le fichier XML (Onload)
Pour m'assurer qu'il est bien chargé je lui colle une fonction (comme cela parait-il on est sur que c'est chargé...

Pendant la fonction je lui dis de récupérer des valeurs dans le fichier XML et de les coller dans des variables avec attributs, quoique mon but était de le récupérer dans un tableau a deux dimensions (style fichier excel) afin de pouvoir les répérer a coup sur !

Il finit le onload....
Et après je lui pose une question pour voir si le script a fait ce que j'ai dit (Interro surprise !!)

trace (new_slides.fichier[1]);
_root.montexte.text = "texte :" + new_slides.fichier[1];

Je lui dit
affiche dans le debuggeur la valeur de cette variable new_slides.fichier[1] et pour corser le tout je lui dis affiche le sur l'anim (comme cela je suis sur de sur !!)

Quand je lance le bouzier sa réponse c'est :
Je sais pas, Y a rien !

Alors moi je lui crie dessus :
Tu la vois pas là ? tu viens de la charger !! (c'est une transcription ! mon langage est moins chatié en privé !)

Et là d'après ce que vous me dites c'est :
Flash ouvre le fichier puis ensuite il le lis et quand il le ferme il oublie tout ?

Je trouve cela trop fort...

bongawonga dit :
en fait ton code est nikel
tout est nikel c'est juste ton test qui est pas au bonne endroit
tu le test avant que ton fichier soit chargé en le mettant juste apres ta fonction pour parser ton XML c'est bon

Ben oui je teste apres ma fonction Onload.....
Je lui dis charge et je teste quand c'est fini...

En relisant Namokun je comprend ce qu'il cherche a me dire, c'est a dire il faut la declencher....

Mais justement....
Moi je traduis :
Quand tu charge slides_xml tu fais ce qui est dit...

slides_xml.onLoad = function() {
ici le code voir plus haut
}//end slide_xml onLoad

Maintenant va y charge (Now ! schnell)
slides_xml.load("data.xml");

Et après je fais le test...
Normalement je suis bien a la racine de l'anim, c'est la premiere chose qu'il va lire et interpreter le lecteur flash non ?

Mon but c'est d'ouvrir le fichier xml une seule fois, ensuite de garder toutes les valeurs dans un tableau (avec ses petits bras musclé) et ensuite l'anim vis avec cela, pas besoin de retourner ouvrir le fichier (Pour moi c pas logique cela bouffe de la ressource pour rien).
C'est pas possible ça en flash ??

Merci pour vos réponses éclairées...
Je vais retenter deux ou trois trucs et méditer sur ces avancements....

@+ et merci

Cadoudal56
La Bretagne ca vous gagne !!
0
Namokun Messages postés 6 Date d'inscription mardi 27 janvier 2004 Statut Membre Dernière intervention 5 mars 2004
21 févr. 2004 à 20:03
re rahhhhh

ton tableau est chargé quand ton anim est lancé ... sauf que dans ton initialisation, la fonction onLoad est pas encore active quand tu fais le test ('trace') apres la fonction. La fonction onLoad s'activera que quand l'anim sera lancée . C 'est pas super clair alors je resume et la je pense que tu vas comprendre :
- 1 ere phase : inialisation de l'anim :
Tu déclares la fonction onLoad, les tests qui sont dans la fonction ne sont pas lancés car la fonction n'est pas encore active :
pense que cette fonction est égale à un onPress ( : pas des clic pas de lancement de la fonction) .
Donc :
-> tests dans la fonction ne sont pas lancés. (fonction non active)
-> test apres (ou avant) la fonction renvoie tableau vide (car onLoad non avtive, donc pas de chargement).Le test est lancé.

Rq : dans tes tests, met le chiffre 2 pour les tests dans la fonction et 1 pour ceux apres la fonction : tu vas voir l'ordre de chargement . (trace("2"+new_slides.fichier[1]) ).

- 2 ieme phase :
onLoad s'active, on fait tout ce qu'il y a dans la fonction (on s'occupe plus de ce qu'il y a dehors(l'init):
on parse et on teste.

Donc au final :
-> tests dans la fonction sont lancés. (tableau chargé)
-> test apres (ou avant) la fonction renvoie tableau vide car ce test a été lancé une fois lors de la 1 ere phase ... donc affiche le tableau intial : tableau d'undefined.

C'est un peu compliqué à comprendre mais le tout est de comprendre ... C'est l'oeuf et la poule :
L'oeuf il y a tout dedans , c'est l'init, la declaration des fonctions. Une fois lancé on en a plus besoin de l'oeuf (test dans la coquille, il s'est fait une fois). Puis on chauffe l'oeuf (onLoad) et la la construction de la poussin se fait et on charge le tableau ... donc si tu mets un bouton : "ecraser le poussin" et qui affiche le tableau sur clic du bouton tu verras que ton tableau est bien chargé (onPress s'effectue hors de l'oeuf) ... enfin je commence à devenir fou :p ...

J'espere que c'est plus clair sinon bongawonga te paye le train lol ... ou je t'envoie mon adr msn et on parle directement ...

Nb : tests ... testes ...c'est la même chose ...
0
bongawonga Messages postés 83 Date d'inscription lundi 12 janvier 2004 Statut Membre Dernière intervention 12 septembre 2004
21 févr. 2004 à 22:49
RE arrgh aussi chers auditeurs

écoute c'est tres simple

Imagine que ta fonction XML est un super héros du genre Iman, et ton tableau dans falsh serait la charmant Tilla prisonnère des griffes de squelletor...jusque là tu me suis?

Le but de Iman est de sauve la charmant Tilla et pete la geule au misérable Squelletor pour cela il possede la force toute puissant qui dans notre cas est ta fonction OnLoad

Donc dans ton scénario il y a

1.Trouver Tilla (charger ton XML)
2.Se transformer (OnLoad)
-Aller au chateau du méchant
3.Peter la geule à squelletor (Trace)
4.sauver Tilla (Parser ton XML)
5.hum le meilleur (ton application)

Si tu vas peter la geule au méchant avant de t'etre tranformer ça marche pas, tout simplement parceque tu nest pas encore arrivé au chateau fort du méchant!!!!
Alors même si dans ton code tu met des fonction n'importe quelle orde. Flash il s'en fou, une fois chargé dans sa mémoire il execute une fois quel est appeler

Donc musclor même si dans son programme il dois se taper Tilla, Alors si Gringer a peur c'est aussi normal!
Alors flash qui dans notre exemple sera la sorcière va prendre dans le chateau des ombres....bon je me suis perdu....

bon en gros c'est juste pour te dire que flash utilise les fonction de manière non-séquenticiel

et plus Shira a oublie de metre une mini jupe.
voilà c'est tou simple quand on explique avec de bonne reférence.
0
Rejoignez-nous