XML et interprétation IE/FF [Résolu]

Signaler
Messages postés
14
Date d'inscription
mardi 15 février 2005
Statut
Membre
Dernière intervention
12 février 2009
-
Messages postés
14
Date d'inscription
mardi 15 février 2005
Statut
Membre
Dernière intervention
12 février 2009
-
Hello à tous,


j'ai un petit souci d'interprétation de code XML en Javascript.

Voici la structure basique de mon xml :
<?xml version= "1.0" encoding= "iso-8859-1"?>
<root>
<category1>

<name><![CDATA[name 1]]></name>
<![CDATAhttp://www.site1.com]>

<name><![CDATA[name 2]]></name>
<![CDATAhttp://www.site2.com]>

</category1>
<category2>

<name><![CDATA[name 1]]></name>
<![CDATAhttp://www.site1.com]>

<name><![CDATA[name 2]]></name>
<![CDATAhttp://www.site2.com]>

</category2>
</root>

Note: les CDATA sont là parce que mes urls et noms vont contenir des caractères "&", "?", "<", etc.


Lorsque j'essaie d'afficher, l'interprétation des nodes est différent selon IE et FF. Par exemple, ceci, dans mon js :
var doc = xhr.responseXML;//le xml est appelé par XMLHttpRequest

var element = doc.getElementsByTagName('root').item(0);

alert(element.firstChild.nodeName;)


Va bien donner "category1" avec IE, mais firefox m'affiche "#text" !!

Si je supprime tous les sauts de ligne et indentations (tab) dans le code du xml, là les 2 navigateurs affichent bien "category1".


J'ai essayé de passer le fichier XML en UTF-8, ISO... rien à faire...


Là je bute, quelqu'un aurait une idée ?

Merci beaucoup !

12 réponses

Messages postés
3472
Date d'inscription
lundi 16 juillet 2007
Statut
Membre
Dernière intervention
28 février 2014
32
Salut,

Firefox interprette les saut de ligne comme du texte donc il créer un noeud text ou plus a chaque saut de ligne ou même a chaque tabulation, a regarder avec inspecteur DOM tout ce que tu peus faire c'est une condition pour firefox avec une boucle pour vérifier que ce ne sont pas des noeud text qu'il te donne !

a++

Si la réponse vous convient, pensez : Réponse acceptée !
Messages postés
14
Date d'inscription
mardi 15 février 2005
Statut
Membre
Dernière intervention
12 février 2009

Mince alors, mais c'est un comportement normal, ça...?
C'est moi ou c'est complètement c*n comme interprétation ?
Tous les sites parsant du XML avec JS font pareil ?

C'est comme si FF interprétait les retours chariot dans le code html comme des balise
, non ?

Sinon la solution serait de réduire le XML en supprimant tous les retours chariot et indentations.
Mais bonjour la lisibilité...
Messages postés
3472
Date d'inscription
lundi 16 juillet 2007
Statut
Membre
Dernière intervention
28 février 2014
32
ouai, mais si tu regarde bien le code html d'un site avec dom inspector, tu vois le nom d'une balise et toujour un ou plusieur noeud text avant le prochain avec ff c'est comme ça et c'est un comportement normal, un de ces jour, qui sais, peut être que je ferai un snippet ou une classe plus complète pour la gestion du xml multinavigateur...

a++

Si la réponse vous convient, pensez : Réponse acceptée !
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
33
bonjour,

à priori, à mon humble avis... mettre un n° d'ordre dans une balise
   ne peut que poser des problèmes ! ( insolubles ou presque )
met     <category>    pour tous  déjà.

ensuite si tu veux un machin spécial par category, ajoute
  tu ajoutes une balise
      <category>
          <type> euh n'importe quoi </type>
          ....

après, faut voir ce que tu veux faire....

Cordialement

          Bul [mon Site] [M'écrire]         
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
33
et il est vrai que IE et FF ( et quid des autres navigateurs !!! )
    se comportent là aussi de manière différente
    en général, ça ne pose pas de problème, si
    on utilise des choses normales ( quand je dis normales,
    c'est en faisant référence à <category1> qui me semble anormal ! )

Bul[mon Site][M'écrire]
Messages postés
14
Date d'inscription
mardi 15 février 2005
Statut
Membre
Dernière intervention
12 février 2009

@bultez : les noeuds ne s'appellent pas vraiment categorie1 et categorie2, c'était pour l'exemple.
Ils ont chacun un nom différent
(en l'ocurrence : applications, sites)
.
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
33
>>Ils ont chacun un nom différent
??? c'est encore pire si tu parles de la balise !
( si tu parles d'un contenu, je comprend mieux )

doc.getElementsByTagName('root').item(0);
je ne vois pas à quoi ça peut te servir...

une structure xml doit ( ou alors c'est la porte ouverte à n'importe quoi
et pour l'exploiter : bonjour ! )  être de la forme
<root>
<category>

<name><![CDATA[name 1]]></name>
<![CDATAhttp://www.site1.com]>

<name><![CDATA[name 2]]></name>
<![CDATAhttp://www.site2.com]>

</category>    

<category>


...
</root>

l'utilisation de  doc.getElementsByTagName('root').item(0);  ne rime plus à grand chose

          Bul [mon Site] [M'écrire]         
Messages postés
14
Date d'inscription
mardi 15 février 2005
Statut
Membre
Dernière intervention
12 février 2009

Pour le doc.getElementsByTagName('root').item(0), j'ai en effet remplacé par doc.getElementsByTagName('root')[0].

Sinon, ma structure est plutot comme ça :

<root>

<name><![CDATA[name 1]]></name>
<![CDATAhttp://www.site1.com]>

<name><![CDATA[name 2]]></name>
<![CDATAhttp://www.site2.com]>

<sites>

<name><![CDATA[name 3]]></name>
<![CDATAhttp://www.site3.com]>

<name><![CDATA[name 4]]></name>
<![CDATAhttp://www.site4.com]>

</sites>
</root>

Le but est de récupérer 2 listes de liens distinctes.
Peut-etre devrais-je faire autrement et utiliser
<category name="applications">... ?
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
33
ou ajouter <nom>application</nom>   derrière les <category>

ch'tiot exemple :

<?xml version="1.0" encoding="iso-8859-1"?>
<root>
    <category>
       
            <name><![CDATA[name 1]]></name>
            <![CDATAhttp://www.site1.com]>
       
       
            <name><![CDATA[name 2]]></name>
            <![CDATAhttp://www.site2.com]>
       
    </category>
    <category>
       
            <name><![CDATA[name 3]]></name>
            <![CDATAhttp://www.site3.com]>
       
       
            <name><![CDATA[name 4]]></name>
            <![CDATAhttp://www.site4.com]>
       
    </category>
</root>

<html>
    <head>
    </head>
        <script type="text/javascript">
            var xmlD;
            function xmlFin()    // Xml chargé
            {    var tmp;
                for  ( var c=0; c<xmlD.getElementsByTagName('category').length;c++ )
                {    for ( var i=0; i<xmlD.getElementsByTagName('category')[c].getElementsByTagName('item').length; i++ )
                    {    tmp=xmlD.getElementsByTagName('category')[c].
                                        getElementsByTagName('item')[i];
                        alert    (     tmp.getElementsByTagName('name')[0].firstChild.nodeValue+" = "+
                                    tmp.getElementsByTagName('url')[0].firstChild.nodeValue
                                );
                    }
                }
               
                // on pourrait faire :

                for  ( var c=0; c<xmlD.getElementsByTagName('name').length;c++ )
                {    alert    (     xmlD.getElementsByTagName('name')[c].firstChild.nodeValue+" = "+
                                xmlD.getElementsByTagName('url')[c].firstChild.nodeValue
                            );
                }
               
               
            }

            // initialisation
            if ( document.implementation && document.implementation.createDocument )
                    {    xmlD = document.implementation.createDocument("", "", null);
                        xmlD.onload = function() {    xmlFin();    }
                    }   
            else     {    xmlD = new ActiveXObject("Microsoft.XMLDOM");   
                        xmlD.onreadystatechange = function ()
                        {    if (xmlD.readyState == 4)    xmlFin(); }
                    }
            xmlD.load("exemple.xml");
        </script>
   
</html>

          Bul [mon Site] [M'écrire]         
Messages postés
14
Date d'inscription
mardi 15 février 2005
Statut
Membre
Dernière intervention
12 février 2009

Hum tu as repris mon XML pourri dans ton exemple...

Sinon, en effet, pour palier à la différence d'interprétation IE / FF, je vais devoir utiliser des boucles imbriquées avec des getElementByTagName....

C'est quand même dommage qu'on ne puisse pas utiliser la structure logique des nodes.
Pourtant, les spécifications d'ECMAScript, comme celles d'XML, indiquent clairement que les espaces, tabulation et retours chariot  ne doivent pas être interprétées comme du contenu, mais comme un espace.
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
33
>>C'est quand même dommage qu'on ne puisse pas utiliser la structure logique des nodes.
perso, jamais utilisé, car jamais eu besoin ?
de toutes manières, j'ai un avis totalement différent du tien ;o)
    tant que je peux ignorer... je le fais

>>Pourtant, les spécifications d'[../c.aspx?u=aHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL3B1YmxpY2F0aW9ucy9zdGFuZGFyZHMvRWNtYS0yNjIuaHRt ECMAScript],
oh tu sais, les spécifs sont des recommandations
    que les navigateurs suivent.... quand ça les arrangent !
    néanmoins, globalement, il parait que c'est IE le moins respectueux...

          Bul [mon Site] [M'écrire]      
Messages postés
14
Date d'inscription
mardi 15 février 2005
Statut
Membre
Dernière intervention
12 février 2009

Oui on a un avis différent.
Je trouve personnellement plus logique de naviguer dans les nodes avec des firstNode et childNodes, plutôt que cibler les éléments avec des boucles imbriquées de getElementByTagName.

On sait que les recommandations ne sont pas toujours suivies, en particulier par IE.
(ici, ça doit être l'exception qui confirme la règle)

Mais on ne m'empêchera pas de penser que le fait de considérer les retours chariot dans du code XML comme des nodes  #text est complètement débile...