Problème création de tableau associatif de facon récursive

Résolu
choungaboys Messages postés 8 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 8 août 2008 - 7 août 2008 à 13:32
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 - 8 août 2008 à 12:18
Bonjour,

je souhaite lire un xml et générer un tableau a partir des données de ce-dernier. Je souhaite créer mon tableau de la facon suivante:
tab[nom de l'attribut]=value de l'attribut
tab[nom du noeud]= tableau contenant :  tab[nom de l'attribut]=value de l'attribut ....

Je veux donc créer un tableau associatif comme en php avec toutes mes valeurs, j'ai donc fait le code suivant, et j'ai testé :

function xml2tab(xml){//prend un objet xml et un tableau et remplis ce-dernier a partir du xml

    var tableau = new Array();

    if (xml.hasAttributes()){//si le noeud a des attributs
        ligne += "il y a "+xml.attributes.length+" attributes
";
        for (i = 0; i < xml.attributes.length; i++) {//pour tout les attributs on les met dans le tableau
            ligne += "&amp;nbsp;&amp;nbsp;attribut "+i+" |"+xml.attributes[i].nodeName+" : "+xml.attributes[i].nodeValue+"
";
             tableau[xml.attributes[i].nodeName] = xml.attributes[i].nodeValue;
        }
    }
    if (xml.hasChildNodes()) {//si le noeud a des "enfants"
        ligne += "il y a "+xml.childNodes.length+" childNodes
";
        var tab_tmp2 = new Array();
        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+" : "+xml.childNodes[j].nodeName+"
";
            tableau[xml.childNodes[j].nodeName] = new Array();
            tableau[xml.childNodes[j].nodeName] = xml2tab(xml.childNodes[j]);
            ligne += "childnode "+j+" terminé
";
        }    
    }

    return tableau;
}



Le tableau de retour pour chaque appel est correctement formé avec les
bonnes valeurs, mais le tableau général renvoyé ne comporte que les
attributs et après toutes les autres "cases" sont bien crées, mais contiennent undefined.

Merci d'avance

10 réponses

cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
8 août 2008 à 10:20
aurais-je compris ce que tu veux faire ?
des tableaux associatifs multi-dimensionnels ?

<script>

function toto()
   {   var tableau=new Array();
        var nom=["un","deux","trois"];
        var tab1=new Array("1","2","3");
        for ( i = 0; i < nom.length; i++ )
        {   tableau[nom[i]] = tab1;
        }  
        return tableau;
   }
   
   var tmp=toto();
   for ( var i in tmp )
   {        for ( var j in tmp[i] )
            {        alert ( i + "\t" + tmp[i][j] );    }
   }

     tmp["deux"]["2"]="toto";
     alert(tmp["deux"]["2"]);
     
</script>

pour l'exemple c'est toujours le même, mais bon...

          Cordialement     Bul   [mon Site]  [M'écrire], <!--
3
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
7 août 2008 à 15:27
bonjour,
tu creé un array que tu n'utilises pas ?
             tableau[xml.childNodes[j].nodeName] = new Array();
            tableau[xml.childNodes[j].nodeName] = xml2tab(xml.childNodes[j]);

ch'tiot exemple, tu adapteras :
  var tableau=new Array();

  var nom=["un","deux","trois"];

  for (j = 0; j < nom.length; j++)

      {   tableau[nom[j]] = new Array();

          tableau[nom[j]][0] = j;

      }

    for ( j in tableau )

    {    alert(j+"="+tableau[j][0]);    }

 
   
          Cordialement        Bul   [mon Site]  [M'écrire], <!--
0
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
7 août 2008 à 15:29
une question néanmoins me turlupine ... pourquoi passer par un tableau ?
au fond,  cela en est un ... non ?
          Cordialement    Bul   [mon Site] [M'écrire], <!--
0
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
7 août 2008 à 15:30
il fallait lire : au fond,  le xml en est un ... non ?
           Cordialement    Bul   [mon Site] [M'écrire], <!--
0

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

Posez votre question
choungaboys Messages postés 8 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 8 août 2008
7 août 2008 à 15:49
Ben en fait, c'est pour une sérialisation de données entre mon php, et mon javascript en ajax, je charge un flux xml en ajax, j'ai une fonction que j'ai fait en php qui me transforme n'importe quel tableau en xml, maintenant je voudrais faire l'opération inverse pour récupérer mon tableau et pouvoir accéder simplement à mes données en faisant tab['...']['....'].
Et oui, le xml, au fond c'est un tableau, mais j'aurais souhaité ne pas me servir des fonctions xml (plus longues a écrire et que mes collègues maitrisent moins) pour accéder à toutes mes données.
De plus si j'utilise une fonction avec un for pour parser tout mon tableau, étant donné qu'on est en récursif, je ne sait pas ou je suis par rapport au tableau d'origine, dans quel sous tableau, et ma fonction xml2tab me retourne un tableau déjà multidimensionnel ....
0
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
7 août 2008 à 16:27
ce n'était qu'une question....
j'en aurais bien d'autres ( pourquoi pas coté php ? pourquoi ajax sur du xml  ? .. )
mais bon ce serait assez stérile, et je risquerais de paraître ch%$¤*.
bref, je pense qu'on n'a pas assez de billes... ne serait-ce que pour tester

car si j'applique ce que tu exemples à mon exemple :

    function toto()
    {    var tableau=new Array();
        var nom=["un","deux","trois"];
        var tab2=new Array();
        for (j = 0; j < nom.length; j++)
        {   tableau[nom[j]] = new Array();
            tab2.push((j+1)*10);      // pour simuler xml2tab
            tab2.push((j+1)*100);
            tab2.push((j+1)*1000);
            tableau[nom[j]] = tab2;
        }   
        return tableau;
    }
    var tmp=toto();
    for ( var i in tmp )
    {    alert(i+"="+tmp[i]);    }

les for ne sont qu'en exemple, pour le test, "pour simplifier",
ça ne change rien au "principe"

pas de raisons que cela ne fonctionne pas,
il faudrait cerner le souci un peu plus,
difficile de tester avec l'extrait donné.

     Cordialement   Bul  [mon Site] [M'écrire], <!--
0
choungaboys Messages postés 8 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 8 août 2008
8 août 2008 à 09:52
Ben en fait j'utilise le xml, parceque je veux de l'ajax et que c'est ce que je connait le plus, maintenant si ya d'autre moyen plus simples ou rapide, je veux bien, et vas-y ne te gene pas pour les questions, si ca me permet de découvrir plus de choses....

Pour ton exemple je veux bien, je comprend bien, mais quand il s'agit de tableau associatifs, ca me parait plus complexe .... ca ne marche pas, enfin je n'y arrive pas, en faisant ca :

    var table=new Array();
    var table1=new Array();
    var table2=new Array();
    table1["pok1"]="pokke1";
    table1["pok2"]="pokke2";
    table1["pok3"]="pokke3";
    table2["pwet1"]="pwette1";
    table2["pwet2"]="pwette2";
    table2["pwet3"]="pwette3";

    table["pok"] = new Array();
    table["pwet"] = new Array();
    table["pok"] = table1;
    table["pwet"] = table2;
   

Et pour parcourir un tableau multidimentionnel
0
choungaboys Messages postés 8 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 8 août 2008
8 août 2008 à 09:55
oops dsl, oui, pour parcourir un tableau multidimentionnel, je trouve que c'est plus simple en récursif qu'en itératif, c'est ce que je voulais dire avec les for.
0
choungaboys Messages postés 8 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 8 août 2008
8 août 2008 à 10:56
Désolé, merci beaucoup, je me suis appercu que ma fonction marche très bien, mais que je me suis planté dans la fonction d'affichage de mon tableau .....

Sinon oui c'est bien des tableaux associatifs multi-dimensionnels ... encore dsl, et merci en tout cas
0
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
8 août 2008 à 12:18
tu n'as pas à être désolé, l'essentiel est que ça baigne, il n'y avait pas de raison.
                  Cordialement    Bul  [mon Site] [M'écrire], <!--
0
Rejoignez-nous