一个关于javascript Ajax解析XML的原始实例

        该实例首先需要创建数据库,数据库Test唯一表test,该表具有三个列分别为c1,c2,c3, int型,请自行建立数据库并插入几行测试数据。

        然后我们希望能将数据库中的数据读取出来,我在此处只是将数据库数据以数据集的方式存放在本地中,并将数据拼装成xml的形式,这不是重点,但还是需要我们去做,我将它封装在DBOperate.cs类中,这里采用C#语言:

       DBOperate.cs:

       //连接字符串
        private readonly static String connectionString =
            "Data Source=.;Initial Catalog=Test;Integrated Security=True";

 

        /// <summary>
        /// 填充数据集
        /// </summary>
        /// <param name="ds"></param>
        /// <param name="sql"></param>
        public void SetDataSet(DataSet ds,String sql)
        {
            SqlDataAdapter ada = new SqlDataAdapter(sql,connectionString);
            ada.Fill(ds);
        }

       

         /// <summary>
        /// 获取XML格式的字符串
        /// </summary>
        /// <returns></returns>

        public String GetXMLData()
        {

            string sql = "select * from test";
            //创建数据集
            DataSet ds = new DataSet("Test");
            this.SetDataSet(ds, sql);
            //解析数据
            DataTable dt = ds.Tables[0];
            string showData = "<?xml version='1.0' encoding='utf-8'?>/n";
            //xml字符串
            showData += "<Root>/n";
            foreach (DataRow item in dt.Rows)
            {
                showData += "<item>/n<c1>" + item[0].ToString() + "</c1>/n";
                showData += "<c2>" + item[1].ToString() + "</c2>/n";
                showData += "<c3>" + item[2].ToString() + "</c3>/n";
                int sum = (int)item[0] + (int)item[1] + (int)item[2];
                showData += "<c4>" + sum.ToString() + "</c4>/n</item>/n";
            }
            showData += "</Root>";


        }

            return showData;

        }

注意这里xml的定义格式为:

<Root>

    <item>

         <c1>..</c1><c2>..</c2><c3>..</c3><c4>..</c4>

    </item>

    ...

</Root>

接下来,我需要创建一个aspx页面用于响应ajax请求,该页面html没有任何内容,仅在cs文件中编码,

代码如下:

         ResponseTest.aspx.cs

        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {

                   this.ResponseOperate();
            }
            catch (Exception ex)
            {
                throw ex;
            }

 

        /// <summary>
        /// 响应操作
        /// </summary>
        public void ResponseOperate()
        {

            Response.Clear();
            Response.Buffer = true;

            //设置响应类型为xml
            Response.ContentType = "text/xml";
            Response.Charset = "utf-8";

            DBOperate operate = new DBOperate();
            string strXml = operate.GetXMLData();

            //输出响应流

            Response.Write(strXml);
            Response.Flush();
            Response.End();
        }

 

好了,终于要步入正题了,接下来我们用javascript执行ajax请求,ResponseTest页面,这里我们先建立一个页面ajaxRequestTest.aspx页面,注意所有页面都是放在同级目录下,该页面body内容如下:

        <form id="form1" runat="server">
    <div style="text-align: center;">
        <table cellpadding="1" border="1" cellspacing="1" id="tabScreen" style="text-align: center;">
            <tr>
                <td>C1</td>
                <td>C2</td>
                <td>C3</td>
                <td>C4</td>
            </tr>
        </table>
    </div>
    <div style="text-align: center">
        <input type="button" name="ajaxRequest" id="ajaxRequest" οnclick="ajaxRequestDemo()"
            value="Ajax populate the data using the asynchronous request" accesskey="f" />
    </div>
    <div>
        <asp:Label ID="Label1" runat="server" Font-Bold="true" Text="Iframe synchronous data show"></asp:Label>
        <iframe id="content1" src="iframeTest.aspx"></iframe>
    </div>
    </form>

注意这里我首先定义了一个表格,该表格有四个列,分别对应xml格式文本的C1,C2,C3,C4,然后我定义了一个按钮,这个按钮将触发一个ajax请求,注意ajaxRequestDemo函数会在下边讲解,这个页面的特别之处在于我还在这里定义了一个iframe,他将超链接到iframeTest.aspx页面,我的意图是通过该页面的javascript代码,同时通过ajax请求更改iframeTest.aspx和本页的表格内容,所以

还需要在iframeTest.aspx页面中定义个表格,表格id为iframeTable,请自行添加该页面,接下来我们编写javascript代码:

<script type="text/javascript">

     /*
 执行ajax异步请求填充数据操作
 */
 //XmlHttpRequest对象
 var xmlHttpRequest ;
 function ajaxRequestDemo(){

  //创建XMLHttpRequest对象
  try{
   xmlHttpRequest =  new XMLHttpRequest();
  }catch(trymicrosoft){
   try{
    xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
   }catch(othermicrosoft){
    try{
     xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP"); 
    }catch(fail){
     alert("Create Object Fail!!!!!"); 
    }
   }
  }
  //定义url
  var url = "Demo.aspx";
  //打开请求
  xmlHttpRequest.open("Get",url,true);
  //设置回调函数
  xmlHttpRequest.onreadystatechange=getDateNext;
  //发送请求
  xmlHttpRequest.send(null);
 }

</script>

由上可以看出Ajax请求的步聚是:

1.定义XMLHttpRequest对象,上面的示例中,由于不同浏览器XMLHttpRequest对象的创建方式不尽相同因此需要做异常处理,这里是为了支持不同浏览器

2.定义url,该url不能作为异域调用,否则会发生网络错误,这是因为Ajax 采用一种沙箱安全模型,这里不予过多讲解,如果需要传递数据可以在url后动态绑定参数,格式如url?a=a1&b=b1&c=c1;其中a,b,c就是参数名称,a1,b1,c1就是参数的值

3.建立到服务器的请求,这需要使用XMLHttpRequest对象的open方法,该方法的原型如下:

XmlHttpRequest.open(requestType,url,[asynch],[username],[password]);

Reutrn:void,该方法的参数具体说明如下:

     ·request-type:发送请求的类型。典型的值是 GET 或 POST,但也可以发送 HEAD 请求。
  ·url:要连接的 URL。
  ·asynch:如果希望使用异步连接则为 true,否则为 false。该参数是可选的,默认为 true。
  ·username:如果需要身份验证,则可以在此指定用户名。该可选参数没有默认值。
  ·password:如果需要身份验证,则可以在此指定口令。该可选参数没有默认值。 
 

一般情况下虽然asynch默认为true但如果是异步调用建议将true写上,因为这是一种良好的编程习惯

4.设置回调函数,设置回调函数的属性是onreadystatechange,只要将其设置为函数名称即可

5.发送请求,可以使用send(StrParams);方法中的StrParams指代要传递的参数字符串,它的作用与上面动态构造Url的参数是一样的可以将"?"号后的字符串写入send方法中,值得注意的是它与上面的Get方式是不同的,它采用的是Post方式,这需要我们设定需要设定Content-Type头信息,模拟HTTP POST方法发送一个表单形式如下:

xmlHttpRequest.setRequestHeder("Content-Type","application/x-www-form-urlencoded;charset=UTF-8");

设置头信息前必须在open方法中设置提交类型为Post方式后在设定,如果我们采用的Get方式可以将

StrParams设置为null.

接下来我们设置回调函数:

          /*
  Ajax请求回调函数
 */
 function getDateNext(){
   if(xmlHttpRequest.readyState==4){ 
    if(xmlHttpRequest.status==200){
       
//获得响应文本
     var responseText = xmlHttpRequest.responseText;
     
//首先转换XML文档
     var xmlDoc;
     try
                    {
                       xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async="false";
        xmlDoc.loadXML(responseText);
                    }
                    catch(e)
                    {
                      try
                      {
                        parser=new DOMParser();
                        xmlDoc=parser.parseFromString(text,"text/xml");
                      }
                      catch(e) {alert(e.message)}
                    }
     //解析结构加入表格
     var items = xmlDoc.getElementsByTagName("item");
     for(var i = 0;i<items.length;i++){
         var tr = document.all("tabScreen").insertRow();
         var td0 = tr.insertCell();
         td0.innerText=items[i].childNodes[0].text;
         var td1 = tr.insertCell();
         td1.innerText=items[i].childNodes[1].text;
         var td2 = tr.insertCell();
         td2.innerText=items[i].childNodes[2].text;
         var td3 = tr.insertCell();
         td3.innerText=items[i].childNodes[3].text;
     }
     //控制iframe内部内容
     //获取表格对象
     var table = window.parent.content1.document.getElementById("iframeTable");
     //.....此处省略控制iframe中Table代码,table对象已获得
    }
   }
 }
回调函数中的重要部分即是responseText,它表示返回的文本内容,此处为了使用xml节点分析函数,所以将其xmlDoc格式,服务器在完成请求后要通过onreadystatechange属性设置的函数名称查找要调用的方法并调用它这是事实,但是并非仅仅就是在服务器完成请求后调用,这里需要讲解一下HTTP就绪状态,HTTP 就绪状态表示请求的状态或情形。它用于确定该请求是否已经开始、是否得到了响应或者请求/响应模型是否已经完成。它还可以帮助确定读取服务器提供的响应文本或数据是否安全。在 Ajax 应用程序中需要了解五种就绪状态

0:请求没有发出(在调用 open() 之前)。

1:请求已经建立但还没有发出(调用 send() 之前)。

2:请求已经发出正在处理之中(这里通常可以从响应得到内容头部)。

3:请求已经处理,响应中通常有部分数据可用,但是服务器还没有完成响应。

4:响应已完成,可以访问服务器响应并使用它。

但是还有一个问题 —— 如果服务器响应请求并完成了处理但是报告了一个错误怎么办?比如我们遇到禁止访问资源的403错误,因此我们需要再次检查Http状态,这就需要XmlHttpRequest的status属性来进行判断,一般的当status的值为200时表示一切顺利。

好了,现在可以运行你的程序了,希望这次ajax之旅能够带给你对使用原始的ajax技术的充分理解!但是使用js来构造ajax的手法,到底是笨拙的手法,比如上面的代码可读性很低,而且有些地方还很不完善,我在这里不多讲了,如果使用当前最为流行的jQuery的话,上述问题会很轻易的解决,我会在后面的博客贴上,jQuery版的,但是仅将js代码改版,希望本编文章能带给你们对ajax的原始体验.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值