簡體   English   中英

XmlHTTPRequest:“XML解析錯誤:找不到元素”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM