XmlHTTPRequest: "Ошибка анализа XML: элемент не найден"

Поэтому я использую PHP + MySQL для доставки содержимого базы данных в XML на 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 (SELECT COUNT (*) FROM предложений WHERE confession_id = confessions. id) AS предложения FROM confessions WHERE confessions.publish = 1 ");

foreach ($ active-> Строки как $ ar) {list ($ id, $ gender, $ age, $ confession, $ dateposted, $ absolutions) = array ($ ar-> Columns ["id"] -> Value, $ ar-> Columns ["gender"] -> Value, $ ar-> Columns ["age"] -> Value, $ ar-> Columns ["confession"] -> Value, $ ar-> Columns ["dateposted" ] -> Значение, $ ar-> Столбцы ["absolutions"] -> Значение); $ sql_template = "SELECT COUNT (*) FROM предложений WHERE confession_id = $ id AND 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 = '{$ sentence_data [' c ']}' p = '{$ sentence_data [' p ']}'". "l = '{$ sentence_data [' l ']}' id = '$ id' gender = '$ gender'". "Возраст = '$ возраст'> $ исповедь </ исповедь>"; }

$ xml. = ""; header («Content-Type: application / xml»); echo $ xml;

Итак, оттуда вы получите результат, такой как …

 <?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>

Я загружаю XML с помощью JavaScript:

 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); } 

… который называется вот так:

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

Я остановлюсь прямо здесь. Поскольку, когда я пытаюсь разобрать XML, я получаю следующую ошибку в Firebug:

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

Я попытался загрузить ./leer/confesiones/ его как URL-адрес в браузер, и он работает как шарм. Полностью действующий XML. Использование Firebug для проверки XHR в «Net» также говорит о правильном XML. Вид консоли – это тот, который дает мне ошибку, например, если это ошибка JavaScript. Но http.responseText содержит XML, в тексте и xml имеет тип [object XMLDocument] .

Итак … что мне не хватает?

SOLVED : модифицированный PHP для вывода JSON и JavaScript для правильного его анализа.

Сделайте себе одолжение и используйте JS-библиотеку, которая обертывает всю магию ajax для вас. Там много проблем с перекрестным браузером и gotchas, и это может быть только одна из тех вещей.

Я бы порекомендовал jQuery, это самый простой и достаточно мощный. Поэтому добавьте это в верхнюю часть своего html внутри тега head:

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

И тогда в вашем JS сделайте что-то вроде этого:

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

Это должно заставить вас начать. Посмотрите здесь, чтобы узнать больше о jQuery и функции $ .get. BTW. Я вижу, что вы используете POST, но для извлечения данных (без обновления или удаления) соглашение является GET.

Кроме того, рассмотрите возможность изменения вашего PHP, чтобы он возвращал форматированные данные JSON вместо XML. Поэтому вместо того, чтобы делать этот маленький танец, вы должны иметь дело с разметкой xml, просто получите массив со всеми данными и сделайте следующее:

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

Сначала я пошел на собственный XMLHttpRequest. ActiveXObject должен быть только резервным, поскольку он может генерировать уродливые предупреждения ActiveX.

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

Случайный глобальный. Rememeber для использования var .

  http.onreadystatechange = oncomplete; 

onreadystatechange вызывается в большем количестве случаев, чем просто завершение. Вы должны только вызывать oncomplete когда readystatechange и readyState===4 , в противном случае вы можете попытаться разобрать неполный или отсутствующий XML.

  http.onload = oncomplete; 

onload не является частью стандарта XMLHttpRequest. Вы должны использовать onreadystatechange для обеих ветвей.

Я немного удивлен, если JQuery решил эту конкретную проблему … по крайней мере, вы можете сгенерировать те же ошибки с этим: ответы на XMLHttpRequest xml с jQuery 1.4.1, как заставить запрос ответа обрабатываться как обычный текст?

В моем случае, по крайней мере, все это было связано с тем, что я делал кросс-доменный запрос, а ошибка XML об этом была «неповторимой» была лишь побочным эффектом того факта, что XML не вернулся (поскольку браузер не разрешил это).

Я не знаю PHP, но я не вижу, где вы получаете свой закрывающий тег для элемента <confession> . Назовите меня смущенным, так как вы говорите, что результат хорошо сформирован …