XmlHTTPRequest:“XML解析错误:找不到元素”

时间:2010-02-06 04:32:57

标签: php javascript mysql xml ajax

所以我使用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 comments, (SELECT COUNT(*) FROM sentences WHERE confession_id = confessions.id) AS sentences FROM confessions WHERE confessions.publish = 1" );

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

$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:


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:
^

我尝试通过将其作为URL输入到浏览器来加载./leer/confesiones/,它就像一个魅力。完全有效的XML。使用Firebug在“Net”下检查XHR也是如此,有效的XML。 Console视图是一个给我错误的视图,就像它是一个JavaScript错误一样。但http.responseText包含文字中的XML,xml的类型为[object XMLDocument]

那么......我错过了什么?

已解决:修改PHP以输出JSON和JavaScript以正确解析它。

4 个答案:

答案 0 :(得分:4)

帮自己一个忙,并使用一个包含所有ajax魔法的JS库。有很多跨浏览器的问题和陷阱,这可能只是其中之一。

我推荐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);
 });

这应该让你开始。 Look here了解有关jQuery和$ .get函数的更多信息。 顺便说一句 - 我看到你正在使用POST,但是为了检索数据(没有更新或删除),约定是GET。

此外,请考虑更改PHP,以便返回JSON格式的数据而不是XML。 因此,与xml标记不同,不要做那个小小的舞蹈,只需准备一个包含所有数据的数组,然后执行此操作:

echo json_encode($array); // voila

答案 1 :(得分:1)

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

答案 2 :(得分:1)

如果JQuery解决了这个特定的问题,我有点惊讶...至少,你可以生成相同的错误: XMLHttpRequest xml response woes with jQuery 1.4.1, how to force the request response to be processed as plain text?

在我的情况下,至少,这完全是由于我正在制作跨域请求,并且关于它的XML错误是“不可解析的”只是因为没有XML回来这一事实的副作用(因为浏览器不允许)。

答案 3 :(得分:0)

我不知道PHP,但是我看不到你在哪里得到<confession>元素的结束标记。让我感到困惑,因为你说输出结构良好......