XmlHTTPRequest: «Ошибка синтаксического анализа XML: элемент не найден» - PullRequest
3 голосов
/ 06 февраля 2010

Так что я использую PHP + MySQL для доставки содержимого базы данных в XML на JavaScript.

<code>
$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>";
}</p>

<p>$xml .= "</pending>";
$xml .= "<active>";</p>

<p>$active = $m->MySqlHandler->Query(
    "SELECT DISTINCT confessions.*,
    (SELECT COUNT(*) FROM comments WHERE confession_id = confessions.id) AS comments,
    (SELECT COUNT(*) FROM sentences WHERE confession_id = confessions.id) AS sentences
    FROM confessions WHERE confessions.publish = 1"
);</p>

<p>foreach ($active->Rows as $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"]->Value,
         $ar->Columns["absolutions"]->Value
    );
    $sql_template = "SELECT COUNT(*) FROM sentences 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' "
         . "age='$age'>$confession</confession>";
}</p>

<p>$xml .= "";
header("Content-Type: application/xml");
echo $xml;</p>

<p>

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

<code>
<?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></p>

<p>

Я загружаю 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);
}

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

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

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

<code>
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].

Так ... что мне не хватает?

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

Ответы [ 4 ]

4 голосов
/ 06 февраля 2010

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

Я бы порекомендовал 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. Кстати, я вижу, что вы используете POST, но для извлечения данных (без обновления или удаления) используется соглашение GET.

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

echo json_encode($array); // voila
1 голос
/ 27 января 2011

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

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

1 голос
/ 06 февраля 2010
if (typeof window.ActiveXObject != 'undefined' ) {

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

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

Случайное глобальное. Запомните использовать var.

    http.onreadystatechange = oncomplete;

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

    http.onload = oncomplete;

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

0 голосов
/ 06 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...