Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > AJAX
AJAX Forum sur la programmation AJAX. Avant de poster : Cours AJAX, FAQ AJAX, Toutes les FAQ JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/01/2011, 17h09   #1
Invité régulier
 
Inscription : septembre 2005
Messages : 39
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 39
Points : 7
Points : 7
Par défaut responseXML sous ie7 et ie8

Bonjour,

J'essaie de lire le contenu d'un fichier kml (crée sous GoogleEarth) avec un script javascript. Sous Firefox, cela fonctionne sans problème mais pas sous InternetExplorer.
Aucun ne m'affiche de message d'erreur mais le résultat renvoyé par ie est null.

Si quelqu'un pouvait regarder mon script (simplifié à l'extrème). Le fichier lb.kml est un fichier crée par GoogleEarth contenant plusieurs balises "<Placemark>".

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
function loadXML(_fichierXML){
   var fichierXML = _fichierXML;
   var xhr_object = null;
 
   if(window.XMLHttpRequest) // Firefox
      xhr_object = new XMLHttpRequest();
   else if(window.ActiveXObject) // Internet Explorer
      xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
   else { // XMLHttpRequest non supporté par le navigateur
      alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
      return;
   }
 
   xhr_object.open("GET", fichierXML + "?" + new Date()*Math.random() , false);
   xhr_object.send(null);
//   if(xhr_object.readyState == 4) alert("Requête effectuée !");
   var docXml = xhr_object.responseXML;
   return docXml;
}
 
var docXml = loadXML("./xml/lb.kml");
alert(docXml.getElementsByTagName('Placemark').length);
seben est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2011, 17h51   #2
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 930
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 930
Points : 4 750
Points : 4 750
Bonjour,
essaies déjà cela

en local il te faut dans les Options Internet -> Avancés désactiver la prise en charge native de XMLHTTP.

L'autre solution est d'inverser la récupération de l'objet xhr_object
Code :
1
2
3
4
  if(window.ActiveXObject) // Internet Explorer
      xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
  else if(window.XMLHttpRequest) // Firefox
      xhr_object = new XMLHttpRequest();
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2011, 17h53   #3
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 802
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 13 802
Points : 35 807
Points : 35 807
Que te donne un
?
Sinon, ça peut venir de plusieurs choses, en particulier un fichier XML non conforme...
Par exemple, y a-t-il un prologue XML ?

D'autre part, même si ton code est simplifié, j'aurais quand même deux remarques :
*
Code :
1
2
function loadXML(_fichierXML){
   var fichierXML = _fichierXML;
Quel est l'intérêt de placer dans une variable le paramètre de la fonction ?

* DocXml est déclaré dans plusieurs fonctions dont le scope est manifestement partagé, c'est assez maladroit
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 16h45   #4
Invité régulier
 
Inscription : septembre 2005
Messages : 39
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 39
Points : 7
Points : 7
Tout d'abord, merci pour vos réponses.

Citation:
Envoyé par NoSmoking Voir le message
Bonjour,
essaies déjà cela

en local il te faut dans les Options Internet -> Avancés désactiver la prise en charge native de XMLHTTP.

L'autre solution est d'inverser la récupération de l'objet xhr_object
Code :
1
2
3
4
  if(window.ActiveXObject) // Internet Explorer
      xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
  else if(window.XMLHttpRequest) // Firefox
      xhr_object = new XMLHttpRequest();
J'ai déjà éssayé d'inverser mais le résultat reste identique.
seben est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 17h01   #5
Invité régulier
 
Inscription : septembre 2005
Messages : 39
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 39
Points : 7
Points : 7
Citation:
Envoyé par Bovino Voir le message
Que te donne un
?
Sinon, ça peut venir de plusieurs choses, en particulier un fichier XML non conforme...
Par exemple, y a-t-il un prologue XML ?

D'autre part, même si ton code est simplifié, j'aurais quand même deux remarques :
*
Code :
1
2
function loadXML(_fichierXML){
   var fichierXML = _fichierXML;
Quel est l'intérêt de placer dans une variable le paramètre de la fonction ?

* DocXml est déclaré dans plusieurs fonctions dont le scope est manifestement partagé, c'est assez maladroit
Si j'ajoute un alert(docXml), ie me revoie "[object]" alors que ff me renvoie "[object XMLDocument]".

Le fichier XML est un fichier standard crée par GoogleEarth. Je joins une partie du fichier.

Maintenant au niveau des remarques :
- je ne sais plus pourquoi les paramètres sont placés dans une variable, une habitude que j'ai prise.
- la variable docXml est utilisée deux fois, c'est parce que la fonction loadXML est normalement placée dans un fichier "carte.js". C'est seulement pour isoler mon problème, que je suis aller la rajouter à mon fichier test.html. Normalement, elle n'est pas visible (et toutes ses variables) depuis le fichier ou elle est utilisée.
Code :
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
 
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
<Document>
        <name>LB.kml</name>
        <open>1</open>
        <StyleMap id="msn_ylw-pushpin">
                <Pair>
                        <key>normal</key>
                        <styleUrl>#sn_ylw-pushpin1</styleUrl>
                </Pair>
                <Pair>
                        <key>highlight</key>
                        <styleUrl>#sh_ylw-pushpin0</styleUrl>
                </Pair>
        </StyleMap>
        <Style id="sh_ylw-pushpin0">
                <IconStyle>
                        <scale>1.3</scale>
                        <Icon>
                                <href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
                        </Icon>
                        <hotSpot x="20" y="2" xunits="pixels" yunits="pixels"/>
                </IconStyle>
        </Style>
        <Style id="sn_ylw-pushpin">
                <IconStyle>
                        <scale>1.1</scale>
                        <Icon>
                                <href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
                        </Icon>
                        <hotSpot x="20" y="2" xunits="pixels" yunits="pixels"/>
                </IconStyle>
        </Style>
        <Style id="sh_ylw-pushpin">
                <IconStyle>
                        <scale>1.3</scale>
                        <Icon>
                                <href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
                        </Icon>
                        <hotSpot x="20" y="2" xunits="pixels" yunits="pixels"/>
                </IconStyle>
        </Style>
        <StyleMap id="msn_ylw-pushpin0">
                <Pair>
                        <key>normal</key>
                        <styleUrl>#sn_ylw-pushpin</styleUrl>
                </Pair>
                <Pair>
                        <key>highlight</key>
                        <styleUrl>#sh_ylw-pushpin1</styleUrl>
                </Pair>
        </StyleMap>
        <Style id="sh_ylw-pushpin1">
                <IconStyle>
                        <scale>1.3</scale>
                        <Icon>
                                <href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
                        </Icon>
                        <hotSpot x="20" y="2" xunits="pixels" yunits="pixels"/>
                </IconStyle>
        </Style>
        <Style id="sn_ylw-pushpin0">
                <IconStyle>
                        <scale>1.1</scale>
                        <Icon>
                                <href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
                        </Icon>
                        <hotSpot x="20" y="2" xunits="pixels" yunits="pixels"/>
                </IconStyle>
        </Style>
        <Style id="sn_ylw-pushpin1">
                <IconStyle>
                        <scale>1.1</scale>
                        <Icon>
                                <href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
                        </Icon>
                        <hotSpot x="20" y="2" xunits="pixels" yunits="pixels"/>
                </IconStyle>
        </Style>
        <Folder>
                <name>LB</name>
                <Placemark>
                        <name>ATE</name>
                        <description>Arette (Pyrénées-Atlantique)</description>
                        <LookAt>
                                <longitude>-0.700300026625853</longitude>
                                <latitude>43.08580511979447</latitude>
                                <altitude>0</altitude>
                                <range>131462.6731382724</range>
                                <tilt>0</tilt>
                                <heading>2.762255765076517e-007</heading>
                                <altitudeMode>relativeToGround</altitudeMode>
                                <gx:altitudeMode>relativeToSeaFloor</gx:altitudeMode>
                        </LookAt>
                        <styleUrl>#msn_ylw-pushpin0</styleUrl>
                        <Point>
                                <coordinates>-0.7002999999999999,43.0858,0</coordinates>
                        </Point>
                </Placemark>
...
seben est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 17h31   #6
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 802
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 13 802
Points : 35 807
Points : 35 807
Essaye en remplaçant
Code :
var docXml = xhr_object.responseXML;
par
Code :
var docXml = xhr_object.responseXML.documentElement;
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 09h01   #7
Invité régulier
 
Inscription : septembre 2005
Messages : 39
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 39
Points : 7
Points : 7
Citation:
Envoyé par Bovino Voir le message
Essaye en remplaçant
Code :
var docXml = xhr_object.responseXML;
par
Code :
var docXml = xhr_object.responseXML.documentElement;
alert(docXml) me retourne "null" sous ie et un avertissement apparait :

"docXml a la valeur null ou n'est pas un objet"
seben est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 22h12   #8
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 930
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 930
Points : 4 750
Points : 4 750
Bonjour,
problème en local et/ou en ligne?

Une solution de remplacement, mettre la responseText dans une DIV, puis extraire les données via un getElementsByTagName('nom_tag')
Code :
1
2
3
var oRecup = document.getElementById('D_RECUP');
oRecup.innerHTML = oXhr.responseText;
var items = oRecup.getElementsByTagName('nom_tag');
Une autre solution est de parser la responseText
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function parseXMLString( txt){
  var xmlDoc = null;
  try{
    xmlDoc = new ActiveXObject( "Microsoft.XMLDOM");
    xmlDoc.async = "false";
    xmlDoc.loadXML( txt);
    return( xmlDoc);
  }
  catch(e){
    try{
      parser = new DOMParser();
      xmlDoc = parser.parseFromString( txt,"text/xml");
      return( xmlDoc);
    }
    catch(e){alert(e.message)}
  }
  return( null);
}
avec une utilisation du type
Code :
1
2
3
4
5
var oXml = parseXMLString( oXhr.responseText);
if( oXml){
  var items = oXml.getElementsByTagName('nom_tag');
  // le reste du code
}
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2011, 13h05   #9
Invité régulier
 
Inscription : septembre 2005
Messages : 39
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 39
Points : 7
Points : 7
Merci à tous,

En vous inspirant de vos conseils, j'ai enfin résolu mon problème : j'importe la page en format "text" au lieu de "xml" et je la converti en xml à l'aide d'une fonction récupérée sur le NET.

Voici l'ensemble de mon fichier test :

Code :
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
 
function loadXMLDoc(_fichierXML){
   var fichierXML = _fichierXML;
   var xhr_object = null;
 
   if(window.XMLHttpRequest) // Firefox
      xhr_object = new XMLHttpRequest();
   else if(window.ActiveXObject) // Internet Explorer
      xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
   else { // XMLHttpRequest non supporté par le navigateur
      alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
      return;
   }
 
   xhr_object.open("GET", fichierXML + "?" + new Date()*Math.random() , false);
   xhr_object.send(null);
//   if(xhr_object.readyState == 4) alert("Requête effectuée !");
//   var docXml = xhr_object.responseXML;
   var docXml = xhr_object.responseText;
//   alert(docXml);
   docXml = StringtoXML(docXml);
   return docXml;
}
 
function StringtoXML(text){
   if (window.ActiveXObject){
      var doc=new ActiveXObject('Microsoft.XMLDOM');
      doc.async='false';
      doc.loadXML(text);
   } else {
      var parser=new DOMParser();
      var doc=parser.parseFromString(text,'text/xml');
   }
   return doc;
} 
 
var docXml = loadXMLDoc("./xml/lb.kml");
alert(docXml.getElementsByTagName('Placemark').length);
seben est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h56.


 
 
 
 
Partenaires

Hébergement Web