"XML et recursivité" ou comment peter un cable en 10 min
phentex
Messages postés27Date d'inscriptionsamedi 28 février 2004StatutMembreDernière intervention 1 juillet 2005
-
27 juin 2005 à 14:45
lama18
Messages postés1Date d'inscriptionsamedi 22 janvier 2005StatutMembreDernière intervention 8 octobre 2007
-
8 oct. 2007 à 20:21
Bonjour à tous,
cet aprem, Flash me fait péter un plomb.
Le contexte (je bosse sous FlashMX2004Pro 7.2 (à jour quoi...) )
J'ai un fichier XML balo qui porte le doux nom de "test.xml", donc voici le contenu:
<racine>
<tsoin1/>
<tsoin2/>
<kate>
<tsoin1/>
<tsoin2/>
</kate>
<rodolf>
<tsoin1/>
<tsoin2/>
</rodolf>
</racine>
(Au départ j'ai un fichier xml bien plus complexe que ca mais j'ai préférer simplifier, d'autant que le probleme reste présent)
J'ai également ma fonction onLoad pour l'objet XML 'donnees' obtenu par parsing qui fonctionne impec.
Mon problème :
Je veux lister le contenu de mon fichier xml de facon RECURSIVE
(qui dit arborescence, dit circulation récursive, ca va de soit...)
Mais: Flash semble allergique au récursif...
j'ai le code suivant:
- au sain de l'onLoad de mon objet xml je fait appelle à la fonction f1 qui prend en parametres l'objet xml 'donnees'.
f1 = function ( ObjetXML )
{
rec ( ObjetXML , "");
}
- rec est la fonction recursive proprement dite qui va explorer branche
par branche l'arborescence xml et l'afficher dans la console de sortie
texte de Flash.
rec = function ( ObjetXML , retrait )
{
trace ( retrait + ObjetXML.nodeName );
if ( ObjetXML.childNodes.length != 0 )
{
for ( i=0 ; i<ObjetXML.childNodes.length ; i++ )
{
rec ( ObjetXML.childNodes[i] , retrait + " " );
}
}
}
En sortie, j'obtiens :
null
racine
bruce
tsoin1
tsoin2
et c'est tout !!
Pourquoi n'ai je pas :
null
racine
bruce
tsoin1
tsoin2
kate
tsoin1
tsoin2
rodolf
tsoin1
tsoin2
En gros, une fois la fonction terminée, Flash n'est pas foutu de retourner dans la fonction appelante...
PLEAAZE HELP ME
(dans flash, on définit au départ uniquement une
classe à partir de son constructeur. Je me demande si la variable i
dans ma fonction rec serait pas considérée comme une variable de
classe, dans ce cas pas étonnant que foute le souk au niveau des
incrémentations dans les fonctions rec appelante.... qu'en pensez vous
?)
phentex
Messages postés27Date d'inscriptionsamedi 28 février 2004StatutMembreDernière intervention 1 juillet 2005 28 juin 2005 à 09:59
je suis exaspéré, je viens de taper un message de 30 lignes, et firefox a planté...
Samy >> je pige pas du tout ta réponse, la fonction rec est
précisément la fonction récursive, donc je vois pas en quoi dans f1
(qui est juste la fonction d'amorce et d'initialisation de la
récursion) devrait avoir un for en plus...
SuperDevy >> J'ai regardé ton code, mais j'ai vraiment du mal à
comprendre l'algo. (ca fait seulement 2 semaines que je suis dans
flash...)
Ce que je cherche à faire en fait c'est au final un menu dans flash
avec une certaine profondeur de sous-menus, correspondant à une branche
bien précise de mon fichier xml. J'utilise la récursivité parce que je
ne sais pas quelle est la profondeur de l'arborescence xml va se baser
mon menu graphique. D'ailleurs, pour filtrer et indiquer à la fonction
récursive quelle branche de sous-noeud explorer ou ne pas explorer,
chaque noeud possède (ou non) un attribut HasSubSection="yes" pour lui
indiquer qu'il doit explorer la branche du noeud. Si cet attribut n'est
pas présent, la fonction récursive n'explore pas la branche du noeud.
Le code de ma fonction rec est donc: (simplement pour afficher ce qui sera plus tard un menu graphique)
if
(ObjetXML.childNodes[i].attributes.HasSubSection == "yes")
rec(ObjetXML.childNodes[i] , " ");
}
}
Ma principale frustration, outre le fait que ca fait 2 jours que
je traine la dessus et ca commence sérieusement à me casser les
#&~@, c'est POURQUOI mon fichu code de marche pas ? pourquoi est ce
que la recursivité creuse dans l'arborescence, mais ne retourne pas au
noeud parent (cf les données affichées dans mon premier post)
Merci d'avance
bon je reviens, je vais me chercher un tabouret et une corde... oh nan tiens, ma ceinture fera l'affaire.
lama18
Messages postés1Date d'inscriptionsamedi 22 janvier 2005StatutMembreDernière intervention 8 octobre 2007 8 oct. 2007 à 20:21
bonjour, as tu essayé :
rec = function ( ObjetXML , retrait )
{
trace ( retrait + ObjetXML.nodeName );
if ( ObjetXML.childNodes.length != 0 )
{
var i=0
for ( i=0 ; i<ObjetXML.childNodes.length ; i++ )
{
rec ( ObjetXML.childNodes[i] , retrait + " " );
}
}
}
car j'ai deja eu le PB avec flash, il garde la meme variable si on ne precise pas var.
A+