Ajax - responseText工作但responseXML为null

时间:2010-11-29 19:38:22

标签: php ajax responsetext

我正在尝试我的第一个AJAX并且我的xml接收功能有问题。 我提醒responseText,我可以看到从我的服务器返回的xml,但是当我尝试获取responseXML时,我得到null并且错误。

这是构建我的xml

的php函数
  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 个答案:

答案 0 :(得分:2)

可能是因为,即使您正确设置了内容类型,也需要在回复的顶部添加<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 :(得分:1)

您正在不正确地关闭父节点(</results>而不是<results/>),您应该(在清理它之后)将所有POSTDATA包装在<![CDATA[...]]>标签中以确保安全。确保它也是UTF8编码(参见utf8_encode()

编辑:以及wajiw在开头就<?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,去吧?

答案 2 :(得分:1)

答案是将函数“open()”中的异步属性设置为false。 像这样:

ajaxObject.open("POST", "my_XML_Generator.php", false);
ajaxObject.setRequestHeader("Content-type", "text/xml");
ajaxObject.send();

答案 3 :(得分:0)

我遇到了同样的问题,直到我把结果放到子节点中才解决它,例如

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

答案 4 :(得分:0)

我的错误发生在我们的团队一次,我花了很长时间才意识到问题出在我们从服务器返回的XML数据中。特别是,生成返回XML字符串的PHP脚本是罪魁祸首。

我的解决方案是从PHP脚本开头删除任何空格。我的意思是需要从脚本的开头删除任何空格,新行和/或制表符,以便脚本中的第一件事就是<?php标记本身。原来,<?PHP标签不是我PHP脚本第一行的第一件事;不知何故,我在第二行开始我的代码,第一个脚本行只是一个空行。

这让我很生气,我花了一些时间才弄清楚这一点,所以我希望其他人可以从这个解决方案中受益。如果所有其他方法都失败了,它会非常简单易行。