+ -
当前位置:首页 → 问答吧 → jQuery.ajax(),返回XML后操作问题

jQuery.ajax(),返回XML后操作问题

时间:2011-05-01

来源:互联网

1.异步请求是这样的:
JScript code

jQuery.ajax({
                type: "get",
                dataType: "xml",
                contentType: "application/x-www-form-urlencoded; charset=UTF-8",
                url: "Handle/ExampleHandler.ashx",
                data: 'id=0&date='+new Date(),
                complete: function() { },
                success: function(dataXML) {
                    //将返回值呈现以查看
                    $(dataXML).find("Report").each(function(){                        
                        $("#msg").html($(this).text());
                    });
                } //end Success
            }); //end Ajax




2.服务端是Generic Handle(一般处理程序 ExampleHandler.ashx)
C# code

context.Response.ContentType = "text/plain";
context.Response.ExpiresAbsolute = DateTime.Now.AddDays(-1);
context.Response.AddHeader("pragma", "no-cache");
context.Response.AddHeader("cache-control", "");
context.Response.CacheControl = "no-cache";
context.Response.Charset = Encoding.UTF8.ToString();

if (context.Request.Params["id"] != null)
{
    string id = context.Request.Params["id"].ToString();
    LoadOrder(context);
}



3.函数 LoadOrder 如下
C# code

private void LoadOrder(HttpContext context)
    {        
        string myConnString = "Provider=Microsoft.Jet.OLEDB.4.0;data source =";
        OleDbConnection myConn = new OleDbConnection(myConnString + context.Server.MapPath("~/App_Data/CellOrder.mdb"));
        myConn.Open();
        string sql = "Select * From Client";
        OleDbCommand myComm = new OleDbCommand(sql, myConn);
        OleDbDataReader myReader;
        //1.数据流
        myReader = myComm.ExecuteReader();

        // 生成xml文件对象
        XmlDocument xmlTmpt = new XmlDocument();
        xmlTmpt.Load(context.Server.MapPath("~/CellsTemplate/CellOrder.xml"));

        XmlNode clientNodes = xmlTmpt.DocumentElement.ChildNodes[1];
        
        while(myReader.Read())
        {
            if (clientNodes.ChildNodes.Count > 0)
            {
                for (int i = 0; i < clientNodes.ChildNodes.Count; i++)
                {
                    XmlNode dataNode = clientNodes.ChildNodes[i];
                    string columnName = dataNode.Attributes["columnName"].Value;                    
                    dataNode.InnerText = myReader[columnName].ToString();
                }
            }
        }

        context.Response.ContentType = "text/xml";
        context.Response.Write(xmlTmpt.OuterXml);
        context.Response.End();

        myReader.Close();
        myConn.Close();        
    }


对该段代码进行调试,光标到达“context.Response.End();”时,输出值xmlTmpt.OuterXml 是我期望的:
XML code

<?xml version="1.0"?>
<Report>
  <CllFileName>CellOrder.cll</CllFileName>
  <Client>
    <Data col="3" row="16" columnName="单位名称">南京****股份有限公司</Data>
    <Data col="3" row="17" columnName="单位地址">江苏市********</Data>
    <Data col="9" row="17" columnName="邮编">210000</Data>
    <Data col="3" row="18" columnName="订购人姓名">李**</Data>
    <Data col="5" row="18" columnName="订购人电话">0791-1234567</Data>
    <Data col="7" row="18" columnName="订购人传真">0791-1234567</Data>
    <Data col="9" row="18" columnName="订购人E-Mail">*****@sina.com</Data>
    <Data col="3" row="19" columnName="开发人员姓名">周*</Data>
    <Data col="5" row="19" columnName="开发人员电话">0791-7654321</Data>
    <Data col="7" row="19" columnName="开发人员传真">0791-7654321</Data>
    <Data col="9" row="19" columnName="开发人员E-Mail">####@china.com</Data>
    <Data col="3" row="20" columnName="开票信息">网上支付</Data>
    <total>100</total>
  </Client>
</Report>



4.客户端回调函数:
JScript code

success: function(dataXML) {                    
                    $(dataXML).find("Report").each(function(){                        
                        $("#msg").html($(this).text());
                    });
                    

                } //end Success


打印出来的值却是:
XML code

CellOrder.cll南京****股份有限公司江苏市********330000李**0791-12345670791-1234567*****@sina.com周*0791-76543210791-7654321####@china.com网上支付


即得到的仅仅是文本值,而那些XML标签全都不见了,谁帮我看看是怎么回事?

作者: lxhefeiyancao   发布时间: 2011-05-01

粗略总结一下:
调试时,光标在.ashx(服务端)走到 context.Response.End()处,查看xmlTmpt.OuterXml 得到如下值:
【此值正是我想在客户端期望得到的】
XML code

<?xml version="1.0"?>
<Report>
  <CllFileName>CellOrder.cll</CllFileName>
  <Client>
    <Data col="3" row="16" columnName="单位名称">南京****股份有限公司</Data>
    <Data col="3" row="17" columnName="单位地址">江苏市********</Data>
    <Data col="9" row="17" columnName="邮编">210000</Data>
    <Data col="3" row="18" columnName="订购人姓名">李**</Data>
    <Data col="5" row="18" columnName="订购人电话">0791-1234567</Data>
    <Data col="7" row="18" columnName="订购人传真">0791-1234567</Data>
    <Data col="9" row="18" columnName="订购人E-Mail">*****@sina.com</Data>
    <Data col="3" row="19" columnName="开发人员姓名">周*</Data>
    <Data col="5" row="19" columnName="开发人员电话">0791-7654321</Data>
    <Data col="7" row="19" columnName="开发人员传真">0791-7654321</Data>
    <Data col="9" row="19" columnName="开发人员E-Mail">####@china.com</Data>
    <Data col="3" row="20" columnName="开票信息">网上支付</Data>
    <total>100</total>
  </Client>
</Report>



但到了 客户端回调函数 中,就变成了只含值,却不含XML标签的样子:
XML code

CellOrder.cll南京****股份有限公司江苏市********330000李**0791-12345670791-1234567*****@sina.com周*0791-76543210791-7654321####@china.com网上支付




居然还有这种问题,郁闷伤了

作者: lxhefeiyancao   发布时间: 2011-05-01

jq的text方法只能获取文本内容,节点标签获取不到

jq怎么获取xml包括节点内容不太清楚,不过firefox和ie可以使用下面的代码来序列化xml节点,其他浏览器可能序列化不了

JScript code
success: function(dataXML) {
                    //将返回值呈现以查看
                    $(dataXML).find("Report").each(function(){                        
                        $("#msg").html(document.all?$(this)[0].xml:window.XMLSerializer?new XMLSerializer().serializeToString($(this)[0]):'无法序列化XML节点');
                    });
                }


或者修改下你的xml内容文件,用cdata节点,然后获取cdata节点里面的内容即可,兼容性只要支持标准xml的操作就行

XML code
<?xml version="1.0" encoding="utf-8"?>
<Report><![CDATA[
  <CllFileName>CellOrder.cll</CllFileName>
  <Client>
    <Data col="3" row="16" columnName="单位名称">南京****股份有限公司</Data>
    <Data col="3" row="17" columnName="单位地址">江苏市********</Data>
    <Data col="9" row="17" columnName="邮编">210000</Data>
    <Data col="3" row="18" columnName="订购人姓名">李**</Data>
    <Data col="5" row="18" columnName="订购人电话">0791-1234567</Data>
    <Data col="7" row="18" columnName="订购人传真">0791-1234567</Data>
    <Data col="9" row="18" columnName="订购人E-Mail">*****@sina.com</Data>
    <Data col="3" row="19" columnName="开发人员姓名">周*</Data>
    <Data col="5" row="19" columnName="开发人员电话">0791-7654321</Data>
    <Data col="7" row="19" columnName="开发人员传真">0791-7654321</Data>
    <Data col="9" row="19" columnName="开发人员E-Mail">####@china.com</Data>
    <Data col="3" row="20" columnName="开票信息">网上支付</Data>
    <total>100</total>
  </Client>]]>
</Report>


JScript code
success: function(dataXML) {
                    //将返回值呈现以查看
                    $(dataXML).find("Report").each(function(){                        
                        $("#msg").html($(this)[0].firstChild.nodeValue);
                    });
                } //end Success

作者: showbo   发布时间: 2011-05-01

each()循环以后 可以这样获得属性 。
var columnName= $(this).attr("columnName");

作者: zell419   发布时间: 2011-05-01

热门下载

更多