[英]XmlHTTPRequest: “XML Parsing Error: no element found”
所以我使用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:
^
我嘗試通過將其作為URL輸入到瀏覽器來加載./leer/confesiones/
,它就像一個魅力。 完全有效的XML。 使用Firebug在“Net”下檢查XHR也是如此,有效的XML。 Console視圖是一個給我錯誤的視圖,就像它是一個JavaScript錯誤一樣。 但http.responseText
包含文本中的XML,而xml
的類型為[object XMLDocument]
。
那么......我錯過了什么?
已解決 :修改PHP以輸出JSON和JavaScript以正確解析它。
幫自己一個忙,並使用一個包含所有ajax魔法的JS庫。 有很多跨瀏覽器的問題和陷阱,這可能只是其中之一。
我推薦jQuery,它是最簡單,最強大的。 所以將它添加到head標簽內的html頂部:
<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
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
。
如果JQuery解決了這個特定的問題,我有點驚訝......至少,你可以用它生成相同的錯誤: XMLHttpRequest xml響應與jQuery 1.4.1一樣,如何強制將請求響應作為純文本處理?
在我的情況下,至少,這完全是由於我正在制作跨域請求,並且關於它的XML錯誤是“不可解決的”只是沒有XML回來的事實的副作用(因為瀏覽器不允許它)。
我不知道PHP,但是我看不到你在哪里獲得<confession>
元素的結束標記。 叫我困惑,因為你說輸出結構良好......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.