隨筆-84  評論-56  文章-0  trackbacks-0
           

          responseXML 將響應(yīng)解析為XML

          Ø 瀏覽器把XML 看作是遵循W3C DOM 的XML文檔。

          Ø W3C DOM 指定了一組很豐富的API ,可用于搜索和處理XML 文擋。

          W3C DOM

          Ø W3C 提供的定義:

          文檔對象模型(DOM) 是與平臺和語言無關(guān)的接口,允許程序和腳本動態(tài)地訪問和更新文檔的內(nèi)容、結(jié)構(gòu)和樣式。文檔可以進一步處理,處理的結(jié)果可以放回到所提供的頁面中。

          W3C DOM 和JavaScript區(qū)別?

          Ø DOM 是面向HTML 和XML 文檔的API,為文檔提供了結(jié)構(gòu)化表示,并定義了如何通過腳本來訪問文檔結(jié)構(gòu)。

          Ø JavaScript 則是用于訪問和處理DOM 的語言。

          Ø 如果沒有DOM , JavaScript 根本沒有Web 頁面和構(gòu)成頁面元素的概念。文檔中的每個元素都是DOM 的一部分,這就使得JavaScript 可以訪問元素的屬性和方法。

          DOM元素屬性

          Ø 用于處理XML 文擋的DOM 元素屬性:

          屬性名

          描述

          childNodes

          返回當(dāng)前元素的所有子元素的數(shù)組

          firstChild

          返回當(dāng)前元素的第一個下級子元素

          lastChild

          返回當(dāng)前元素的最后一個子元素

          nextSibling

          返回緊跟在當(dāng)前元素后面的元素

          nodeValue

          指定表示元素值得讀/寫屬性

          parentNode

          返回元素的父節(jié)點

          previousSibling

          返回緊鄰當(dāng)前元素之前的元素

          DOM元素方法

          Ø 用于遍歷XML文擋的DOM 元素方法

          方法名

          描述

          getElementById(id) (document)

          獲取有指定唯一ID屬性值文檔中的元素

          getElementsByTagName(name)

          返回當(dāng)前元素中有指定標(biāo)記名的子元素的數(shù)組

          hasChildNodes()

          返回一個布爾值,指示元素之否有子元素

          getAttribute(name)

          返回元素的屬性值,屬性由name指定

          DEMO responseXML + DOM

          Ø DEMO

          服務(wù)器返回的美國州名列表 parseXML.xml

          <?xml version="1.0" encoding="UTF-8"?>      

          <states>

              <north>

                  <state>Minnesota</state>

                  <state>Iowa</state>

                  <state>North Dakota</state>

              </north>

              <south>

                  <state>Texas</state>

                  <state>Oklahoma</state>

                  <state>Louisiana</state>

              </south>  

           <east>

                  <state>New York</state>

                  <state>North Carolina</state>

                  <state>Massachusetts</state>

            </east>

            <west>

                  <state>California</state>

                  <state>Oregon</state>

                  <state>Nevada</state>

              </west>

          </states>

          Ø parseXML.html內(nèi)容

          <html>

                   <head>

                             <title>Parsing XML Responses with the W3C DOM</title>

                             <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />

                             <script type="text/javascript">

          var xmlHttp;

          var requestType = "";

          function createXMLHttpRequest() {

              if (window.ActiveXObject) {

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

              } 

              else if (window.XMLHttpRequest) {

                  xmlHttp = new XMLHttpRequest();

              }

          }

          function startRequest(requestedList) {

              requestType = requestedList;

              createXMLHttpRequest();

              xmlHttp.onreadystatechange = handleStateChange;

              xmlHttp.open("GET", "parseXML.xml", true);

              xmlHttp.send(null);

          }

          function handleStateChange() {

              if(xmlHttp.readyState == 4) {

                  if(xmlHttp.status == 200) {

                      if(requestType == "north") {

                          listNorthStates();

                      }

                      else if(requestType == "all") {

                          listAllStates();

                      }

                  }

              }

          }

          function listAllStates() {

              var xmlDoc = xmlHttp.responseXML;

              var allStates = xmlDoc.getElementsByTagName("state");

              outputList("All States in Document", allStates);

          }

          function listNorthStates() {

              var xmlDoc = xmlHttp.responseXML;

              var northNode = xmlDoc.getElementsByTagName("north")[0];

                      var out = "Northern States";

              var northStates = northNode.getElementsByTagName("state");

              outputList("Northern States", northStates);

          }

          </script>

          </head>

          <body onload="startRequest();">

          </body>

          </html>

          使用W3C DOM 動態(tài)編輯頁面

          Ø 使用W3C DOM 動態(tài)編輯頁面

          Ø 動態(tài)創(chuàng)建內(nèi)容時所用的W3C DOM 屬性和方法

          屬性、方法名

          描述

          document.createElement(tagName)

          文檔對象上的createElement 方法可以創(chuàng)建由tagName指定的元素。如果以串div作為方法參數(shù),就會動態(tài)生成一個div元素

          document.createTextNode(data)

          文檔對象的createTextNode方法會創(chuàng)建一個包含靜態(tài)文本的節(jié)點

          <Element>.appendChild(newChild)

          appendChild方法將指定的節(jié)點增加到當(dāng)前元素的子節(jié)點列表(作為一個新的子節(jié)點。)例如,可以增加一個option元素,作為select元素的子節(jié)點

          <Element>. getAttribute(name)

          這個方法獲得元素中name屬性的值

          <Element>. setAttribute(name,value)

          這個方法設(shè)置元素中name屬性的值

          <Element>.insertBefore(newChild, refChild)

          這個方法將節(jié)點newChild作為當(dāng)前元素的子節(jié)點插入refChild元素前面

          <Element>.removeAttribute(name)

          這個方法從元素中刪除屬性name

          <Element>.removeChild(oldChild)

          這個方法從元素中刪除子元素oldChild

          <Element>.replaceChild(newChild, refChild)

          這個方法將節(jié)點refChild替換為節(jié)點newChild

          <Element>.hasChildNodes()

          這個方法返回一個布爾值,指示元素是否有子元素

          DEMO 使用responseXMLDOM 動態(tài)編輯頁面

          Ø dynamicContent.xml文件內(nèi)容

          <?xml version="1.0" encoding="UTF-8"?>

          <properties>

              <property>

                  <address>812 Gwyn Ave</address>

                  <price>$100,000</price>

                  <comments>Quiet, serene neighborhood</comments>

              </property>

              <property>

                  <address>3308 James Ave S</address>

                  <price>$110,000</price>

                  <comments>Close to schools, shopping,entertainment</comments>

              </property>

              <property>

                  <address>98320 County Rd 113</address>

                  <price>$115,000</price>

                  <comments>Small acreage outside of town</comments>

              </property>

          </properties>

          Ø 然后撰寫dynamicContent.html文件的內(nèi)容

          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

                  "http://www.w3.org/TR/html4/loose.dtd">

          <html>

          <head>

              <title>Dynamically Editing Page Content</title>

              <script type="text/javascript" language="javascript">

                  var xmlHttp;

                  function createXMLHttpRequest() {

                      if (window.ActiveXObject) {

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

                      } else if (window.XMLHttpRequest) {

                          xmlHttp = new XMLHttpRequest();

                      }

                  }

                  function doSearch() {

                      createXMLHttpRequest();

                      xmlHttp.onreadystatechange = handleStateChange;

                      xmlHttp.open("GET", "dynamicContent.xml", true);

                      xmlHttp.send(null);

                  }

                  function handleStateChange() {

                      if (xmlHttp.readyState == 4) {

                          if (xmlHttp.status == 200) {

                              clearPreviousResults();

                              parseResults();

                          }

                      }

                  }

                  function clearPreviousResults() {

                      var header = document.getElementById("header");

                      if (header.hasChildNodes()) {

                          header.removeChild(header.childNodes[0]);

                      }

                      var tableBody = document.getElementById("resultsBody");

                      while (tableBody.childNodes > 0) {

                          tableBody.removeChild(tableBody.childNodes[0]);

                      }

                  }

                  function parseResults() {

                      var results = xmlHttp.responseXML;

                      var property = null;

                      var address = "";

                      var price = "";

                      var comments = "";

                      var properties = results.getElementsByTagName("property");

                      for (var i = 0; i < properties.length; i++) {

                          property = properties[i];

                          address = property.getElementsByTagName("address")[0].firstChild.nodeValue;

                          price = property.getElementsByTagName("price")[0].firstChild.nodeValue;

                          comments = property.getElementsByTagName("comments")[0].firstChild.nodeValue;

                          addTableRow(address, price, comments);

                      }

                      var header = document.createElement("h2");

                      var headerText = document.createTextNode("Results:");

                      header.appendChild(headerText);

                      document.getElementById("header").appendChild(header);

                      document.getElementById("resultsTable").setAttribute("border", "1");

                  }

                  function addTableRow(address, price, comments) {

                      var row = document.createElement("tr");

                      var cell = createCellWithText(address);

                      row.appendChild(cell);

                      cell = createCellWithText(price);

                      row.appendChild(cell);

                      cell = createCellWithText(comments);

                      row.appendChild(cell);

                      document.getElementById("resultsBody").appendChild(row);

                  }

                  function createCellWithText(text) {

                      var cell = document.createElement("td");

                      var textNode = document.createTextNode(text);

                      cell.appendChild(textNode);

                      return cell;

                  }

              </script>

          </head>

          <body>

              <form action="#" >

                  <select>

                      <option value="50000">$50,000</option>

                      <option value="100000">$100,000</option>

                      <option value="150000">$150,000</option>

                  </select> to

                  <select>

                      <option value="100000">$100,000</option>

                      <option value="150000">$150,000</option>

                      <option value="200000">$200,000</option>

                  </select>

                  <input type="button" value="Search" onclick="doSearch();"/>

              </form>

              <span id="header"></span>

              <table id="resultsTable" width="75%" border="0">

                  <tbody id="resultsBody"></tbody>

              </table>

          </body>

          </html>

          Ø 運行界面,點擊“search”按鈕,如下圖:



           

          Ø 總結(jié):

          1、 parseResults 函數(shù)中使用XMLHttpRequest對象的responseXML 屬性得到的XML 文擋。

          2、 利用DOM方法來解析XML文檔。

          3、 addTableRow 函數(shù)建立一個表。

          4、 就這么多!你已經(jīng)成功地讀取了服務(wù)器返回的XML 文檔,而且動態(tài)創(chuàng)建了一個結(jié)果表。




          作者:周大慶(zhoudaqing)
          網(wǎng)址:http://www.aygfsteel.com/yifeng
          >>>轉(zhuǎn)載請注明出處!<<<

          posted on 2008-08-26 02:42 憶風(fēng) 閱讀(190) 評論(0)  編輯  收藏 所屬分類: Ajax
          主站蜘蛛池模板: 独山县| 黔江区| 宁海县| 武平县| 军事| 桐庐县| 广宁县| 南通市| 上林县| 沧源| 绥德县| 西峡县| 九江县| 含山县| 万荣县| 镇坪县| 罗山县| 五台县| 汨罗市| 泰州市| 台湾省| 三台县| 大城县| 犍为县| 孟连| 马鞍山市| 小金县| 邯郸县| 洞口县| 新营市| 任丘市| 合肥市| 枣阳市| 德江县| 丹棱县| 卢氏县| 夹江县| 南乐县| 宜城市| 郎溪县| 文水县|