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. #21
    Expert confirmé

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Par défaut
    Citation Envoyé par hpfx
    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....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    getAttribute/setAttribute
    Pour intervenir sur le début du problème (avec quelque peu de retard):
    Il y en effet comme le dis SP une différence fondamentale d'interprétation du DOM entre IE et FFx.

    Ainsi, le document:
    <?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>
    Correspond à l'arbre DOM (sous IE):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    |--list
        |--tel
        |    |--nom
        |    |    |--"abdcef"
        |    |--id
        |         |--"123"
        |--tel
             |--nom
             |    |--"xyz"
             |--id
                  |--"124"
    qui est l'arbre DOM attendu.
    Alors que sous FFx, l'arbre est le suivant:
    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
     
    |--list
        |--"  "
        |--tel
        |    |--nom
        |    |    |--"abdcef"
        |    |--id
        |         |--"123"
        |--"  "
        |--tel
        |    |--nom
        |    |    |--"xyz"
        |    |--id
        |         |--"124"
        |--"  "
    La différence n'est pas énorme, mais dés que tu fais un:
    root_node.childNodes[j].childNodes.length
    pour j=0, ça retourne un undefined dans FFx car le premier noeud est un noeud texte.

    D'ou tout ton problème.

    Une solution est effectivement d'utiliser un "node cleaner" qui est un programme qui va detecter ces noeuds textes ne contenant que des blancs et le supprimer.

    Bonne chance!!

  2. #22
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Par défaut
    Citation Envoyé par denisC
    Alors que sous FFx, l'arbre est le suivant:
    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
     
    |--list
        |--"  "
        |--tel
        |    |--nom
        |    |    |--"abdcef"
        |    |--id
        |         |--"123"
        |--"  "
        |--tel
        |    |--nom
        |    |    |--"xyz"
        |    |--id
        |         |--"124"
        |--"  "
    La différence n'est pas énorme, mais dés que tu fais un:
    root_node.childNodes[j].childNodes.length
    pour j=0, ça retourne un undefined dans FFx car le premier noeud est un noeud texte.

    D'ou tout ton problème.

    Bonne chance!!
    ok,
    bon, c'est un peu balez tout ca pour moi.
    je comprends donc pouquoi il faut parcourir les 'tel' et le 'id', plutot que passer par childNodes[]...
    mais par contre ca n'explique pas pourquoi le code qui marche sous FFx ne fonctionen pas lui sous IE ?
    pour rappel, le voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if (xmldoc.getElementsByTagName('list')[0].getElementsByTagName('tel').length==0)
      { Fct_noentry();
        return;
      }
    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;
       Fct_ligne(nom,id);
    }
    en gros, est-il plus simple de corriger mon code actuel pour qu'il marche aussi sous IE. ou faut-il mieux faire un code qui parcour les nodes de <list> en prenant soin de ne pas lire les nodes " " (chaine vide) ? (ou utilisant un node cleaner)

    quest-ce qu'il y a de mieux ?
    ou si qqun peu me donner le code pour parcourir cet arbre sous IE (je peux au pire faire une fonction pour IE et une pour FFX ? ou au mieux essayer de fusionner les 2 )

    merci.

    PS: et grace a ton explication, j'ai compris pourquoi j'ai eu du mal quand j'ai voulu tester s'il y avait un fils "tel" dans "list", voir ce que j'ai du faire à la 1ere ligne de mon code... quand je vois celà ca fait froid dans le dos

  3. #23
    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 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    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 659
    Billets dans le blog
    1
    Par défaut
    javatwister à du coller un script de nodecleaner dans la faq ...
    un petit coup de node cleaner avant de lancer ta fonction de parsage...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  4. #24
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Par défaut
    Citation Envoyé par SpaceFrog
    javatwister à du coller un script de nodecleaner dans la faq ...
    un petit coup de node cleaner avant de lancer ta fonction de parsage...
    dans la FAQ javascript (http://javascript.developpez.com/faq/) ?
    j'ai pas trouvé. J'ai jeté un coup d'oeuil avant de poster ici mais a par de grosse generalité, j'ai pas vu.

  5. #25
    Expert confirmé

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Par défaut
    Citation Envoyé par hpfx
    dans la FAQ javascript (http://javascript.developpez.com/faq/) ?
    Dans le projet de FAQ

    Tu as ma méthode (orientée DOM) et la méthode de JT (orientée JT). Il soutiens que la sienne va plus vite, ce que je ne peux démentir. Mais au moins la mienne, je comprends comment elle fonctionne

  6. #26
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Par défaut
    Citation Envoyé par denisC
    Interressant.. pas facile pour qqun qui n'est pas un expert.
    bon en fait vous vous êtes concentré sur le nettoyage, ok. mais dans le tutorial, (une fois le nettoyage réalisé) il manque je trouve un petit exemple de parcours d'arbre... enfin voilà quoi. je vais etudier vos sources.

    j'ai encore une vrai question : voilà, je recupere mon objet xml grace a un XMLHttpRequest avec un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var xmldoc=http_req.responseXML
    mais voilà, pour effectuer des test, c'est la galere (a chaque fois, j'upload le vais dans le navigateur je recharge la page, je saisie qqchose dans un champ... enfin c'est lourds...
    je voulais savoir y a t'il a un moyen de mettre directement dans le code javascript un exemple de xml, un peu comme celà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var xmldoc="<list><tel><nom>abc</nom><id>123</id></tel><tel>.....";
    vous voyez ce que je veux dire ?

    ou p'tre mettre directment mon <list> dans le body et y faire un truc genre var xmldoc=document.getElementById ??? non ???

    merci d'avance.

  7. #27
    Expert confirmé

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Par défaut
    Citation Envoyé par hpfx
    je voulais savoir y a t'il a un moyen de mettre directement dans le code javascript un exemple de xml, un peu comme celà
    Intéressante comme question. Je ne sais pas si tu peux créer un document DOM dans ta page.

    Tu peux certainement créer un élement XML dans ta page web (en l'insérant dans un div caché de ta page par exemple), ou tu peux le créer dynamiquement en JS avec les méthodes DOM (createElement et autre). A toi de voir si ça vaut le coup...

  8. #28
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Par défaut
    tiens, en passant, voici une petite fonction que j'ai pondu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function affinfo(obj,nom)
    {
    c='<br /><u>'+nom+'</u><ul>';
    for (i in obj) {
         try{
    	 c=c+'<li>'+nom+'.'+i+' : '+eval(nom+'.'+i)+'</li>';
    	 } catch(e) {c=c+'<li>ERR '+nom+'.'+i+' '+e.description+'</li>';}
      }
    c=c+'</ul>';
     document.write(c);
    }
    completement basé sur le code (voir plus haut) donné par Mr N.
    cette fonctionne affiche les propriete d'un element, pratique quand on a pas de DOM inspector (IE)

    ca s'utilise comme celà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // j'ai un objet : truc
    affinfo(truc,'truc');
    j'espere que ca peux aider.
    est-ce que ca peux trouver sa place dans la FAQ (a coté des codes de nettoyage) ?
    bien sur on peut remplacer le write par un return et renvoyer le commentaire à la fonction appelante pour un usage differents... a vous de voir.

  9. #29
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Par défaut
    Citation Envoyé par denisC
    ou tu peux le créer dynamiquement en JS avec les méthodes DOM (createElement et autre). A toi de voir si ça vaut le coup...
    une âme charitable capable de me pondre le JS qui crée ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    |--list
        |--tel
        |    |--nom
        |    |    |--"abdcef"
        |    |--id
        |         |--"123"
        |--tel
             |--nom
             |    |--"xyz"
             |--id
                  |--"124"
    sivousplait....

    ouais parceque déjà j'arrive pas a le parcourir (j'y travaille justement) mais en plus si je dois le créer, je ne suis pas sur d'y arriver.
    d'un autre coté il vaut mieux partir sur de bonnes bases et être SUR a 100% de mon objet xml, et donc que ca soit fait par qqun qui sait faire. (promis je donnerais la fonction de lecture qui marche dans FFx et IE)

    donc, un grand merci a celui qui prendra son courage a deux main pour m'aider.

  10. #30
    Expert confirmé

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Par défaut
    Citation Envoyé par hpfx
    une âme charitable capable de me pondre le JS qui crée ceci :
    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
     
    function createXMLDoc() {
        if (document.implementation && document.implementation.createDocument) {
            var xmldoc = document.implementation.createDocument("", "list", null);
            xml_root = xmldoc.documentElement;
        }
        else if (window.ActiveXObject) {
            var xmldoc = new ActiveXObject("Microsoft.XMLDOM");
            xml_root = xmldoc.createElement("list");
            xmldoc.appendChild(xml_root);
        }
        xml_tel1 = xmldoc.createElement('tel');
        xml_root.appendChild(xml_tel1);
        xml_nom1 = xmldoc.createElement('nom');
        xml_tel1.appendChild(xml_nom1);
        xml_nom1.appendChild(xmldoc.createTextNode('abcdef'));
        xml_id1 = xmldoc.createElement('id');
        xml_tel1.appendChild(xml_id1);
        xml_id1.appendChild(xmldoc.createTextNode('123'));
        xml_tel2 = xmldoc.createElement('tel');
        xml_root.appendChild(xml_tel2);
        xml_nom2 = xmldoc.createElement('nom');
        xml_tel2.appendChild(xml_nom2);
        xml_nom2.appendChild(xmldoc.createTextNode('xyz'));
        xml_id2 = xmldoc.createElement('id');
        xml_tel2.appendChild(xml_id2);
        xml_id2.appendChild(xmldoc.createTextNode('124'));
        return xmldoc;
    }
    Testé et approuvé dans FFx, testé dans IE: ça ne fait pas de bug, mais je n'ai pas réussi à vérifier le document en entier (trop long...)

    Bonne chance

  11. #31
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Par défaut
    salut,
    je me suis bien casser la tete sur un probleme similaire en utilisant le xmlhttprequest
    pour ie en fait il faut d abord accéder au documentElement de ton responseXml.
    Apres tu pourras faire tes get...
    A savoir aussi que les elements n ont pas les memes propriétés et méthodes si tu es dans ff ou ie.

  12. #32
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Par défaut
    Citation Envoyé par siddh
    salut,
    je me suis bien casser la tete sur un probleme similaire en utilisant le xmlhttprequest
    pour ie en fait il faut d abord accéder au documentElement de ton responseXml.
    Apres tu pourras faire tes get...
    A savoir aussi que les elements n ont pas les memes propriétés et méthodes si tu es dans ff ou ie.
    merci, je galere comme pas possible (j'ai pas pu y consacrer plus d'une demin journée vendredi), et ce malgres l'aide de denisC et de son script.
    mais a force de perceverer je vais y arriver.
    merci pour ton conseil.
    apparement ce qui marche avec le document xml du script de denisC ne marche pas avec le vrai jeu de test (renvoyé par le serveur) et pourtant j'ai modifié ma fonction pour quelle renvoie excatement le xml de l'exemple (même au niveau des retours chariots)

    d'ailleur j'ai trouvé comment eviter d'avoir besoin d'un nodecleaner pour firefox : il ne faut pas faire de retour à la ligne entre les tags (xml).
    Les retours a la ligne sont interpreté comme un node texte par fairefox (pourquoi pas apres tout). donc voilà c'est une information que j'espere aidera certains. (et dire que j'avais volontairement ajouté ces retours à la ligne pour faire qqchose de lisible! sic)

    Je vous tiendrai au courant...

  13. #33
    Expert confirmé

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Par défaut
    Citation Envoyé par hpfx
    d'ailleur j'ai trouvé comment eviter d'avoir besoin d'un nodecleaner pour firefox : il ne faut pas faire de retour à la ligne entre les tags (xml)
    J'avais en effet oublié de préciser, mais ces noeuds vide n'apparaissent pas par hasard. Il apparaissent là ou existent des caractères blancs (comme le retour chariot).

    Et effectivement, le comportement de FireFox est compatible avec la norme XML du W3C.

  14. #34
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Par défaut
    Bon, voilà apres 2 jours de recherche je dois baisser les bras.
    pour IE, je n'utilise pas le XML (en esperant que dans IE7 on puisse se rapprocher de la syntaxe FFx) dans le cas d'IE mon service web (php) ne renvoie pas du xml, mais plutot du simple texte avec separateur, en JS il ne reste qu'a spliter totu ca... (je sais c'est nul)
    voilà j'avais promis de vous donner des nouvelles....

    une question en fouillant sur ce site hier soir, je suis tombé par hazard sur un lien d'une page ou etait detaillé les different TAG xhtml. c'etait bien fais car pour chaques tag, il y a les parent possible et les enfants possible (et surtout en rouge les enfants obligatoire) malheuresement j'ai oublié debookmarquer le site... je ne le retrouve pas. si qqun connais... merci.

  15. #35
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Par défaut
    il y a une reference xhtml sur zvon.org mais je penses pas que ce soit ca.
    par contre le site vaut le deplacement si tu le connais pas.

  16. #36
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Par défaut
    Citation Envoyé par siddh
    il y a une reference xhtml sur zvon.org mais je penses pas que ce soit ca.
    par contre le site vaut le deplacement si tu le connais pas.
    ouais, http://zvon.org/xxl/xhtmlReference/Output/index.html
    c'est axactemetn le même concept, bon le site etait plus joli, et surtout il y avait pas de pub.

    mais je ne vais pas faire la fine bouche, ce site ira tres bien.

    merci

  17. #37
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Par défaut
    oui zvon c est moche c est vrai mais tellement complet !
    t as aussi les refs dom 2, css 2 ...

    apres t as aussi http://www.w3schools.com/

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