11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

voilà, je vous expose mon problème. Avec une requête XmlHttpRequest, je cherche à récupérer un fichier xml genre :
fichier.xml

<?xml version="1.0" standalone="yes" ?>
<racine>
	<machins>
		<machin>truc</machin>
		<machin>chouette</machin>
	</machins>
</racine>

donc dans mon code JavaScript je mets :

xhr = new ActiveXObject("Microsoft.XMLHTTP");
xhr.onreadystatechange = processAction;
xhr.open("GET", "fichier.xml", true);
xhr.send(null);

Le code de processAction est le suivant :

function processAction() {
	if (xhr.readyState == 4) {
		if (xhr.status == 200 || xhr.status == 0) {
			treatAction(xhr.responseXML);
		}
	}
}

et enfin, le code de treatAction pour tester le contenu de xhr.responseXML:

function treatAction(responseXML) {
	alert(responseXML.childNodes.length);
}

Donc quand je lance ça, ça m'affiche "0" alors que ça ne devrait pas puisque le fichier XML a une racine. Si j'adapte le tout à la sauce Firefox avec un "xhr = new XMLHttpRequest()", ça fonctionne impeccablement bien.
Ainsi, à priori, sous Internet Explorer xhr.responseXML est totalement vide alors que sous Firefox ça fonctionne... Cependant, sous Firefox il faut rajouter un petit bout de code pour dire que la réponse est un document xml :

xhr.overrideMimeType("text/xml");

Donc je n'arrive pas à récupérer mon fichier xml en retour et ça m'énerve. J'ai eu beau regarder sur le net, mais je n'ai pas trouvé de solution. Une serait de récupérer de xhr.responseText (il fonctionne lui par contre sous IE, il n'est pas vide et contient bien tout le fichier xml Smiley bawling ) et de créer un document DOM avec mais je ne sais pas trop comment faire.

Je vous remercie de votre aide.

Cordialement,
Flavien
Modifié par Flavien (28 Apr 2006 - 13:27)
Bonjour,

Je pense qu'il faut que ton fichier XML soit servi en "text/xml", ce qui ne doit pas être fait par ton serveur.
Lanza a écrit :
Bonjour,

Je pense qu'il faut que ton fichier XML soit servi en "text/xml", ce qui ne doit pas être fait par ton serveur.

Qu'entends-tu par "servi" ?
Parce que mon dans mon fichier xml, en entête, il y a bien:

<?xml version="1.0" ... ?>

Sauf que je n'arrive à écraser le type Mime dans l'entête de la réponse qu'avec Firefox (overrideMimeType). Avec Internet Explorer je n'y arrive pas...
Flavien a écrit :

Qu'entends-tu par "servi" ?
Parce que mon dans mon fichier xml, en entête, il y a bien:

<?xml version="1.0" ... ?>

Sauf que je n'arrive à écraser le type Mime dans l'entête de la réponse qu'avec Firefox (overrideMimeType). Avec Internet Explorer je n'y arrive pas...


Bon, à priori j'ai résolu le problème en faisant comme ça :

if (window.XMLHttpRequest) {
	docXML = request.responseXML;
} else if (window.ActiveXObject) {
	docXML = new ActiveXObject("Microsoft.XMLDOM");
	docXML.loadXML(request.responseText);
}

Merci pour votre aide.

A bientôt,
Flavien
Modifié par Flavien (28 Apr 2006 - 17:01)
Flavien a écrit :


Bon, à priori j'ai résolu le problème en faisant comme ça :

if (window.XMLHttpRequest) {
	docXML = request.responseXML;
} else if (window.ActiveXObject) {
	docXML = new ActiveXObject("Microsoft.XMLDOM");
	docXML.loadXML(request.responseText);
}

Merci pour votre aide.

A bientôt,
Flavien

J'ai même trouvé autre chose ce week-end, mais il faut que le serveur qui héberge la page supporte le php.
Au début de la page PHP, mettre ce bout de code :
header('Content-type: text/xml'); 

Après, plus de problème avec le request.responseXML sous Internet Explorer !!!!! (normalement) Donc le code que j'ai écrit précédemment n'est plus du tout utile. Smiley cligne

Bonne journée,
Flavien
Modifié par Flavien (29 May 2006 - 09:24)
Il semblerait que cette solution ne fonctionne pas toujours ( problème d'encoding, caractères accentués, ... )

Une autre solution (assez peu élégante) consiste a créer une balise fictive dans laquelle on charge le document xml.


// on crée un noeud fictif dans la page web
var tmp = document.createElement ( "div" );
// on insère le résultat de la requête au format texte
tmp.innerHTML = request.responseText;
// reste plus qu'à récupérer le contenu parsé
var tree = tmp.firstChild;


P.S.: je viens de me rappeler que j'ai toujours testé cette solution avec un document HTML et non XML...