+ -
当前位置:首页 → 问答吧 → XML又出问题了。。。郁闷中

XML又出问题了。。。郁闷中

时间:2009-05-17

来源:互联网

以前碰到过,应该是content-type的问题,已经设置解决了,但今天莫名其妙又出现了这个问题,也没改什么代码阿,在执行$.ajax()后,firefox总是报这个错误:This XML file does not appear to have any style information associated with it. The document tree is shown below.
      

我已经将Content-Type设置成text/xml了啊,奇怪。。。。

$.ajax({
            url: xxx,
            data: xxx,
            cache: false,
            dataType: "xml",
            error: function(xml) {
                alert('Error loading XML doc' + xml);
            },
            success: function(xml) {
                xxxxx
            }
        })

作者: benlaohu   发布时间: 2009-05-17

你贴出xml来,尽量20行以内的出错xml,别一帖一大段
最好有在线测试地址

作者: shawphy   发布时间: 2009-05-17

<recordset>
<row>
<ID>1</ID>
<userid>admin</userid>
<password>dddddd</password>
<privilege>0</privilege>
<managedid>all</managedid>
<memo/>
<status>0</status>
</row>
<row>
<ID>32</ID>
<userid>tester</userid>
<password>hello</password>
<privilege>0</privilege>
<managedid/>
<memo/>
<status>0</status>
</row>
</recordset>

我用http工具跟踪过,返回的头信息确实是text/xml。

具体现象:
我在页面有多行记录,每行记录后面我都加了链接,并且可以通过jquery绑定了click事件,通过这个事件,我去服务器请求一个xml下来。当我操作一条记录的时候,正常执行。但是如果紧接着电击另外一条的时候,就会出现这个xml错误了。服务段的代码我也看了,每次都会调用一个函数,这个函数的第一行就是header("content-type: text/xml")啊,奇怪的问题。

如果用$.get,第一次能够成功,第二次不能成功。如果用$.ajax(),那么第一次也不能成功。参数什么的,都应该是一致的阿,奇怪奇怪
[ 此帖被benlaohu在2009-05-17 14:14重新编辑 ]

作者: benlaohu   发布时间: 2009-05-17

好像在最前面得有
<?xml version="1.0" encoding="utf-8" ?> 类似的东东

作者: seekarmor   发布时间: 2009-05-17

引用
引用第3楼seekarmor于2009-05-17 10:24发表的  :
好像在最前面得有
<?xml version="1.0" encoding="utf-8" ?> 类似的东东

看提示应该就是这个原因

作者: keakon   发布时间: 2009-05-17

这个<?xml version="1.0" encoding="utf-8" ?>是始终存在的。通过http分析工具可以看出来。

另外,刚才发现一个现象,通过http可以看到两次请求的request不太一样。

可以执行的如下:
GET xxxxxxxxxxx HTTP/1.1
Host: xxxxx
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 GTB5 (.NET CLR 3.5.30729)
Accept: application/xml, text/xml, */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
X-Requested-With: XMLHttpRequest
Referer: xxxxxxxxxxxxxxxxxx
Cookie: PHPSESSID=9vjt9qtsgq2o5debfoo35vdp92

下一个请求,也就是不能执行的如下:
GETxxxxxxxxxxxx HTTP/1.1
Host: xxxxxx
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 GTB5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: xxxxxxxxxxxxxxxxxxxxx
Cookie: PHPSESSID=9vjt9qtsgq2o5debfoo35vdp92

很显然,第二次的少了一个X-Requested-With: XMLHttpRequest。这应该是jquery产生的吧?同样的代码,怎么第二次的会没有了这个呢??
还有就是第二次的那个accept也不一样了。

作者: benlaohu   发布时间: 2009-05-17

看着确实奇怪,就目前的代码,看不出太多问题

我搜了一下那句话,遇到的比较少,但还是有的。

可以肯定的是,出问题的肯定是由于第二次他不是当作text/xml来处理了
所以firefox认为那个xml需要 <?xml-stylesheet href="CSS URL" type="text/css"?> 来设置样式。

总之,呼唤更多代码……

作者: shawphy   发布时间: 2009-05-17

我把我的页面贴出来了。

用php+smarty做的,里面有一些smarty的东西,不过应该不影响理解。

我的做法是这样子的:首先显示这个页面,如果用户点击了删除,那么在服务端,我会首先删除,然后再把剩余的行以xml的形式封装,回传。浏览器接收到xml后,使用javascript解析,然后再重新画出这个表格。

是不是因为这个表格是重新画的,所以才出现问题???我准备把重画这部分去掉,服务端接收到参数后,直接删除,然后不封装剩余的行,而是由客户端重新reload页面。这样没问题,我试过了。但是就不知道两种方式那个好一些。

多谢多谢。

===================================================================
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>ss</title>
<link href="../Scripts/global_tpl.css" rel="stylesheet" type="text/css" />
<script src="../Scripts/jquery.js" type="text/javascript"></script>
</head>
<body>
<div id="header">
  <ul>
    <li><img src="../Images/my_logo.jpg" width="198" height="49" alt="logo" /></li>
  </ul>
</div>
<div id="nav_button">
  {--include file='operator/nav_button.tpl'--}
</div>
<div id="nav">
  <ul>
    <li>当前位置</li>
    <li>-</li>
    <li>系统管理员</li>
  </ul>
</div>
<div id="leftnav" class="leftnav">
  <ul>
    <li>欢迎回来,{--$userid--}。</li>
  </ul>
</div>
<div id="addobject" class="rightul">
  <ul>
  </ul>
</div>
<div id="content">
    <table class="tbstyle" style="width: 100%">
        <tr>
            <td>用户名</td>
            <td>等级</td>
            <td>可管理对象</td>
            <td>状态</td>
            <td></td>
        </tr>
            {--section name=nr loop=$data--}
            <tr>
                   <td>{--$data[nr].userid--}</td>
                   <td>{--if ($data[nr].privilege == 0)--}系统
                       {--elseif ($data[nr].privilege == 1)--}营商
                       {--elseif ($data[nr].privilege == 2)--}区
                    {--else--}n/a
                       {--/if--}
                   </td>
                   <td>{--$data[nr].managedid--}</td>
                   <td>{--if ($data[nr].status == 0)--}正常
                       {--elseif ($data[nr].status == 1)--}未启用
                       {--elseif ($data[nr].status == 2)--}禁用
                       {--/if--}
                </td>
                   <td><a href="../include/responseFunc.php?action=8&tname=admin&recid={--$data[nr].ID--}">删除</a> 
                    <a href="addadmin.php?userid={--$data[nr].userid--}&recid={--$data[nr].ID--}">修改</a>
                </td>
               </tr>
               {--/section--}
    </table>    
    <br />
    <br />
<script type="text/javascript">    
    $("a[href*='response']").bind("click", function() {
        href_string = $(this).attr("href");
        para_string = href_string.substring(href_string.indexOf("?") + 1, href_string.length);
        pagename = href_string.substring(0, href_string.indexOf("?"));
        
        $.get(pagename,
            para_string,
            function(xml) {
                // remove the table content
                $("tr:gt(0)").remove();
                // loop, show data
                $(xml).find("row").each(function() {
                    var $row = $(this);
                    rowHTML = "<tr>\r";
                    rowHTML = rowHTML + "<td>" + $row.find("userid").text() + "</td>\r";
                    privilege = $row.find("privilege").text();
                    privilege_str = "";
                    if (privilege == "0") {
                        privilege_str = "系统";
                    } else if (privilege == "1") {
                        privilege_str = "营商";
                    } else if (privilege == "2") {
                        privilege_str = "区";
                    }
                    rowHTML = rowHTML + "<td>" + privilege_str + "</td>\r";
                    rowHTML = rowHTML + "<td>" + $row.find("managedid").text() + "</td>\r";
                    
                    status1 = $row.find("status").text();  // var status conflict with IE?
                    status_str = "";
                    if (status1 == "0") {
                        status_str = "正常";
                    } else if (status1 == "1") {
                        status_str = "未启用";
                    } else if (status1 == "2") {
                        status_str = "禁用";
                    }
                    rowHTML = rowHTML + "<td>" + status_str + "</td>\r";
                    rowHTML = rowHTML +
                    '<td><a href="../include/responseFunc.php?action=8&tname=admin&recid=' + $row.find('ID').text() +
                    '">删除</a> \r' +
                    '<a href="addadmin.php?userid=' + $row.find("userid").text() + '&recid=' + $row.find('ID').text() +
                    '">修改</a>\r</td>';
                    rowHTML = rowHTML + "</tr>\r";
                    
                    // append to HTML
                    $("table").append(rowHTML);
                    
                })
            },
            "xml");
        return false;
    })
    
</script>
<div id="footer">
  <ul>
    <li>©2009</li>
    <li>公司</li>
  </ul>        
</div>
</div>
</body>
</html>

作者: benlaohu   发布时间: 2009-05-17

晕啊……

说是呼唤更多代码,需要的是精简的,有问题的代码……

我们又没有你那里的测试环境……
你这样一大堆代码上来,依然无法帮你做调试的啊……

简而言之,如果你能提供一个简化过的,能够重现问题的代码,我们才能帮你从代码角度调试。

否则永远就只能对着你的描述还有代码进行YY了。
如此能帮你解决问题的几率就小了很多。


如何简化代码?
1,做加法:

前台页面
<a href="http://sssss/response/sss.php">xxx</a>

$("a[href*='response']").bind("click", function() {
    $.get($(this).attr("href"),function(xml) {
        //code
    },"xml");
});

这已经是最简单不过的代码了,毫无破绽。
如果这样问题就消失了,那就是前台页面的问题,逐步加上一些代码,直到发现问题位置。
最终得到最简化的出错代码。

同样,后台也是,首先输出一个简单的xml,没有问题,再逐步加上。直到问题重现。

2,做减法,逐步删除无关内容,直至问题消失。

============================================

很多情况下,这样子你很可能自己已经发现问题并解决了!

作者: shawphy   发布时间: 2009-05-17

我想你找到的是这个吧:
http://www.webmasterworld.com/forum26/208.htm
没有样式并不影响XML解析,如果不是直接访问,Firefox不会用样式去显示XML文档啊

话说为什么不在服务器端直接返回html,没看出你用jQuery处理XML会获得什么好处

至于head,你用ajax函数关掉cache试试

作者: keakon   发布时间: 2009-05-17

多谢诸位帮助。

已经找到问题所在,就是我通过JQuery添加进dom的内容($("#xxx").append(xxxx)),无法再次通过jquery提交,否则就会出现上述错误。正在找为什么会出现这个情况。

不过,我已经放弃在JQuery中解析xml了,直接通过浏览器的reload来做,代码又少又方便,哈哈。不过缺点就是不如jquery来的快,整个页面都要刷新。

再次感谢。

作者: benlaohu   发布时间: 2009-05-17

相关阅读 更多