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 :

DOM - naviguer dans un XML en javascript


Sujet :

JavaScript

  1. #1
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut DOM - naviguer dans un XML en javascript
    Salut,

    voilà, j'ai un objet XML (classiquement un responseXML issue d'un XMLHttpRequest qui marche bien)
    mon XML ressemble à celà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
    <list>
      <tel><nom>abcdef</nom><id>123</id></tel>
      <tel><nom>xyz</nom><id>124</id></tel>
    </list>
    (bien sur avec plus de 2 "nom".
    je me suis dis que j'allais parcourir mon XML avec le DOM en recherchant le noeud <list> puis en parcourant ses fils (des <tel>) et en recuperant les nom et id de chacun... mais voilà ca ne marche pas (rien ne se passe sous IE et FFx)
    voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    var root_node=xmldoc.getElementsByTagName('list')[0];
    alert('root:'+root_node+ 'n:'+root_node.childNodes.length); // donne qqchose ok
    for (j=0;j<root_node.childNodes.length;j++)
     {
     alert(j+' -> '+root_node.childNodes[j].childNodes.length); // donne zero !!!, devrait donner 2 ?
     nom=root_node.childNodes[j].childNodes[0].nodeValue; // le nom
     id=root_node.childNodes[j].childNodes[1].nodeValue; // l'ID
     alert(j+' n:'+nom+' id:'+id); // rien ne s'affiche là...
     }
    voilà, si vous pouvez m'aider, ca fait 2 heures que je tourne en rond.

    merci d'avance.

  2. #2
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Juste pour dire que ton xml est mal formé : <tel>...</nom>

  3. #3
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut
    Citation Envoyé par Mr N.
    Juste pour dire que ton xml est mal formé : <tel>...</nom>
    non, c'etait juste une erreur de frappe ici dans le forum. que j'ai corrigé depuis, en fait le xml est bien (au moins ca j'en suis sûr)

  4. #4
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 665
    Points
    66 665
    Billets dans le blog
    1
    Par défaut
    personnellement je me méfie de la différence d'interprétation des childNodes entre IE et FFX qui oblige souvent à utiliser un nodeCleaner, du coup j'attaque un peu plus violemment :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alert(root_node.getElementsByTagName('tel').length)

  5. #5
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Sous Fx :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <list><tel><nom>abcdef</nom><id>123</id></tel><tel><nom>xyz</nom><id>124</id></tel></list>
    <script>
    var root = document.getElementsByTagName('list')[0];
    for(i = 0 ; i < root.childNodes.length ; i++) {
       nom = root.childNodes[i].childNodes[0].firstChild.nodeValue;
       id  = root.childNodes[i].childNodes[1].firstChild.nodeValue;
       alert(nom+' : '+id);
    }
    </script>
    Par contre c'est quoi le nodeCleaner ?

  6. #6
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 665
    Points
    66 665
    Billets dans le blog
    1
    Par défaut
    le node cleaner permet de supprimer certains nodes generes pas firefox ...
    ça scanne les nodes et vire les textnodes inutiles ...

    un simple teste du nombre de nodes et de childNodes sur une page en comparatif entre firefox et IE t'en diras bien plus ...

    par exemple dans un table ...

  7. #7
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut
    Citation Envoyé par Mr N.
    Sous Fx :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <list><tel><nom>abcdef</nom><id>123</id></tel><tel><nom>xyz</nom><id>124</id></tel></list>
    <script>
    var root = document.getElementsByTagName('list')[0];
    for(i = 0 ; i < root.childNodes.length ; i++) {
       nom = root.childNodes[i].childNodes[0].firstChild.nodeValue;
       id  = root.childNodes[i].childNodes[1].firstChild.nodeValue;
       alert(nom+' : '+id);
    }
    </script>
    Oups, au debut j'avais fait un copier/coller direct et j'avais oublié que tu avais "document." au debut de ton code.

    bon, voilà j'ai testé en mettant xmldoc (ma variable)

    voici donc le resultat :
    * sous FFx : erreur : root.childNodes[i].childNodes[0] has no properties

    * sous IE : erreur : childNodes à la valeur null ou n'est pas objet

    donc ca ne marche pas.

    PS :en fait ta solution est la même que la miene avec le "firstChild" en plus.

  8. #8
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Bon chez moi ca marche mais suit plutot les conseils de la grenouille de l'hyper-espace qui sont plus fiables

  9. #9
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 665
    Points
    66 665
    Billets dans le blog
    1
    Par défaut
    le problème vient du fait qu'IE n'interpète pas list comme étant une balise ...
    il n'arrive pas à trouver la balise fermante ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var root = document.getElementsByTagName('list')[0];
    alert(root.outerHTML)

  10. #10
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut
    Citation Envoyé par SpaceFrog
    personnellement je me méfie de la différence d'interprétation des childNodes entre IE et FFX qui oblige souvent à utiliser un nodeCleaner, du coup j'attaque un peu plus violemment :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alert(root_node.getElementsByTagName('tel').length)
    Salut, j'ai testé... ouais j'ai bien un resultat (il me donne le nombre de "tel") super... mais apres... j'ai essayé de suivre l'exemple en faisant comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var root_node=xmldoc.getElementsByTagName('list')[0];
    var nb=root_node.getElementsByTagName('nom').length;
    alert('nombre de tel:'+nb);
    for (j=0;j<nb;j++)
     {
     alert(root_node.getElementsByTagName('nom')[j].nodeValue);
     alert(root_node.getElementsByTagName('id')[j].nodeValue);
     }
    j'ai bien un alert pour le nb qui me donne une valeur (qui me semble correcte)...
    mais ca ne marche pas.... les alert me renvoie null pour le nom et les id !

  11. #11
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut
    Citation Envoyé par SpaceFrog
    le problème vient du fait qu'IE n'interpète pas list comme étant une balise ...
    il n'arrive pas à trouver la balise fermante ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var root = document.getElementsByTagName('list')[0];
    alert(root.outerHTML)
    le alert(root.outerHTML) me donne undefinned sous FFx et plante sous IE (objet requis)
    en fait je ne comprends pas ce que c'est que ce probleme ? cela viens t'il du nom de la balise que j'ai choisie (list) faut'il en prendre une autre ????

  12. #12
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    (pas testé de chez pas testé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var liste = xmldoc.getElementsByTagName('list')[0];
    var tels = liste.getElementsByTagName('tel');
    for (i = 0 ; i < tels.length ; i++) {
       nom = tels[i].getElementsByTagName('nom');
       ...
    }

  13. #13
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut
    Citation Envoyé par Mr N.
    (pas testé de chez pas testé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var liste = xmldoc.getElementsByTagName('list')[0];
    var tels = liste.getElementsByTagName('tel');
    for (i = 0 ; i < tels.length ; i++) {
       nom = tels[i].getElementsByTagName('nom');
       ...
    }
    ca dois pas être bien loin.. quand je vais un alert(nom) ca me donne Object HTMLCollection

    et sous IE : bah, ca plante, mais j'en suis plus là...

    s'il vous plait, j'ai plus un neurone là, j'ai passé un temps dingue sur des doc en anglais, je suis noyé...
    merci.

  14. #14
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut
    SOS, quand je fais (FFx) :
    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
       alert(tels[i].getElementsByTagName('nom')[0].nodeValue);
       // donne "null"
     
      alert(tels[i].getElementsByTagName('nom')[0]);
       // donne "Object Element"
     
      alert(tels[i].getElementsByTagName('nom'));
       // donne "HTMLObject Collection"
     
      alert(tels[i].getElementsByTagName('nom').nodeValue);
       // donne "undefined"
     
      alert(tels[i].getElementsByTagName('nom').data);
       // donne "undefined"
     
      alert(tels[i].getElementsByTagName('nom').firstChild);
       // donne "undefined"
    voilà, je suis perdu... comment je choppe le contenu de mon tag alors moi ?
    merci...

  15. #15
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    nom = tels[i].getElementsByTagName('nom')[0];
    for (i in nom) {
       alert(i+' : '+eval('nom.'+i));
    }
    Ca te permettra d'avoir toutes les propriétés/fonctions sur l'objet nom (sous Fx en tout cas)...
    bon clic

  16. #16
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut
    Merci Mr N.
    cette asctuce vaut de l'or !
    justement je me demandais au moment de poster ce message comment connaitre la liste des toutes les proprietes (il dois bien y avoir un site de reference si possible en francais) mais là avec cette astuce c'est encore mieux car c'est dynamique. aussi puissant que le concept DOM inspector de FFx ! (le jour ou je l'ai decouvert ca a revolutionné ma vie )

    merci.
    je donnerais (demain) la reponse a ma question ... si je la trouve (pour ceux que ca interresse).

    PS : et si qqun connais un bon site de reference pour le javascript, ej suis quand même preneur hein...

  17. #17
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Bien sur que tu dois donner ta réponse... pense aux autres qui auraient les mêmes difficultés !

  18. #18
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut
    voilà la reponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var liste = xmldoc.getElementsByTagName('list')[0];
    var tels = liste.getElementsByTagName('tel');
    for (i = 0 ; i < tels.length ; i++) {
       nom = tels[i].getElementsByTagName('nom')[0].childNodes[0].nodeValue;
       id = tels[i].getElementsByTagName('id')[0].childNodes[0].nodeValue;
       alert(id+' '+nom);
    }
    mais ca ne marche QUE sous FireFox.
    Je vais essayer de faire marcher celà sous IE (si qqun a une idée je suis preneur hein)

    C'est quand même bien tordu...

    merci de votre aide.

  19. #19
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Solution de contournement (pour pas dire facilité) : passe par les attributs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <list>
       <tel nom="Dupond" id="66" />
       <tel nom="Dupont" id="33" />
       ...
    </list>

  20. #20
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut
    Citation Envoyé par Mr N.
    Solution de contournement (pour pas dire facilité) : passe par les attributs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <list>
       <tel nom="Dupond" id="66" />
       <tel nom="Dupont" id="33" />
       ...
    </list>
    T'es fou (*) déjà que j'ai eu du mal a chopper les TAG, les attribus j'y pense même pas.... je ne connais même pas la fonction alors....
    en plus au debut j'y avais pensé, mais je m'etais dis que ca serait plus difficile !

    (*) tu me permettra cette familiarité

    merci de ton aide.

Discussions similaires

  1. [DOM] écrire dans fichier xml avec PHP5
    Par devil2005 dans le forum Bibliothèques et frameworks
    Réponses: 16
    Dernier message: 10/06/2008, 18h54
  2. [DOM] écrire dans un xml
    Par kermit796 dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 23/05/2008, 11h31
  3. [DOM] Ecrire dans mon XML avec du PHP
    Par PurpleDoll dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 15/10/2007, 14h06
  4. [DOM] lecture d'un xml en javascript avec la DOM XML
    Par tetardo dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 23/03/2007, 14h42
  5. [DOM] Encodage UTF-8 dans fichier XML et PHP
    Par norkius dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 03/01/2007, 15h44

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