XMLHttpRequest: "XML Ayrıştırma Hatası: bulunamadı eleman"

4 Cevap php

Yani bir JavaScript XML veritabanı içeriğini sunmak için PHP + MySQL kullanıyorum.


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

Yani, oradan, sen gibi bir sonuç elde ...


<?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>

Ben kullanarak JavaScript ile XML yüklemek:


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

... Ki böyle denir:


// Load approval-pending data //
sendData("", "./leer/confesiones/" + sId, function()
{
   var xml = http.responseXML;
   var pending = xml.getElementsByTagName("pending").getElementsByTagName("confession");
(...)

Ben burada duracağım. Ben XML ayrıştırmak denediğimde Firebug'deki aşağıdaki hatayı alıyorum, çünkü:


XML Parsing Error: no element found Location: moz-nullprincipal:{7e9eab45-2f73-476d-9bdb-2370d1534f29} Line Number 1, Column 1:
^

Ben tarayıcı içine bir URL olarak girerek ./leer/confesiones/ yükleme denedim ve bir cazibe gibi çalışır. Tamamen geçerli XML. "Net" altında xhr incelemek için Firebug kullanarak bu yüzden de, geçerli XML diyor. Konsol görünümü, bir JavaScript hatası olup olmadığını gibi, bana hata veriyor biridir. Ancak, http.responseText metinde, XML içerir ve xml tiptedir [object XMLDocument].

Yani ... ne eksik?

SOLVED: düzgün ayrıştırmak için çıktı JSON ve JavaScript modifiye PHP.

4 Cevap

Kendinize bir iyilik yapın ve sizin için tüm ajax sihirli sarar JS kitaplığı kullanın. Orada çapraz tarayıcı sorunları ve FRİKİKLERİNDEN bir sürü, ve bu sadece bu şeylerden biri olabilir.

I'd recommend jQuery, it's the easiest and quite powerful. So add this to the top of your html, inside the head tag:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script> 

Ve sonra JS böyle bir şey yapın:

 $.get('/leer/confesiones/', function(data) {
     console.log(data);
 });

That should get you started. Look here for more info about jQuery and the $.get function. BTW- I see you're using a POST, but for retrieval of data (no updating or deleting) the convention is GET.

Additionally, consider changing your PHP so that it returns JSON formatted data instead of XML. So instead of doing that little dance you have to do with the xml markup, just get an array ready with all the data, and do this:

echo json_encode($array); // voila
if (typeof window.ActiveXObject != 'undefined' ) {

Ben ilk yerli XMLHttpRequest için gitmek istiyorum. Çirkin ActiveX uyarıları yaratabileceği gibi ActiveXObject yalnızca bir geri dönüş olmalıdır.

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

Küresel Kaza. Kullanımı rememeber var.

    http.onreadystatechange = oncomplete;

onreadystatechange sadece tamamlanmasından daha durumlarda denir. Aksi takdirde eksik veya eksik XML ayrıştırmak için çalışıyor olabilir zaman readystatechange yangınları ve readyState===4, sadece oncomplete aramalısınız.

    http.onload = oncomplete;

onload XMLHttpRequest standardının parçası değildir. Her iki şube için onreadystatechange kullanmalısınız.

I'm a bit surprised if JQuery solved this particular issue... at least, you can generate the same errors with that: XMLHttpRequest xml response woes with jQuery 1.4.1, how to force the request response to be processed as plain text?

Benim durumumda, en azından, bu tüm nedeniyle (bir çapraz etki istekte edildi ve "unparsable" olma konusunda XML hatası hiçbir XML geri geldi aslında sadece bir yan etkisi olduğu gerçeğine oldu çünkü tarayıcı) buna izin vermedi.

Ben PHP bilmiyorum, ama <confession> elemanı için kapanış etiketi alıyoruz nerede görmüyorum. Eğer çıkış iyi biçimlendirilmiş olduğunu söylüyorlar, çünkü beni karıştı diyoruz ...