计算机故障交流论坛
域名注册

不同浏览器的XMLDOM 对象

发表时间:09-6-12   来源:计算机故障网   点击:

不同浏览器的XMLDOM 对象

 一 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("<root></root>"); 

然后这个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出:<root><child/><child/></root>

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.             

二.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); 

这段代码创建了一个<a0:root xmlns="http://www.rubyeye.net"/>的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.onload=function(){  
  2. alert("done");  
  3. }  
  4. oXmlDom.load("test.xml"); 

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

  1. var oParser=new DOMParser();  
  2. var oXmlDom=oParser.parseFromString("<root><child/></root>,"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文档内容。

第1页:不同浏览器的XMLDOM 对象(1)   第2页:不同浏览器的XMLDOM 对象(2)  

© CopyRight 2008-2010, JSJGZ.CN, 计算机故障 Inc. All Rights Reserved

闽ICP备09000710号 增值电信业务经营许可证闽B2-20080004号 Rss订阅