"XML et recursivité" ou comment peter un cable en 10 min

phentex Messages postés 27 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 1 juillet 2005 - 27 juin 2005 à 14:45
lama18 Messages postés 1 Date d'inscription samedi 22 janvier 2005 Statut Membre Derniè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
?)

10 réponses

phentex Messages postés 27 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 1 juillet 2005
27 juin 2005 à 15:39
UP svp, ayez pitié de moi

je suis sur un gros projet et chui bloqué à cause de cette#{~[{`|[{||~[{~|
0
cs_goldenboy68 Messages postés 1596 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 9 juin 2011 2
27 juin 2005 à 17:29
Comment Flash va savoir qu'elle doit être récursive ta fonction??

f1 = function ( ObjetXML )
{
rec ( ObjetXML , "");
}

...tu l'appelles qu'une fois...donc forcément, elle fait qu'une boucle "for"

ajoute un truc du genre:

f1 = function ( ObjetXML )
{
for(i=0;i<ObjetXML.length;i++)
rec ( ObjetXML , "");
}
}

@+! Samy
0
bonsmou Messages postés 20 Date d'inscription dimanche 9 novembre 2003 Statut Membre Dernière intervention 23 mars 2006
27 juin 2005 à 17:52
XML.toString();
0
SuperDevy Messages postés 842 Date d'inscription dimanche 24 novembre 2002 Statut Membre Dernière intervention 2 juillet 2007
28 juin 2005 à 00:03
Voici un exemple d'exploration recursive d'un objet XML :

http://wiki.media-box.net/doku.php?id=classes:flash:com:wikimb:searchtree


Voir la fonction : _buildNodesList


SuperDevy, c la !
0

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

Posez votre question
phentex Messages postés 27 Date d'inscription samedi 28 février 2004 Statut Membre Derniè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)



rec = function(ObjetXML , retrait)

{

for ( i=0 ; i<ObjetXML.childNodes.length ; i++ )

{

trace( retrait + ObjetXML.childNodes[i].nodeName )

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.



cordialement
0
phentex Messages postés 27 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 1 juillet 2005
28 juin 2005 à 10:00
oups c'est rec(ObjetXML.childNodes[i] , " " + retrait);

pas rec(ObjetXML.childNodes[i] , " ");

(m'enfin on s'en fout un peu en fait, c'est juste pour l'ethétique)
0
cs_goldenboy68 Messages postés 1596 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 9 juin 2011 2
28 juin 2005 à 10:10
Désolé...j'avais pas vu l'appel à rec dans rec...j'avais pas les yeux
ouverts! Mais dans le code de SuperDevy...tu devrais trouver ton
bonheur!



@+! Samy
0
phentex Messages postés 27 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 1 juillet 2005
28 juin 2005 à 11:34
pas grave



par contre dans le code de SuperDevi ya pas mal de choses que je pige pas.



private static function _buildNodesList (fromXML:XMLNode, toArray:Array) :Void
{
var n = fromXML.childNodes.length;
for (var i=0; i<n; i++)
{
if (fromXML.childNodes[i].hasChildNodes())
{
arguments.callee(fromXML.childNodes[i], toArray);
}
else
{
toArray.push(fromXML.childNodes[i]);
}
}
}


je pige pas la ligne arguments.callee(fromXML.childNodes[i], toArray);


c'est quoi arguments.callee ?

il est ou l'appel récursif à _buildNodesList ??



Merci bcp d'avance
0
lilyvirus Messages postés 117 Date d'inscription mardi 14 janvier 2003 Statut Membre Dernière intervention 5 novembre 2008
5 janv. 2006 à 13:37
j'ai le meme souci tu as trouvé la solution?
0
lama18 Messages postés 1 Date d'inscription samedi 22 janvier 2005 Statut Membre Derniè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+
0
Rejoignez-nous