J'utilise Firefox 3.6.10 et Firebug pour déboguer
Alors, voici mon code:
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", url,false);
xmlhttp.setRequestHeader('Content-Type', 'text/xml');
xmlhttp.send(null);
alert(xmlhttp.responseXML);
responseXML est toujours nul et je l'ai essayé sur plusieurs URL de différents domaines. J'ai également essayé de manière asynchrone, c'est le même résultat. Le responseText est toujours correctement renvoyé, ce qui ne pose aucun problème.
Mon objectif est d'obtenir le responseXML.documentElement .
Merci de votre aide.
MODIFIER-----------
Ce code javascript a été exécuté à partir d’un script utilisateur Greasemonkey; j’ai fait en sorte qu’il ait la même origine que l’URL demandée. De plus, j'ai essayé de m'exécuter à partir de la console firebug, assurant à nouveau la politique d'origine. Même erreur sur les deux.
Je dois détester le javascript.
Je parie que vous enfreignez la même politique d'origine.
Pour les XHR, vous devez avoir le même protocole, le même domaine, le même port, etc. Ainsi, si vous exécutez une application sur localhost: 8080/app, vous ne POUVEZ PAS accéder à www.cnn.com.
Différents navigateurs gèrent cela différemment. J'ai vu FF faire ce que vous décrivez, c'est-à-dire que la demande semble revenir normalement mais il n'y a pas de données ...
Outre les problèmes inter-domaines déjà mentionnés, responseXML
requiert un code XML complètement valide et probablement le Content-Type
correct dans les en-têtes de réponse envoyés à partir du serveur. Il est très peu probable que l'une ou l'autre de ces exigences soit satisfaite par le site Web moyen.
Pour ce dernier problème, vous pouvez utiliser
xmlhttp.overrideMimeType('application/xml');
avant d'envoyer la demande pour forcer l'interpolation de la réponse au format XML. Si la réponse n’est pas XML valide, vous n’obtiendrez que null
.
Si je me souviens bien, c’est un problème connu de firefox (j’ai eu le même problème auparavant).
Le correctif consiste à analyser le responseText dans un document XML, puis à l'utiliser.
Quelque chose comme ça :
var parser = new DOMParser();
var xmlDoc = parser.parseFromString(xmlhttp.responseText, "application/xml");
Essayez d’ouvrir la valeur de url
directement dans le navigateur. Vous devriez obtenir des informations d'erreur.
Si vous voyez une erreur d’analyse, il est probable que votre codage soit incorrect et que votre code XML contient un caractère spécial qui le rend invalide.
Pour éviter cela, vous devez vous assurer que toute la chaîne est correctement codée.
S'il s'agit d'un fichier XML statique, vous devez définir correctement le codage de votre éditeur lors de son enregistrement. Le codage qui fait tout (presque) est UTF-8, il s’agit généralement d’une propriété que vous pouvez choisir dans les paramètres de votre éditeur ou dans la boîte de dialogue de sauvegarde.
S'il est généré dynamiquement. Vos données, la page et la réponse du serveur doivent également être correctement codées. Et votre XML commençant par <?xml version="1.0" encoding="UTF-8"?>
Vous pouvez d’abord essayer avec un XML très basique et statique:
<?xml version="1.0" encoding="UTF-8"?><root>hi</root>
Et puis ajoutez les étapes, une par une pour la faire ressembler à la vôtre, sans la casser.
J'ai été batifoler avec ça pendant des heures et j'ai finalement compris la stupide petite erreur qui me dérangeait ...
Si vous êtes comme moi, vous aimez conserver votre code JavaScript dans un fichier ".js" externe.
Par conséquent, utiliser xmlhttp.open ("GET", "yourxmlfile.xml", false) recherchera toujours le fichier XML RELATIF au document HTML, même si le code est dans un fichier JavaScript externe.
Si le responseText renvoie la valeur null, le fichier local est introuvable dans l'emplacement du chemin spécifié. Et si async est défini sur true, le fichier sera créé et le texte de la réponse contiendra le contenu d'un document XML vide. .
Exemple:
xmlDoc = xmlhttp.responseText; // type de données chaîne
or
xmlDoc = xmlhttp.responseXML; // type de données XML
Et n'oubliez pas d'analyser le document XML dans "text/xml", après ouverture et avant l'envoi de la demande.
Exemple:
Pour moi, c'était un problème simple. Il y avait une erreur de syntaxe dans mon fichier xml/php. Lorsque j'ai visualisé le fichier dans mon navigateur, celui-ci n'a détecté aucune erreur.
Assurez-vous que les éléments de votre document XML sont correctement fermés!
J'ai eu du mal à trouver un exemple xml correct. Si vous obtenez null, essayez un validateur XML. Pour moi, l'élément <root>
était manquant.
<root>
<info><p>Array
(
)
</p>
</info>
<itemData>{"id":"40","client_id":"1","nameUnique":"Lore ipsum","description":null,"userComment":null,"last_modified":"2018-12-15 02:48:57"} </itemData>
</root>
Malformed XML de toute sorte causera ce problème. Par exemple, j'avais un attribut renderer
(sans ="something"
) qui n'est pas valide et qui provoque DOMParser
- qui est appelé par XMLHTTPRequest
- pour étrangler. Par conséquent, l'événement load
contiendra la réponse textuelle, mais pas le XML.