代码之家  ›  专栏  ›  技术社区  ›  Joel A. Villarreal Bertoldi

xmlhttpRequest:“XML分析错误:未找到元素”

  •  3
  • Joel A. Villarreal Bertoldi  · 技术社区  · 14 年前

    因此,我使用php+mysql将XML中的数据库内容传递给一个javascript。

    >
    $XML =“& lt;?xml version='1.0'encoding='utf-8'?><忏悔gt;<待定>“;
    $pending=$M->mysqlHandler->查询(“选择ID、性别、年龄、供认、发布日期为0的供认发布日期”);
    foreach($pending->行作为$pr)
    {
    list($id,$gender,$age,$忏悔,$dateported)=array(
    $pr->列[“id”]->值,
    $pr->列[“gender”]->值,
    $pr->列[“年龄”]->值,
    $pr->列[“忏悔”]->值,
    $pr->列[“发布日期”]->值
    ;
    $xml.=“<忏悔id=$id'gender=$gender'age=$age'dateported=$dateported'>$忏悔</忏悔>”
    }
    
    

    $xml.=“</pending>”; $xml.=“<active>”;。

    $active=$m->mysqlHandler->查询( “选择不同的忏悔。*, (从“忏悔”为“忏悔”的注释中选择count(*)作为注释, (从忏悔=忏悔.id的句子中选择count(*)作为句子) 来自忏悔,其中忏悔.publish=1“ ;

    foreach($active->行作为$ar) { 列表($id,$gender,$age,$忏悔,$dateported,$absolutions)=array( $ar->列[“id”]->值, $ar->列[“性别”]->值, $ar->列[“年龄”]->值, $ar->列[“忏悔”]->值, $ar->列[“dateported”]->值, $ar->列[“绝对值”]->值 ; $sql_template=“select count(*)from senses where忏悔_id=$id and degree='%s'”; $sentence_data=数组( “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.=“<忏悔赦免=$absolutions't='123;$sentence_data['t']'” . "C='123;$sentence_data['C']'P='123;$sentence_data['P']'“ . "l='123;$sentence_data['l']'id='id'gender='gender'” . "Age='$Age'>$Adcribution</Adcribution>“; }

    $xML=“”; header(“内容类型:application/xml”); ECH$XML;

    .>.

    
    

    所以,从那里,你会得到一个结果,比如…

    < PRE> >代码> &?xml version='1.0'encoding='utf-8'?gt; <忏悔> 有待解决的问题; <admission id=“1”gender=“m”age=“20”dateported=“2010-02-06 05:22:57”> 自白。 </忏悔> </pending> 活性; &l t;absolutions=“0”t=“0”c=“0”p=“0”l=“0”id=“2”gender=“m”age=“18”> 忏悔。 </忏悔> &Lt//Active & Gt; </忏悔

    .>.

    
    

    我用javascript加载XML,方法是:

    < PRE> >代码> 函数senddata(params、to、oncomplete) { if(typeof oncomplete='未定义') { oncomplete=function(); } 如果(window.activexobject的类型!='未定义'){ http=new activexobject(“microsoft.xmlhttp”); http.onreadystatechange=oncomplete; }否则{ http=new xmlhttprequest(); http.onload=oncomplete; } http.open(“post”,to,false); http.setrequestheader(“内容类型”,“application/x-www-form-urlencoded”); http.setrequestheader(“内容长度”,params.length); http.setrequestheader(“连接”,“关闭”); http.send(参数); }

    …这叫做:

    >
    //加载审批挂起数据//
    senddata(“”,/leer/confesiones/“+sid,函数())
    {
    var xml=http.responsexml;
    var pending=xml.getElementsByTagname(“pending”).getElementsByTagname(“忏悔”);
    (…)
    < /代码> 
    
    

    我就在这儿停。因为当我尝试解析XML时,在Firebug上得到以下错误:

    < PRE> >代码> XML分析错误:找不到元素位置:moz nullprincipal:7e9eab45-2f73-476d-9bdb-2370d1534f29行号1,列1: ^ < /代码>

    我尝试加载/leer/confesiones/,将其作为URL输入到浏览器中,它的工作方式就像一个符咒。完全有效的XML。使用firebug检查“net”下的xhr,也就是说,有效的XML。控制台视图是给我错误的视图,就像它是一个javascript错误一样。但是http.responsetextcontains the xml,in text,andxmlis of type[object xmldocument]

    所以…我错过了什么?

    solved:modified php to output json and javascript to parse it properly.

    所以,从那里,你会得到一个结果,比如…

    
    &?xml version='1.0'encoding='utf-8'?gt;
    <忏悔>
    有待解决的问题;
    <admission id=“1”gender=“m”age=“20”dateported=“2010-02-06 05:22:57”>
    自白。
    </忏悔>
    </pending>
    活性;
    &l t;absolutions=“0”t=“0”c=“0”p=“0”l=“0”id=“2”gender=“m”age=“18”>
    忏悔。
    </忏悔>
    </active>
    </忏悔
    
    

    我使用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以正确解析它。

    4 回复  |  直到 13 年前
        1
  •  4
  •   adamJLev    14 年前

    帮你自己一个忙,使用一个JS库为你包装所有的Ajax魔术。有很多跨浏览器问题和gotchas,这可能只是其中之一。

    我推荐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函数的详细信息。 顺便说一句,我看到你正在使用一个帖子,但是对于数据的检索(没有更新或删除),这是一个惯例。

    另外,考虑更改您的PHP,以便它返回JSON格式的数据而不是XML。 因此,您不必对XML标记进行这种小小的改动,只需准备一个包含所有数据的数组,然后执行以下操作:

    echo json_encode($array); // voila
    
        2
  •  1
  •   bobince    14 年前
    if (typeof window.ActiveXObject != 'undefined' ) {
    

    我先去本地xmlhttprequest。ActiveXObject应该只是一个回退,因为它可能会生成难看的ActiveX警告。

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

    意外全局。记住使用 var .

        http.onreadystatechange = oncomplete;
    

    onreadystatechange 在更多情况下调用,而不仅仅是完成。你只应该打电话 oncomplete 什么时候? readystatechange 火灾与 readyState===4 ,否则,您可能试图分析不完整或缺少的XML。

        http.onload = oncomplete;
    

    onload 不是XMLHttpRequest标准的一部分。你应该使用 OnReadyStateChange(状态更改) 对于两个分支。

        3
  •  1
  •   Community M-A    7 年前

    如果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
  •  0
  •   BobS    14 年前

    我不知道php,但我不知道你从哪里得到结束标记 <confession> 元素。把我叫糊涂吧,既然你说输出格式很好…