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

Posted

技术标签:

【中文标题】XmlHTTPRequest:“XML 解析错误:未找到元素”【英文标题】:XmlHTTPRequest: "XML Parsing Error: no element found" 【发布时间】:2011-01-13 19:12:35 【问题描述】:

所以我使用 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>

我使用 JavaScript 加载 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:
^

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

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

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

【问题讨论】:

一些额外的东西:MySqlHandler 是我自己的 php 框架的一部分。不要那样做,因为该对象已经过深入测试并且可以正常工作。 您的示例缺少“”部分,但从您的代码看来,它会在那里。那只是复制+粘贴错误吗?我会使用像 Fiddler 这样的工具来真正了解网络中发生的事情以及它是否采用正确的字符编码等。 修复示例,正确发送 XML 标头。我会和 Fiddler 确认一下。 XML 声明是多余的,因为这些都是默认值。根本不需要包含它。 【参考方案1】:

帮自己一个忙,使用一个为您包装所有 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

【讨论】:

这就像一个魅力。实际上,我已经在我的 Web 应用程序的其他地方使用了它。我不知道为什么我认为发送 XML 作为响应而不是 JSON 是个好主意。非常感谢! 这一切都很好,但是是否有关于潜在问题的结论(XML Parsing Error: no element found Location: moz-nullprincipal:7e9eab45-2f73-476d-9bdb-2370d1534f29 Line第 1 列,第 1 列:)?谢谢。【参考方案2】:
if (typeof window.ActiveXObject != 'undefined' ) 

我会先选择原生 XMLHttpRequest。 ActiveXObject 应该只是一个后备,因为它可能会产生丑陋的 ActiveX 警告。

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

意外全局。记得使用var

    http.onreadystatechange = oncomplete;

onreadystatechange 在更多情况下被调用,而不仅仅是完成。您应该只在readystatechange 触发和readyState===4 时调用oncomplete,否则您可能会尝试解析不完整或丢失的XML。

    http.onload = oncomplete;

onload 不是 XMLHttpRequest 标准的一部分。您应该对两个分支都使用onreadystatechange

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

我不了解 PHP,但我不知道您从哪里获得 &lt;confession&gt; 元素的结束标记。叫我困惑,因为你说输出格式正确......

【讨论】:

元素是这样的:..text-goes-here.. 我的意思是,PHP 代码的哪一部分创建了结束 &lt;confession&gt; 标记? 对不起。忘记输入一些

以上是关于XmlHTTPRequest:“XML 解析错误:未找到元素”的主要内容,如果未能解决你的问题,请参考以下文章

将 clob 转换为 xml 解析错误

Android XML解析错误[重复]

XML 解析错误:XML 或文本声明不在实体的开头

Android XML解析错误:只允许一个根元素

XML 解析错误:找不到根元素位置

Firefox 开发者控制台中的 XML 解析错误