Hopes

          Start Here..

           

          兼容IE、FireFox、Chrome等瀏覽器的xml處理函數(shù)js代碼

          在編寫(xiě)處理xml的網(wǎng)頁(yè)時(shí),經(jīng)常為瀏覽器兼容性頭疼。于是我將常用的xml操作封裝為函數(shù)。經(jīng)過(guò)一段時(shí)間的改進(jìn),現(xiàn)在已經(jīng)很穩(wěn)定了,用起來(lái)很舒服。
          函數(shù)有——
          xml_loadFile:xml同步/異步加載。
          xml_transformNode:xsl轉(zhuǎn)換。
          xml_text:節(jié)點(diǎn)的文本。
          selectSingleNode:根據(jù)XPath選擇單個(gè)節(jié)點(diǎn)。
          selectNodes:根據(jù)XPath選擇多個(gè)節(jié)點(diǎn)。
          全部代碼(zyllibjs_xml.js)——
          zyllibjs_xml 
          XML處理 
          @author zyl910 
          注意—— 
          1. Chrome 由于其安全機(jī)制限制, 不能讀取本地文件。 
          Reference 
          ~~~~~~~~~ 
          http:
          //www.jinlie.net/?p=302 
          Chrome瀏覽器加載XML文檔 
          Update 
          ~~~~~~ 
          [
          2011-11-02
          定義。 
          [
          2011-11-09
          xml_loadFile: 為回調(diào)函數(shù)加上isError參數(shù)。 
          [
          2011-11-21
          selectSingleNode 
          selectNodes 
          */ 
          // 加載XML文件并返回XML文檔節(jié)點(diǎn) 
          // return: 成功時(shí)返回一個(gè)對(duì)象(同步模式下返回xml文檔對(duì)象,異步模式下返回操作對(duì)象),失敗時(shí)返回空。 
          // xmlUrl: xml文件的url。 
          // funcAsync: 回調(diào)函數(shù). function onload(xmlDoc, isError){  } 
          function xml_loadFile(xmlUrl, funcAsync) 

          var xmlDoc 
          = null
          var isChrome 
          = false
          var asyncIs 
          = (null!=funcAsync); // 是否是異步加載。當(dāng)funcAsync不為空時(shí),使用異步加載,否則是同步加載。 
          // 檢查參數(shù) 
          if (""==xmlUrl) return null
          if (asyncIs) 

          if ("function"!=typeof(funcAsync)) return null

          // 創(chuàng)建XML對(duì)象 
          try 

          xmlDoc 
          = new ActiveXObject("Microsoft.XMLDOM"); // Support IE 

          catch(ex) 


          if (null==xmlDoc) 

          try 

          // Support Firefox, Mozilla, Opera, etc 
          xmlDoc = document.implementation.createDocument(""""null); // 創(chuàng)建一個(gè)空的 XML 文檔對(duì)象。 

          catch(ex) 



          if (null==xmlDoc) return null
          // 加載XML文檔 
          xmlDoc.async = asyncIs; 
          if (asyncIs) 

          if(window.ActiveXObject) 

          xmlDoc.onreadystatechange 
          = function(){ 
          if(xmlDoc.readyState == 4

          var isError 
          = false
          if (null!=xmlDoc.parseError) 

          isError 
          = (0!=xmlDoc.parseError.errorCode); // 0成功, 非0失敗。 

          funcAsync(xmlDoc, isError); 



          else 

          xmlDoc.onload 
          = function(){ 
          funcAsync(xmlDoc, 
          false); 



          try 

          xmlDoc.load(xmlUrl); 

          catch(ex) 

          // alert(ex.message) // 如果瀏覽器是Chrome,則會(huì)catch這個(gè)異常:Object # (a Document) has no method "load" 
          isChrome = true
          xmlDoc 
          = null

          if (isChrome) 

          var xhr 
          = new XMLHttpRequest(); 
          if (asyncIs) // 異步 

          xhr.onreadystatechange 
          = function(){ 
          if(xhr.readyState == 4

          funcAsync(xhr.responseXML, xhr.status 
          != 200); 


          xhr.open(
          "GET", xmlUrl, true); 
          try // 異步模式下,由回調(diào)函數(shù)處理錯(cuò)誤。 

          xhr.send(
          null); 

          catch(ex) 

          funcAsync(
          nulltrue); 
          return null

          return xhr; // 注意:返回的是XMLHttpRequest。建議異步模式下僅用null測(cè)試返回值。 

          else // 同步 

          xhr.open(
          "GET", xmlUrl, false); 
          xhr.send(
          null); // 同步模式下,由調(diào)用者處理異常 
          xmlDoc = xhr.responseXML; 


          return xmlDoc; 

          // 使用XSLT把XML文檔轉(zhuǎn)換為一個(gè)字符串。 
          function xml_transformNode(xmlDoc, xslDoc) 

          if (null==xmlDoc) return ""
          if (null==xslDoc) return ""
          if (window.ActiveXObject) // IE 

          return xmlDoc.transformNode(xslDoc); 

          else // FireFox, Chrome 

          //定義XSLTProcesor對(duì)象 
          var xsltProcessor=new XSLTProcessor(); 
          xsltProcessor.importStylesheet(xslDoc); 
          // transformToDocument方式 
          var result=xsltProcessor.transformToDocument(xmlDoc); 
          var xmls
          =new XMLSerializer(); 
          var rt 
          = xmls.serializeToString(result); 
          return rt; 


          // 得到節(jié)點(diǎn)的文本 
          function xml_text(xmlNode) 

          if (null==xmlNode) return ""
          var rt; 
          if (window.ActiveXObject) // IE 

          rt 
          = xmlNode.text; 

          else 

          // FireFox, Chrome,  
          rt = xmlNode.textContent; 

          if (null==rt) rt=xmlNode.nodeValue; // XML DOM 
          return rt; 

          // 添加方法。為了兼容FireFox、Chrome。 
          if (!window.ActiveXObject) 

          XMLDocument.prototype.selectSingleNode 
          = Element.prototype.selectSingleNode = function (xpath) 

          var x 
          = this.selectNodes(xpath) 
          if ( ! x || x.length < 1 ) return null ; 
          return x[ 0 ]; 

          XMLDocument.prototype.selectNodes 
          = Element.prototype.selectNodes = function (xpath) 

          var xpe 
          = new XPathEvaluator(); 
          var nsResolver 
          = xpe.createNSResolver( this.ownerDocument == null?this.documentElement : this.ownerDocument.documentElement); 
          var result 
          = xpe.evaluate(xpath, this , nsResolver, 0 , null ); 
          var found 
          = []; 
          var res; 
          while (res = result.iterateNext()) 
          found.push(res); 
          return found; 

          }




          Chrome瀏覽器加載XML文檔 
          Chrome瀏覽器不支持load方法加載XML文檔。網(wǎng)上找了下,需要如下解決: 
          復(fù)制代碼
           代碼如下:

          function loadXMLDoc(xml_name) 

          var xmlDoc; 
          try 

          xmlDoc 
          = new ActiveXObject("Microsoft.XMLDOM"); // Support IE 
          } 
          catch(e) 

          try 

          // Support Firefox, Mozilla, Opera, etc 
          xmlDoc = document.implementation.createDocument(""""null) ;// 創(chuàng)建一個(gè)空的 XML 文檔對(duì)象。 

          catch(e) 

          alert(e.message); 


          // 加載XML文檔 
          try 

          xmlDoc.async 
          = false// 關(guān)閉異步加載 
          xmlDoc.load(xml_name); 

          catch(e) 

          // alert(e.message) 如果瀏覽器是Chrome,則會(huì)catch這個(gè)異常:Object # (a Document) has no method "load",所以,以下實(shí)現(xiàn)支持chrome加載XML文檔(只是粗略的寫(xiě)下) 
          var xhr = new XMLHttpRequest(); 
          xhr.open(
          "GET", xml_name, false); 
          xhr.send(
          null); 
          xmlDoc 
          = xhr.responseXML.documentElement; 

          return xmlDoc; 


          BTW,各瀏覽器加載XML字符串也不同。 
          IE使用 loadXML() 方法來(lái)解析 XML 字符串: 
          復(fù)制代碼
           代碼如下:
          xmlDoc.loadXML(xml_str);

          posted on 2012-11-16 21:07 ** 閱讀(526) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          統(tǒng)計(jì)

          公告

          你好!

          常用鏈接

          留言簿(2)

          隨筆檔案

          文章分類

          文章檔案

          新聞檔案

          相冊(cè)

          收藏夾

          C#學(xué)習(xí)

          友情鏈接

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 靖宇县| 长沙县| 工布江达县| 云阳县| 鲁山县| 柳林县| 甘孜县| 白城市| 浦东新区| 昂仁县| 阿克苏市| 卢湾区| 娱乐| 白城市| 黄骅市| 塘沽区| 平凉市| 盐津县| 信丰县| 中西区| 吴川市| 勃利县| 申扎县| 英德市| 历史| 深圳市| 苗栗市| 湘潭市| 中宁县| 徐州市| 海丰县| 勐海县| 青龙| 锡林浩特市| 改则县| 陇南市| 民县| 凤凰县| 新乡市| 商城县| 祁东县|