IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

récursivité en javascript


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 22
    Par défaut récursivité en javascript
    Bonjour, j'essaye de faire une fonction xml2tab qui prend des fichiers xml et les transforme en tableau

    pour cela j'ai fait la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    function xml2tab(xml,tab){//prend un objet xml et un tableau et remplis ce-dernier a partir du xml
     
     
    	if (xml.hasAttributes()){//si le neud a des attributs
    		alert("il y a "+xml.attributes.length+" attributs");
    		for (i = 0; i < xml.attributes.length; i++) {//pour tout les attributs on les met dans le tableau
    			alert("attribut "+i);
    			tab[xml.attributes[i].nodeName] = xml.attributes[i].nodeValue;
    		}
    	}
    	if (xml.hasChildNodes()) {//si le neud a des "enfants"
    		alert ("il y a "+xml.childNodes.length+" childNodes");
    		for (j = 0; j < xml.childNodes.length; j++) {
    		//pour tous les enfants on crée un tableau contenant le tableau généré par la fonction xml2tab avec chaque enfant de l'objet xml de depart 
    			alert("childnode "+j);
    			var newxml = xml.childNodes[j]
    			tab[xml.childNodes[j].nodeName] = new Array();
    			tab[xml.childNodes[j].nodeName] = xml2tab(newxml,tab[xml.childNodes[j].nodeName]);
    			alert("childnode "+j+" terminé");
    		}	
    	}
     
    	return tab;
    }
    Qui est lancée sur le xml suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <parametre page="3" nbparpage="30">
    <corps val_max_credit="100.00" val_carton="3.00" nb_joueur="200" nb_carton="13" gain_max="20.00"/>
    <entete val_max_credit="Valeur maximum de credit" val_carton="Val Carton" nb_joueur="Nombre Joueurs" nb_carton="Nombre de cartons" gain_max="Gain maximum" txq1="Taux simple quine 1" txq2="Taux simple quine 2" txdq="Taux double quine" txcp="Taux carton plein"/>
    </parametre>
    Grâce aux alert je vois que je passe bien par tout dans mon tableau, mais la valeur des attributs de entete et corps sont undefined, le tableau est le suivant :

    tab[page] = 3
    tab[nbparpage] = 30
    tab[corps] =
    tab[entete] =
    tab[corps][val_max_credit] = undefined
    tab[corps][val_carton] = undefined
    tab[corps][nb_joueur] = undefined
    tab[corps][nb_carton] = undefined
    tab[corps][gain_max] = undefined
    tab[entete][val_max_credit] = undefined
    tab[entete][val_carton] = undefined
    tab[entete][nb_joueur] = undefined
    tab[entete][nb_carton] = undefined
    tab[entete][gain_max] = undefined
    tab[entete][txq1] = undefined
    tab[entete][txq2] = undefined
    tab[entete][txdq] = undefined
    tab[entete][txcp] = undefined

    Je ne vois donc pas pourquoi les attributes.value sont undefined alors que les attributes.name sont bons ..... merci d'avance ....

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 22
    Par défaut
    J'aimerais savoir si je doit accéder à mes variables xml et tab avec this ? Est-ce que mes variables sont locales à l'heure actuelle?

  3. #3
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Par défaut
    avant d'appeler un attributs par son nom , récupère la liste et affiches leur nom via : xml.attributes[i]

    nodeValue faisant référence , a ton noeud "<parametre page="3" nbparpage="30">"

    il te faut donc récupérer auparavant ton noeud , puis ses attributs , ensuite tu récupère les enfants et leurs attributs

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 22
    Par défaut
    Je ne comprend pas, ce n'est pas ce que je fait en faisant ca ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab[xml.attributes[i].nodeName] = xml.attributes[i].nodeValue;
    je crée une case a mon tableau qui porte le nom de mon attribut, et je lui assigne sa valeur ...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 22
    Par défaut
    En fait mon pb, j'ai l'impression c'est que je n'arrive pas a générer mon tableau de facon récursive.... avec mes différents alert je peux voir que je parse tout mon document xml, que j'arrive a afficher tous les attributs de tous les noeuds, mais je n'arrive pas à mettre les valeur dans le tableau que je veux retourner, j'ai toutes ces valeurs au moment ou je passe dans la fonction, mais dès que je sort je les perd ....

  6. #6
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Par défaut
    il y a une erreur quelque par puisque nodeValue renvois null et non pas undefined

    voila un exemple , tu n'as plus qu'à créer la fonction récursive

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Document sans nom</title>
    <script type="text/javascript">
    function afficheNoeud(){
     var monXml = document.getElementById('toto');
     var temp = "";
     for(var i = 0 , l = monXml.childNodes.length; i < l ;i++){
     	temp += "non du noeud : " + monXml.childNodes[i].nodeName + "\n";
    	if(monXml.childNodes[i].attributes != null){
    		for(var x = 0 , y = monXml.childNodes[i].attributes.length; x < y;x++){
    			temp += monXml.childNodes[i].attributes[x].nodeName + " = "+monXml.childNodes[i].attributes[x].nodeValue  + "\n";
    		}
    	} 
     }
     alert(temp);
    }
    window.onload = afficheNoeud;
    </script>
     
     
    </head>
     
    <body>
    <div id="toto">
    <parametre page="3" nbparpage="30">
    <corps val_max_credit="100.00" val_carton="3.00" nb_joueur="200" nb_carton="13" gain_max="20.00"/>
    <entete val_max_credit="Valeur maximum de credit" val_carton="Val Carton" nb_joueur="Nombre Joueurs" nb_carton="Nombre de cartons" gain_max="Gain maximum" txq1="Taux simple quine 1" txq2="Taux simple quine 2" txdq="Taux double quine" txcp="Taux carton plein"/>
    </parametre>
    </div>
    </body>
    </html>

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 22
    Par défaut
    Merci beaucoup pour ton aide, j'ai bien regardé ta fonction et c'est comme je fait en fait. (enfin je pense)

    J'ai modifié mon programme de cette facon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    function xml2tab(xml,tableau){//prend un objet xml et un tableau et remplis ce-dernier a partir du xml
     
    	var test="";
    	var tableau=new Array();
     
    	if (xml.hasAttributes()){//si le neud a des attributs
    		ligne += "il y a "+xml.attributes.length+" attributes<br>";
    		for (i = 0; i < xml.attributes.length; i++) {//pour tout les attributs on les met dans le tableau
    			ligne += "&nbsp;&nbsp;attribut "+i+" |";
    			 tableau[xml.attributes[i].nodeName] = xml.attributes[i].nodeValue;
    			ligne += xml.attributes[i].nodeName+" : "+xml.attributes[i].nodeValue+"<br>";
    		}
    	}
    	if (xml.hasChildNodes()) {//si le neud a des "enfants"
    		ligne += "il y a "+xml.childNodes.length+" childNodes<br>";
    		for (j = 0; j < xml.childNodes.length; j++) {
    		//pour tous les enfants on crée un tableau contenant le tableau généré par la fonction xml2tab avec chaque enfant de l'objet xml de depart 
    			ligne += "childnode "+j+"<br>";
    			test=xml.childNodes[0].nodeName;
    			 tableau[xml.childNodes[j].nodeName] = xml2tab(xml.childNodes[j], tableau[xml.childNodes[j].nodeName]);
    			ligne += "childnode "+j+" terminé<br>";
    		}	
    	}
    	return tableau;
    }
    puis après l'appel de la fonction comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab = xml2tab(parametre,tab);
    je fait un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert_html("id","affiche_parametre",liste+"<br><br>"+ligne);
    qui m'affiche ma ligne (et ma liste qui affiche le contenu du tableau, et j'obtient ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    tab[page] = 3
    tab[nbparpage] = 30
    tab[corps] =
    tab[entete] =
    tab[pok] =
    tab[corps][val_max_credit] = undefined
    tab[corps][val_carton] = undefined
    tab[corps][nb_joueur] = undefined
    tab[corps][nb_carton] = undefined
    tab[corps][gain_max] = undefined
    tab[corps][txq1] = undefined
    tab[corps][txq2] = undefined
    tab[corps][txdq] = undefined
    tab[corps][txcp] = undefined
    tab[entete][val_max_credit] = undefined
    tab[entete][val_carton] = undefined
    tab[entete][nb_joueur] = undefined
    tab[entete][nb_carton] = undefined
    tab[entete][gain_max] = undefined
    tab[entete][txq1] = undefined
    tab[entete][txq2] = undefined
    tab[entete][txdq] = undefined
    tab[entete][txcp] = undefined
    tab[pok][nom] = undefined
    tab[pok][prenom] = undefined
    tab[pok][mail] = undefined
     
     
    il y a 2 attributes
      attribut 0 |page : 3
      attribut 1 |nbparpage : 30
    il y a 3 childNodes
    childnode 0
    il y a 9 attributes
      attribut 0 |val_max_credit : 100.00
      attribut 1 |val_carton : 3.00
      attribut 2 |nb_joueur : 200
      attribut 3 |nb_carton : 13
      attribut 4 |gain_max : 20.00
      attribut 5 |txq1 :
      attribut 6 |txq2 :
      attribut 7 |txdq :
      attribut 8 |txcp :
    childnode 0 terminé
    childnode 1
    il y a 9 attributes
      attribut 0 |val_max_credit : Valeur maximum de credit
      attribut 1 |val_carton : Val Carton
      attribut 2 |nb_joueur : Nombre Joueurs
      attribut 3 |nb_carton : Nombre de cartons
      attribut 4 |gain_max : Gain maximum
      attribut 5 |txq1 : Taux simple quine 1
      attribut 6 |txq2 : Taux simple quine 2
      attribut 7 |txdq : Taux double quine
      attribut 8 |txcp : Taux carton plein
    childnode 1 terminé
    childnode 2
    il y a 3 attributes
      attribut 0 |nom : Martin
      attribut 1 |prenom : Bob
      attribut 2 |mail : mail3@mail.com
    childnode 2 terminé
    Donc en fait tant que je suis a l'interieur des fonctions je vois bien une valeur dans les nodesValue, mais je n'arrive pas a les stocker dans le tableau ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Les meilleurs livres pour apprendre le JavaScript
    Par vermine dans le forum Livres
    Réponses: 23
    Dernier message: 10/06/2019, 18h58
  2. Cours : algorithmes et récursivité
    Par Community Management dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 17/10/2018, 00h38
  3. JavaScript<---->ActionScript
    Par crazypiou dans le forum Flash
    Réponses: 21
    Dernier message: 17/04/2009, 17h14
  4. appel xmlservice via fonction javascript
    Par pram dans le forum XMLRAD
    Réponses: 2
    Dernier message: 06/05/2003, 14h24
  5. JavaScript de vérification de formulaire
    Par [DreaMs] dans le forum XMLRAD
    Réponses: 6
    Dernier message: 26/02/2003, 13h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo