Lecture flux XML en javascript: xxx has no properties

:hello:

Je viens demander un peu d’aide, je ne m’en sors plus et à force de trop de réflexion, je finis par faire n’importe quoi.
Après une requête asynchrone, j’essais de lire un résultat dans un script Javascript. Ce résultat sort sous forme XML.

Voici ma fonction:


function readResponse()
{
	var response = xmlHttp.responseXml;
	xmlRoot = response.documentElement;
}

Pour le moment, elle s’arrête là tout simplement parce qu’elle plante là lorsque je l’appelle.

Voici la réponse qu’elle est censée lire (renvoyée par un script PHP):


(... traitements divers et variés)

			$error = 5;
			$return  = '<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>';
			$return .= '<response>';
			$return .= '<code>'.$error;
			$return .= '</code>';
			$return .= '<id>'.$readLogin[0];
			$return .= '</id>';
			$return .= '<passwd>'.$readLogin[1];
			$return .= '</passwd>';
			$return .= '<email>'.$readLogin[2];
			$return .= '</email>';
			$return .= '</response>';
			return $return;

Quand je lance le script seul (et que je fais un echo à la place du return) je vois bien ma structure XML.

Le code retour erreur que j’ai (en javascript) est le suivant:

" response has no properties "

Voilà, j’ai cherché un peu sur le net, mais je n’ai rien trouvé pour mon cas.

J’ai tenté en mettant un header(‘Content-type: text/xml’) en début du script PHP,mais c’est peine perdue… :frowning:
De toute façon, ce script est appelé via ma requête asynchrone au sein d’une page qui a déjà ses headers de définis, dont celui de Content-type en html, donc ça ne marchera pas de toute façon.

Voili voilou, en vous remerciant de l’aide que vous pourrez m’apporter.
Edité le 25/02/2008 à 11:47

heu… quand tu fais une requête asynchrone, ça revient exactement au même que mettons cliquer sur un lien : ça renverra des entêtes et tout ça…

Certes oui, mais n’empêche, j’ai tenté le header(‘Content-type: text/xml’) en tout début de script, mais l’erreur est toujours la même:

" response has no properties "

Faut-il que je mette la déclaration d’entête juste avant la déclaration de ma structure XML ? Je n’ai pas encore essayé (je n’ai pas les outils nécessaires pour tester chez moi). J’essaierais cela dès Lundi. mais je ne suis pas sur que ça vienne de là. J’ai donc ouvert le topic en avance de phase pour avoir d’autres pistes :stuck_out_tongue:

application/xml plutôt je dirais.

Sinon c’est pas parce que le X de AJAX veut dire XML que tu es limité qu’au simple XML; tu peux envoyer du javascript, du html, du JSON et toute sorte de connerie.

JSON est tout indiqué puisque le framework prototype permet de récupérer du JSON sous forme Javascript (beaucoup plus pratique que le XML pour le coup, entre nous)

En fait, l’idée dans mon cas est assez simple. J’ai besoin de récupérer plusieurs données. Je ne peux évidement pas passer par un responseText à moins de faire mon propre parser derrière pour décortiquer les données à récupérer. Mais ça va m’alourdir considérablement le javascript :expressionless:

Après, dans les bouquins que j’ai lu, les deux expliquent la méthode de récupération via XML ou chaine de caractères.
Mais pas de trace de JSON ou de html ou de javascript.

Aurais-tu un court exemple à me montrer avec JSON ou récupération en javascript ?

en posant les bases suivantes pour faire simple: mon script php doit renvoyer deux paramètres (a=‘toto’ et b=‘2008’ par exemple).

www.prototypejs.org…
www.json.org…

Ensuite, ça le fait pour toi tout seul comme un grand.

Plus simple que XML car tu récupères les objets directement en Js sans passer par DOM (un brin plus lourd, même si potable)

Woaww ! quel courage pour écrire tout ça !

Je testerais ça lundi. J’ai pas tout à fait saisi le fonctionnement du truc pour la récupération des données. Je vais étudier ça

okay, bon voilà quelques bonnes pratiques:

Du côté “back end” (server-side) ton script php:

tu peux valider l’intégrité du contenu XML en utilisant la classe DOMDocument, comme ça, tu t’assures que ton output est ok.

Ex:

<?php
$doc = new DOMDocument();
$text = "<rubrique>
	<titre>
		Accueil
	</titre>
	<aide>
		Vous voici sur la page d'accueil, 
		vous pouvez naviguer dans le menu contextuel.
	</aide>
	<suite>
	</suite>
</rubrique>";

header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date du passé
header('Content-Type: text/xml; charset="UTF-8" encoding="UTF-8"');
echo $doc->saveXML();
?>

Du côté client, ça devra ressemblé à ça:

//Quand on success:

if(_xmlHttp.status == 200)
{
	//  assigner le fichier XML à une variable					
	if (window.ActiveXObject)//IE
	{
		doc = new ActiveXObject("Microsoft.XMLDOM");
		doc.async="false";
		doc.loadXML(_xmlHttp.responseText);
	}else//mozilla, opera et Cie
	{
		doc = _xmlHttp.responseXML; 
	}
	fetch(doc);
}
//exemple de traitement avec le document XML retourné
function fetch(doc)
{
	var courant = doc.getElementsByTagName("rubrique")[0];
	var helpzone = document.getElementById("texteAide");
	var helpZoneTitre = document.getElementById("titreAide");	
	helpZoneTitre.innerHTML = courant.getElementsByTagName("titre")[0].firstChild.data;
	helpzone.innerHTML = courant.getElementsByTagName("aide")[0].firstChild.data;
}

Voilà, en espoire que ça aide :slight_smile:

ARFFF… grosse frustration :sweet:

Il y a bien sur les erreurs que j’ai faite, à savoir l’oubli du header pour déclarer le Content-type qui arrive (il s’agit bien de text/xml, non de application/xml) et que aussi l’on retourne la variable non pas avec un return, mais avec un echo. Une fois réparé, ça ne fonctionnait toujours pas, toujours ce xxx has no properties.

Finalement, la lecture de mon flux XML plantait à cause de ça:


Pas bien:
var response = xmlHttp.responseXml;

Bien:
var response = xmlHttp.responseXML;

Cela dit je jetterais quand même un œil à JSON, ça a l’air bien plus pratique :slight_smile:

Ah ah :slight_smile:

Pas étonnant;

Oui JSON est plus pratique car tu ne passes pas/plus par une (sur)couche DOM/XML mais uniquement du JS. Le seul souci c’est que cela peut être un peu plus long que le XML (différence entre parsing JSON en JS, et parsing XML en natif)

Tu peux aussi regarder du coté GWT (google web toolkit), qui te permet de coder en php/java ton application en entier, et il compile en javascript et sérialise les classes destinées clientSide pour toi.

C’est exactement comme si tu codais en Swing.

la version 1.4 en java est compatible java 1.4, et la 1.5 arrive bientôt avec le support du 1.5 et les annotations.

Une implémentation javascript + quirk mode est faite pour chaque browser, alors la couche javascript/dom/xml, tu ne la vois carrément pas. Du moin, pas vant que tu touches au css.
Edité le 27/02/2008 à 01:32

Sauf qu’il est en PHP… Et GWT = Java comme tu le soulignes.

En fait, j’ai souligné le contraire:

En fait, pour ma part je travail en java, mais la librairie GWTPHP est aussi disponible, donc pas de problème de ce coté.

Par contre, j’ajoute une bémole: je ne sais pas si GWTPHP comprend les classe d’interface (j’en doute).

Mais bon, les objets coté back end sont définitivements bien restitué coté client, que ce soit java ou php.

Au temps pour moi. C’est bon à savoir ça.