IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AJAX Discussion :

[AJAX] responseXML est null responseText contient bien mon xml


Sujet :

AJAX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 19
    Par défaut [AJAX] responseXML est null responseText contient bien mon xml
    Bonjour,

    Mon problème est simple mais je ne parviens pas a le résoudre. J'utilise AJAX pour récupérer un fichier xml (qui contient des informations pour cocher ou décocher des checkbox dans ma page html). Ce fichier est généré par un script php (dans lequel je précise bien le header a text/xml, j'ai aussi testé application/xml mais pas mieux) puis est envoyé au client.

    Firebug m'a permis de verifier l'intégrité des données reçues (pas d'espaces, sauts de lignes ou tabulation entre mes balises) mais dés que j'utilise responseXML, firebug me dit que cet element est null, et aucune modification de ma page n'est prise en compte.

    Je jois ici le xml renvoyé par le serveur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?xml version="1.0" encoding="utf-8"?><response><prod id="199" lie="true" /><prod id="29" lie="true"
     /><prod id="53" lie="true" /><prod id="54" lie="true" /><prod id="55" lie="true" /><prod id="56" lie
    ="true" /><prod id="58" lie="true" /><prod id="61" lie="true" /><prod id="76" lie="true" /><prod id="77"
     lie="true" /></response>
    et les fonctions javascript:

    -> la première, celle qui fait appel a Ajax (je ne pense pas que l'erreur vienne de la mais on ne sait jamais, la fonction getXhr() renvoie juste un objet xmlHttpRequest en fonction du navigateur.)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    /*
     * cette fonction permet de valider la liaison entre un produit et un autre en direct.
     */
    function valid(idSource, idCible)
    {
    	// on definit l'objet qui servira a utiliser ajax.
    	var xhr = getXhr();
    	// on definit comment et ou seront envoyées les données.
    	xhr.open("POST","<?php echo(DIR_WS_ADMIN.'ajax.php');?>",true);
    	// on détermine le header.
    	xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    	xhr.onreadystatechange = function(){
    			traitementReponse(xhr);
    		};
    	// on envoie la requête asynchrone vers le serveur.
    	if(document.getElementById('all').checked == false)
    	{
    		xhr.send("fonction=validLinkedProduct&id="+idSource+"&cible="+idCible);
    	}
    	else
    	{
    		xhr.send("fonction=validLinkedProduct&id="+idSource+"&cible="+idCible+"&all=true");
    	}
     
    }
    -> la seconde est la fonction qui traite la réponse.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    /*
     * cette fonction traite la réponse du serveur lors de l'appel ajax pour les checkboxs
     * la forme du doc xml renvoyé doit être la suivante:
     *	< ? xml version="1.0" ? >
     * 	<response>
     *		<prod id="..." lie="true|false"/>
     *		...
     *	</reponse>
     */
    function traitementReponse(xhr)
    {
    	var docXML= xhr.responseXML.childNode[0];
    	// pour chaque elements trouvé, on le coche (ou decoche) selon le besoin.
    	for (var i=0;i<docXML.childNodes.length;i++)
    	{
    		var chk = 'checked';
    		if(docXML.childNodes[i].lie == false)
    		{
    			chk = 'false';
    		}
    		document.getElementById(docXML.childNodes[i].id).checked = chk;
    	}
    }
    J'ai tenté d'afficher docXML.childNodes.length et il me renvoie le bon nombre mais dés que je veux l'utiliser, il me dit que l'objet est null.

    Petite précision tout de même, en cherchant a aller plus loint avec firebug, j'ai trouvé une indication me disant qu'une erreur s'est produite lors du parsing du xml.

    Si quelqu'un a une idée, elle est la bienvenue.

    Cordialement.

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Salut,

    Tu devrais plutôt essayer avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var docXML= xhr.responseXML.documentElement;
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, 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
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 19
    Par défaut
    Bonjour,

    tout d'abord, merci d'avoir pris le temps de répondre.

    J'ai tenté de modifié le "childNode[0]" par "documentElement" (j'ai cru comprendre que documentElement me renvoyais le nœud racine de mon arbre xml d'après ce que j'ai pu lire) mais le problème persiste.

    Je me demandais si il pouvais y avoir de caractères parasites en tout début de fichier. (cela peut empécher de repérer qu'il s'agit d'un fichier xml peut-être?) mais je n'ai pas encore trouvé comment le vérifier. A part cela, je ne vois pas trop ce qui peut poser problème.

    Si je trouve, je posterais (ou éditerais si il n'y a pas eu d'autres messages) pour donner des nouvelles.

    -- Edit --

    en regardant le contenu de responseText (dans firebug), il me met ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "\r\n<?xml version="1.0" encoding="utf-8"?><response><prod id="53" lie="true" /><prod id="29" lie="true" /><prod id="54" lie="true" /><prod id="55" lie="true" /><prod id="56" lie="true" /><prod id="58" lie="true" /><prod id="61" lie="true" /></response>"
    (le xml est un peu écourté mais il n'y a que des noeuds prod qui ont la même structure) les deux caractères \r et \n sont-ils rajouté dans le responseText ou sont ils envoyés par le serveur a votre avis?

    cordialement.

  4. #4
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par illeriane Voir le message
    J'ai tenté de modifié le "childNode[0]" par "documentElement" (j'ai cru comprendre que documentElement me renvoyais le nœud racine de mon arbre xml d'après ce que j'ai pu lire).
    Oui, c'est bien ça

    Je me demandais si il pouvais y avoir de caractères parasites en tout début de fichier. (cela peut empécher de repérer qu'il s'agit d'un fichier xml peut-être?) mais je n'ai pas encore trouvé comment le vérifier.
    Oui, c'est tout à fait possible, cela dépend de la façon dont ton XML est créé ou encodé.

    Peut-être devrais-tu plutôt passer par une méthode du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var docXML= xhr.responseXML.getElementsByTagName('prod');
    	// pour chaque elements trouvé, on le coche (ou decoche) selon le besoin.
    for (var i=0;i<docXML.length;i++){
    	var chk = 'checked';
    	if(docXML[i].lie == false)
    	{
    		chk = 'false';
    	}
    	document.getElementById(docXML[i].id).checked = chk;
    }
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, 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
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 19
    Par défaut
    En fait, je n'ai pas pensé a le dire dans mon premier poste mais c'est comme cela que j'ai commencé. Puisque j'obtenais une erreur, j'ai essayé d'autres façons de faire.

    Pour ce qui concerne les caractères parasites, je vais essayer un script php sans rien d'autre que le header et la des echo pour le retour (si je ne ferme pas le parseur php, je suis sur de ne pas oublier un espace quelque part).

    -- Edit --
    J'ai trouvé l'origine des caractères parasites (un saut de ligne impromptu avant le "<?php" de mon script ... )

    J'ai toujours un élément null mais dans firebug, il semble que le responseXML soit complet et correcte. Je vais donc regarder au niveau de la syntaxe (réessayer les différentes syntaxes proposées par exemple ...). J'indiquerais par la suite si cela résout le problème.

    Merci de ton aide.

    -- Edit --
    Bon, le problème est encore différent de ce que je pensais. L'objet xmlHttpRequest (xhr dans mon code) contient bien un responseXML valide contenant tout ce que je veux. Problème, dans ma fonction appelée, j'ai le message d'erreur "responseXML is null" ... pourtant il n'est pas null dans l'objet! C'est comme si le xhr de la fonction "valid" était différent du xhr de la fonction "traitementReponse" (pourtant les objets sont passés par références...) donc je sèche ...

    -- Last Edit --
    Cette fois, le problème est résolu.
    Pour que ceux qui ont le même problème que moi comprennent bien comment j'ai fais, je vais expliquer mes modification.

    1) il faut absolument rajouter la condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(xhr.readyState == 4){ code a executer }
    dans la fonction que l'on place dans le onReadyStateChange. (c'est a ce moment que j'ai réussi a obtenir un xhr.responseXML non null!)

    2) je pense (mais c'est un avis très personnel) que l'utilisation des fonctions de dom (getAttributes('monAttribut') par exemple) est sur. C'est cela qui m'a permis de récupérer effectivement mes attributs.

    Merci encore pour ton aide.

    Cordialement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. mon serveur ajax envoie du null a la place du xml
    Par dachir dans le forum ASP.NET
    Réponses: 2
    Dernier message: 19/03/2008, 19h22
  2. [AJAX] mon serveur ajax envoie du null a la place du xml
    Par dachir dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 19/03/2008, 17h14
  3. Réponses: 8
    Dernier message: 17/07/2007, 11h33
  4. [AJAX] responseXml == null
    Par Gryon dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/04/2007, 11h34
  5. [AJAX] propriété responseXml est null
    Par oFlex dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 11/03/2007, 09h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo