XmlHTTPRequest: "XML Parsing Error: aucun élément trouvé"

Donc j'utilise PHP + MySQL pour fournir des contenus de base de données en XML à un JavaScript.

$xml = "<?xml version='1.0' encoding='utf-8'?><confessions><pending>"; $pending = $m->MySqlHandler->Query("SELECT id, gender, age, confession, date_posted FROM confessions WHERE publish = 0"); foreach ($pending->Rows as $pr) { list($id, $gender, $age, $confession, $dateposted) = array( $pr->Columns["id"]->Value, $pr->Columns["gender"]->Value, $pr->Columns["age"]->Value, $pr->Columns["confession"]->Value, $pr->Columns["date_posted"]->Value ); $xml .= "<confession id='$id' gender='$gender' age='$age' dateposted='$dateposted'>$confession</confession>"; } 

$ Xml. = "</ Pending>"; $ Xml. = "<Active>";

$ Active = $ m-> MySqlHandler-> Query ("SELECT DISTINCT confessions. *, (SELECT COUNT (*) FROM comments WHERE confession_id = confessions.id) AS comments, (SELECT COUNT (*) FROM phrases WHERE confession_id = confessions. Id) AS phrases FROM confessions WHERE confessions.publish = 1 ");

Foreach ($ actif-> Ligne en tant que $ ar) {list ($ id, $ gender, $ age, $ confession, $ dateposted, $ absolutions) = array ($ ar-> Columns ["id"] -> Valeur, $ Ar-> Colonnes ["genre"] -> Valeur, $ ar-> Colonnes ["age"] -> Valeur, $ ar-> Colonnes ["confession"] -> Valeur, $ ar-> Colonnes ["dateposted" ] -> Valeur, $ ar-> Colonnes ["absolutions"] -> Valeur); $ Sql_template = "SELECT COUNT (*) FROM phrases WHERE confession_id = $ id ET degree = '% s'"; $ Sentence_data = array ("t" => mysql_result (mysql_query (sprintf ($ sql_template, "t")), 0, 0), "c" => mysql_result (mysql_query (sprintf ($ sql_template, "c")) 0, 0), "p" => mysql_result (mysql_query (sprintf ($ sql_template, "p")), 0, 0), "l" => mysql_result (mysql_query (sprintf ($ sql_template, "l")) 0, 0)); $ Xml. = "<Confession absolutions = '$ absolutions' t = '{$ sentence_data [' t ']}'". "C = '{$ phrase_data [' c ']}' p = '{$ sentence_data [' p ']}'". "L = '{$ phrase_data [' l ']}' id = '$ id' genre = '$ gender'". "Age = '$ age'> $ confession </ confession>"; }

$ Xml. = ""; En-tête ("Content-Type: application / xml"); Echo $ xml;

Donc, à partir de là, vous obtenez un résultat tel que …

 <?xml version='1.0' encoding='utf-8'?> <confessions> <pending> <confession id="1" gender="m" age="20" dateposted="2010-02-06 05:22:57"> Confesando. </confession> </pending> <active> <confession absolutions="0" t="0" c="0" p="0" l="0" id="2" gender="m" age="18"> Confesion. </confession> </active> </confessions> 

<?xml version='1.0' encoding='utf-8'?> <confessions> <pending> <confession id="1" gender="m" age="20" dateposted="2010-02-06 05:22:57"> Confesando. </confession> </pending> <active> <confession absolutions="0" t="0" c="0" p="0" l="0" id="2" gender="m" age="18"> Confesion. </confession> </active> </confessions>

Je charge le XML avec JavaScript en utilisant:

 function sendData(params, to, oncomplete) { if (typeof oncomplete == 'undefined') { oncomplete = function() {}; } if (typeof window.ActiveXObject != 'undefined' ) { http = new ActiveXObject("Microsoft.XMLHTTP"); http.onreadystatechange = oncomplete; } else { http = new XMLHttpRequest(); http.onload = oncomplete; } http.open("POST", to, false); http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); http.setRequestHeader("Content-Length", params.length); http.setRequestHeader("Connection", "close"); http.send(params); } 

… qui s'appelle comme ceci:

 // Load approval-pending data // sendData("", "./leer/confesiones/" + sId, function() { var xml = http.responseXML; var pending = xml.getElementsByTagName("pending").getElementsByTagName("confession"); (...) 

Je vais m'arrêter ici. Parce que lorsque je tente d'analyser le XML, j'ai l'erreur suivante à Firebug:

 XML Parsing Error: no element found Location: moz-nullprincipal:{7e9eab45-2f73-476d-9bdb-2370d1534f29} Line Number 1, Column 1: ^ 

J'ai essayé de charger ./leer/confesiones/ en l'introduisant comme URL dans le navigateur et ça fonctionne comme un charme. XML entièrement valide. L'utilisation de Firebug pour inspecter XHR sous "Net" le dit aussi, XML valide. La vue Console est celle qui me donne l'erreur, comme s'il s'agissait d'une erreur JavaScript. Mais http.responseText contient le XML, dans le texte, et xml est de type [object XMLDocument] .

Alors … qu'est-ce que je manque?

SOLUTIONS : PHP modifié pour afficher JSON et JavaScript pour analyser correctement.

Faites-vous une faveur, et utilisez une bibliothèque JS qui enveloppe toute la magie ajax pour vous. Il y a beaucoup de problèmes et de problèmes croisés sur le navigateur, et ce peut être l'une de ces choses.

Je recommanderais jQuery, c'est le plus simple et le plus puissant. Ajoutez-le donc au sommet de votre html, à l'intérieur de la balise de la tête:

 <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script> 

Et puis, dans votre JS, faites quelque chose comme ceci:

  $.get('/leer/confesiones/', function(data) { console.log(data); }); 

Cela devrait vous aider à démarrer. Consultez ici plus d'informations sur jQuery et la fonction $ .get. BTW – Je vois que vous utilisez un POST, mais pour la récupération des données (pas de mise à jour ou de suppression), la convention est GET.

En outre, envisagez de modifier votre PHP afin qu'il retourne les données formatées JSON au lieu de XML. Donc, au lieu de faire cette petite danse que vous avez à faire avec le balisage xml, obtenez un tableau prêt avec toutes les données et faites ceci:

 echo json_encode($array); // voila 
 if (typeof window.ActiveXObject != 'undefined' ) { 

J'irais d'abord pour XMLHttpRequest natif. ActiveXObject ne doit être qu'un repli, car il peut générer des avertissements ActiveX feutres.

  http = new ActiveXObject("Microsoft.XMLHTTP"); 

Impact mondial. Rappelez-vous d'utiliser var .

  http.onreadystatechange = oncomplete; 

onreadystatechange est appelé dans plus de cas que l'achèvement. Vous ne devez appeler oncomplete lorsque readystatechange déclenche et readyState===4 , sinon vous essayez d'analyser le XML incomplet ou manquant.

  http.onload = oncomplete; 

onload ne fait pas partie de la norme XMLHttpRequest. Vous devez utiliser onreadystatechange pour les deux branches.

Je suis un peu surpris si JQuery a résolu ce problème particulier … au moins, vous pouvez générer les mêmes erreurs avec cela: les problèmes de réponse XMLHttpRequest xml avec jQuery 1.4.1, comment forcer la réponse de la demande à être traité en texte brut?

Dans mon cas, au moins, tout cela était dû au fait que je faisais une demande de domaine interdisciplinaire, et l'erreur XML à propos d'être «inparable» n'était qu'un effet secondaire du fait qu'aucun XML n'est revenu (car le Le navigateur ne l'a pas permis).

Je ne connais pas PHP, mais je ne vois pas où vous obtenez votre tag de fermeture pour l'élément <confession> . Appelez-moi confus, puisque vous dites que la sortie est bien formée …