Partage
  • Partager sur Facebook
  • Partager sur Twitter

[AJAX] Impossible de lire le fichier XML

Sujet résolu
    6 octobre 2009 à 13:40:37

    Salut. Je voudrais réaliser un dictionnaire avec AJAX mais lorsque j'essaie de récupérer le contenu du fichier XML, rien ne se passe.
    dico.htm
    <script type="text/javascript" src="getxhr.js"></script>
    <script type="text/javascript">
    function request() {
    	var xhr = getXMLHttpRequest();
    	if (xhr == null)
    		alert("Votre navigateur ne supporte pas l'objet XMLHTTP !");
    	else
    	{
    		xhr.onreadystatechange = function() {
    			if (xhr.readyState == 4) {
    				if (xhr.status == 200 || xhr.status == 0) {
    					var xmlDoc = xhr.responseXML;
    					alert("OK");
    					alert(xmlDoc.getElementsByTagName("mot")[0].firstChild.nodeValue); //Problème à ce niveau
    				}
    				else
    					alert("Problème lors de la réception des données !");
    			}
    		};
    		xhr.open("GET", "dico.xml", true);
    		xhr.send(null);
    	}
    }
    </script>
    

    Le "OK" s'affiche mais dès que j'essaie d'afficher le contenu du fichier XML, rien ne se passe (testé sous firefox et IE).
    dico.xml
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <dictionnaire>
    	<terme>
    		<mot>Amorce</mot>
    		<definition>Programme généralement stocké en mémoire morte et destiné à assurer le démarrage d'un ordinateur.</definition>
    	</terme>
    	<terme>
    		<mot>API</mot>
    		<definition>(Application Programming Interface) Interface de programmation. C'est un ensemble de fonctions, procédures, ou classes mises à disposition des programmes informatiques par une bibliothèque logicielle, un système d'exploitation ou un service.</definition>
    	</terme>
    	<terme>
    		<mot>Application</mot>
    		<definition>Programme ou ensemble de programmes destiné à aider l'utilisateur d'un ordinateur pour le traitement d'une tâche précise.</definition>
    	</terme>
    </dictionnaire>
    
    • Partager sur Facebook
    • Partager sur Twitter
      6 octobre 2009 à 13:51:08

      alert(xmlDoc.getElementsByTagName("mot")[0].firstChild.nodeValue);
      donc... vire le "firstchild" et ça devrait t'afficher "amorce"... ;)
      gebtn("mot") te récupère le noeud "mot" pas besoin de prendre son premier enfant, il en a pas :-°
      • Partager sur Facebook
      • Partager sur Twitter
        6 octobre 2009 à 14:15:28

        Apparemment tu ne maîtrises pas le DOM. Désolé, tout ce que tu dis est faux.
        Et concernant cette ligne de code:
        if (xhr.status == 200 || xhr.status == 0)
        
        Je me demande si ce n'est pas plutôt
        if (xhr.status == 200)
        

        car j'ai vu un code de ce genre sur le site du w3.
        • Partager sur Facebook
        • Partager sur Twitter
          6 octobre 2009 à 14:20:50

          :o
          Bon, le DOM, parlons-en.
          Prenons ta ligne de code : alert(xmlDoc.getElementsByTagName("mot")[0].firstChild.nodeValue);
          xmlDoc, c'est l'équivalent de ton document.
          getElementsByTagName("mot") te récupère tous les noeud "mot" de ton document.
          [0] choisit le premier noeud "mot".
          firstChild prend l'enfant du premier noeud mot... y en a pas, si ?
          nodeValue, d'accord, récupère le texte du noeud mot...
          Si tu vires "firstChild", tu auras le texte de ton mot, je me trompe ?
          • Partager sur Facebook
          • Partager sur Twitter
            6 octobre 2009 à 14:28:40

            Non. Le premier enfant et le seul du premier nœud "mot" est un textNode et c'est "Programme généralement..."

            Citation : w3schools.com

            A common error in DOM processing is to expect an element node to contain text.

            However, the text of an element node is stored in a text node.

            In this example: <year>2005</year>, the element node <year>, holds a text node with the value "2005".

            "2005" is not the value of the <year> element!

            • Partager sur Facebook
            • Partager sur Twitter
              6 octobre 2009 à 15:03:02

              Ah en effet... j'utilise plutôt getChildText en général...
              Mais dans ton cas, ça devrait afficher "Amorce" et non, "Programme généralement..."
              Puisqu'on prend le noeud mot.
              Sinon, si tu alert simplement xmlDoc, ça affiche quoi ?

              • Partager sur Facebook
              • Partager sur Twitter
                6 octobre 2009 à 15:07:28

                alert(xhr.responseText);
                alert(xmlDoc.getElementsByTagName("mot").length);
                alert(xmlDoc.getElementsByTagName("mot")[0].nodeName);
                alert(xmlDoc.getElementsByTagName("mot")[0].firstChild.nodeName);
                alert(xmlDoc.getElementsByTagName("mot")[0].firstChild.nodeValue);
                
                • Partager sur Facebook
                • Partager sur Twitter
                  6 octobre 2009 à 15:24:56

                  @Tiller J'ai tout essayé; rien ne s'affiche. J'ai l'impression que l'erreur n'est pas au niveau du code. Quand xhr.status == 0, ça veut dire quoi?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    6 octobre 2009 à 15:28:10

                    Que la requête s'est terminée correctement.
                    le "OK" s'affiche ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      6 octobre 2009 à 15:32:33

                      oui le "OK" s'affiche et le xhr.status est égal à 0.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        6 octobre 2009 à 15:38:28

                        Le 0 est bon. Y a pas une erreur dans la console d'erreurs ? (Outils > console d'erreurs dans FF, clic sur le ! jaune en bas à gauche sur IE)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          6 octobre 2009 à 15:44:27

                          Euh attends, OK s'affiche, mais pas alert(xhr.responseText); ?

                          Impossible

                          Ou alors c'est le coup classique de l'appel de la fonction dans une balise <a> sans return false ?
                          • Partager sur Facebook
                          • Partager sur Twitter
                            6 octobre 2009 à 16:30:24

                            alert(xmlDoc); affiche null.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              6 octobre 2009 à 17:24:08

                              Mais, alert(xhr.responseText); ?
                              • Partager sur Facebook
                              • Partager sur Twitter
                                6 octobre 2009 à 17:39:31

                                Je traite un fichier XML. Regarde mon code.
                                var xmlDoc = xhr.responseXML;
                                
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  6 octobre 2009 à 17:40:12

                                  Je sais, mais fait le quand même !
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    6 octobre 2009 à 17:43:20

                                    ça affiche une chaîne vide
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      6 octobre 2009 à 17:44:13

                                      Bah voila ton problème.

                                      Le fichier xml qu'il essaie de lire est vide.
                                      Soit tu n'as pas mis la bonne url, soit ton cache merde.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        6 octobre 2009 à 17:55:52

                                        Si mon cache merde, qu'est-ce que je dois faire?
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          6 octobre 2009 à 18:52:39

                                          le plus facile c'est de faire:

                                          xhr.open("GET", "dico.xml?" + Math.random(), true);
                                          
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            6 octobre 2009 à 19:10:58

                                            ça ne marche toujours pas et c'est pire car le numero du statut est différent de 200 et de 0
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              6 octobre 2009 à 19:22:16

                                              Si tu tapes dans la barre d'adresse tonsite/dico.xml t'as quelque chose.... ?
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                6 octobre 2009 à 20:18:46

                                                Oui. J'ai essayé d'exécuter un script que j'ai pris sur le net et qui a les mêmes caractéristiques et ça passe sans problème. Les différences entre ce script et le mien c'est qu'aucun code javascript n'est inclus directement dans le fichier HTML. L'inclusion se fait par
                                                <script type="text/javascript" src=""></script>
                                                
                                                et au lieu d'un bouton, c'est quand on clique sur un lien que la fonction qui envoie la requête est appelée.
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  6 octobre 2009 à 20:34:25

                                                  Citation : Tiller

                                                  Euh attends, OK s'affiche, mais pas alert(xhr.responseText); ?

                                                  Impossible

                                                  Ou alors c'est le coup classique de l'appel de la fonction dans une balise <a> sans return false ?



                                                  --'
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    7 octobre 2009 à 12:41:03

                                                    Mon problème est résolu avec Firefox. Je crois que le problème était dû à la présence de la balise "form" dans le fichier HTML. Mais avec IE 6, lorsque j'exécute ce code
                                                    var xmlDoc = xhr.responseXML;
                                                    var xmlMot = xmlDoc.getElementsByTagName('mot');
                                                    alert(xmlMot.length);
                                                    

                                                    ça me retourne 0.
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      7 octobre 2009 à 12:42:33

                                                      Et si tu fais un alert(xhr.responseText) sous IE?

                                                      /me anticipe :
                                                      Le contenu est vide. Pourquoi ? Car le cache d'IE !
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        7 octobre 2009 à 12:52:44

                                                        et pour lutter contre le cache :-°

                                                        Citation : Tiller

                                                        le plus facile c'est de faire:

                                                        xhr.open("GET", "dico.xml?" + Math.random(), true);
                                                        
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          7 octobre 2009 à 13:21:38

                                                          Citation : Tiller

                                                          Et si tu fais un alert(xhr.responseText) sous IE?


                                                          Le fichier XML s'affiche bien
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            7 octobre 2009 à 14:21:13

                                                            Ah.. IE6 n'aime pas getElementsByTagName ? Oo Bizarre <_<
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              7 octobre 2009 à 14:26:40

                                                              C'est xhr.responseXML qu'il n'a pas l'air d'aimer... non ?
                                                              Si tu l'alert, il te donne quoi ?
                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              [AJAX] Impossible de lire le fichier XML

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown