Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
401 views
in Technique[技术] by (71.8m points)

php - XmlHTTPRequest: "XML Parsing Error: no element found"

So I'm using PHP+MySQL to deliver database contents in XML to a 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;

So, from there, you get a result such as...


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

I load the XML with JavaScript by using:


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

...which is called like this:


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

I'll stop right here. Because when I attempt to parse the XML I get the following error at Firebug:


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

I tried loading ./leer/confesiones/ by inputting it as an URL into the browser and it works like a charm. Fully valid XML. Using Firebug to inspect XHR under "Net" says so too, valid XML. The Console view is the one that gives me the error, like if it is a JavaScript error. But http.responseText contains the XML, in text, and xml is of type [object XMLDocument].

So... what am I missing?

SOLVED: modified PHP to output JSON and JavaScript to parse it properly.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Do yourself a favor, and use a JS library that wraps all the ajax magic for you. There's a lot of cross-browser issues and gotchas, and this may just be one of those things.

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> 

And then in your JS do something like this:

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...