Ajax - responseText работает, но responseXML null - PullRequest
3 голосов
/ 29 ноября 2010

Я пробую свой первый AJAX и у меня проблема с моей функцией приема xml. Я предупреждаю responseText и вижу, что xml возвращается с моего сервера, но когда я пытаюсь получить responseXML, я получаю нулевое значение и ошибку.

Вот функция php, которая создает мой xml

  header('Content-type: application/xml');
    echo("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
    echo("<results>");
    echo("<table><![CDATA[tablereererere]]></table>");
    //echo("<ratedTable>".$_POST['ratedTable']."</ratedTable>\n");
    //echo("<table>".$_POST['table']."</table>\n");
    //echo("<post_id>".$_POST['post_id']."</post_id>\n");
    //echo("<user_id>".$_POST['user_id']."</user_id>\n");
    //echo("<rating>".$_POST['rating']."</rating>\n");
    echo("</results>");

А вот моя функция javascript, которая обрабатывает возвращенный xml

function ajaxReceiver(http_request) {

    //this function continues to run until a result is returned and then it creates the new div
    if(http_request.readyState == 4) {

      response_xml = http_request.responseXML;
      response_text =  http_request.responseText;

      alert(response_text);
      alert(response_xml.getElementsByTagName("table")[0].textContent);
      //document.getElementById('floatingNotification').innerHTML = response_text;
       // alert(http_request.responseXML.getElementsByTagName("table")[0].textContent);
      //ratedTable = responseXML.getElementsByTagName("table").value;
      //alert(ratedTable);
      //message = response.getElementsByTagName('table')[0].textContent;
      //alert(message);
     //alert(message);
//this response contains the xml document that was returned by the php function.You can get any values out of the xml document and 
//use javascript dom to manipulate the contents on the page


    }
}

Ответы [ 5 ]

2 голосов
/ 29 ноября 2010

Возможно, это связано с тем, что, даже если вы правильно указали тип содержимого, в верхней части ответа должен быть тег <xml. Кроме того, вы не закрываете свой последний тег должным образом. Это должно работать:

echo("<?xml version='1.0'?>");
echo("<results>");
echo("<ratedTable>".$_POST['ratedTable']."</ratedTable>");
echo("<table>".$_POST['table']."</table>");
echo("<post_id>".$_POST['post_id']."</post_id>");
echo("<user_id>".$_POST['user_id']."</user_id>");
echo("<rating>".$_POST['rating']."</rating>");
echo("<message>$message</message>");
echo("</results>");

Для получения дополнительной информации о том, как определить ваш XML: http://www.w3.org/TR/REC-xml/#sec-prolog-dtd

1 голос
/ 08 июля 2012

Ответ заключается в том, чтобы присвоить асинхронному свойству в функции "open ()" значение false. Как это:

ajaxObject.open("POST", "my_XML_Generator.php", false);
ajaxObject.setRequestHeader("Content-type", "text/xml");
ajaxObject.send();
1 голос
/ 29 ноября 2010

Вы неправильно закрываете родительский узел (</results>, а не <results/>), и вы должны (после его очистки) обернуть все теги POSTDATA в <![CDATA[...]]>, чтобы быть в безопасности.Убедитесь, что он также закодирован в формате UTF8 (см. utf8_encode())

РЕДАКТИРОВАТЬ: и что сказал вначале о теге <?xml version="1.0" encoding="UTF-8" ?> в начале.

Редактировать: пример использования блока CDATA

<?xml version="1.0" encoding="UTF-8" ?>
<myNode>
    <myData><![CDATA[
        Now I just throw in my data, for fun and profit!
        This way I can use special, reserved characters like <, > and &!
    ]]></myData>
</myNode>

Редактировать еще раз:

Почему бы не дать Content-Type: text/xml, НЕ application/xml, ход?

0 голосов
/ 22 апреля 2014

Однажды эта ошибка произошла с нашей командой, и у меня ушло много времени, прежде чем мы поняли, что проблема в наших XML-данных, возвращаемых с сервера. В частности, виновником был PHP-скрипт, который генерировал возвращаемую XML-строку.

Мое решение состояло в том, чтобы удалить все пробелы в начале сценария PHP . Я имею в виду, что любые пробелы, новые строки и / или символы табуляции должны быть удалены из начала скрипта, поэтому первое, что должно быть в скрипте, это сам тег <?php. Оказалось, что тег <?PHP был не первым в первой строке моего PHP-скрипта; каким-то образом я начал свой код со второй строки, а первая строка сценария была просто пустой.

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

0 голосов
/ 19 мая 2013

У меня была та же проблема, и я не мог ее решить, пока я не поместил свои результаты в подузлы, например

header("Content-Type: text/xml; charset=utf-8");
echo("<?xml version='1.0' encoding='utf-8'?>\n");
echo("<summary>$summary</summary>\n");
echo("<content>$content</content>\n");

не работает для меня по какой-то странной причине, но это работает:

header("Content-Type: text/xml; charset=utf-8");
echo("<?xml version='1.0' encoding='utf-8'?>\n");
echo("<page>\n");
echo("    <summary>$summary</summary>\n");
echo("    <content>$content</content>\n");
echo("</page>\n");

Мой код для получения ответа:

function retrieveRequest(title)
{
    if (_xmlRequest.readyState == 4 && _xmlRequest.status == 200)
    {
        var xmlResponse = _xmlRequest.responseXML;
        _divSummary.innerHTML = xmlResponse.getElementsByTagName("summary")[0].textContent;
        _divContent.innerHTML = xmlResponse.getElementsByTagName("content")[0].textContent;
    }
}
...