`

IE和Mozilla中都能运行的javascript的xml解析代码

阅读更多
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
	<HEAD>
		<TITLE>New Document</TITLE>
		<script type="text/javascript">
	if(document.implementation && document.implementation.createDocument){
		alert('运行了Mozilla');
		/*因为Mozilla中不支持readyState和onreadystatechange特性
		 *所以要为Mozilla定义这些属性
		 */
		Document.prototype.readyState = 0;
		Document.prototype.onreadystatechange = null;
		/*因为Mozilla中不能监听事件状态
		 *所以要为Mozilla创建监听事件状态私有方法
		 */
		Document.prototype._changeReadyState_ = function(iReadyState){
			this.readyState = iReadyState;
			if(typeof this.onreadystatechange == "function"){
				this.onreadystatechange();
			}
		};
		//初始化错误变量
		Document.prototype._initError_=function(){
			this.parseError.errorCode = 0;
			this.parseError.filepos = -1;
			this.parseError.line = -1;
			this.parseError.linepos = -1;
			this.parseError.reason = null;
			this.parseError.srcText = null;
			this.parseError.url = null;
		};
		/*为Document对象赋上_checkForErrors_私有原型属性
		 *判断是否XML解析错误,如果解析错误,得到各个错误信息
		 */
		Document.prototype._checkForErrors_ = function(){
			/*
			 *因为Mozilla中如果解析XML错误后不会报错,而是直接显示出错误(判断oXmlDom.documentElement.tagName == *'parsererror')即可
			 */
			if(this.documentElement.tagName == 'parsererror'){
				var reError = />([\s\S]*?)Location:([\s\S]*?)Line Number (\d+), Column(\d+):<sourcetext>([\s\S]*?)(?:\-*\^)/;
				reError.test(this.xml);
				this.parseError.errorCode = -999999;
				this.parseError.reason = RegExp.$1;
				this.parseError.url = RegExp.$2;
				this.parseError.line = parseInt(RegExp.$3);
				this.parseError.linepos = parseInt(RegExp.$4);
				this.parseError.srcText = RegExp.$5;
			}
		};
		//Mozilla中五种状态的模拟,将字符串转化成xml
		Document.prototype.loadXML = function(sXml){
			this._initError_();
			//即将开始载入
			this._changeReadyState(1);
			var oParser = new DOMParser();
			//Mozilla中将字符串转化成xml对象
			var oXmlDom = oParser.parseFromString(sXml,"text/xml");
			//清空Docuemnt
			while(this.firstChild){
				this.removeChild(this.firstChild);
			}
			for(var i=0;i<oXmlDom.childNodes.length;i++){
				//将字符串转化的xml对象的结点导入到文档对象中
				var oNewNode = this.importNode(oXmlDom.childNodes[i],true);
				this.appendChild(oNewNode);
			}
			//判断是否有错误
			this._checkForErrors_();
			//载入完成
			this._changeReadyState(4);
		};
		//Mozilla中原始load,直接读取xml文件,将Mozilla中本身拥有的load方法的引用存起来
		Document.prototype._load_ = Document.prototype.load;
		//Mozilla中模拟load,定义新的Mozilla的load方法
		Document.prototype.load = function(sURL){
			//初始化错误
			this._initError_();
			this._changeReadyState_(1);
			//调用本身已有的load方法
			this._load_(sURL);
		};
		/*因为Mozilla没有Node.xml这个方法获得某个结点的xml字符串
		 *所以我们用Mozilla的_defineGetter_方法将xml特性和对应的方法绑定在一起
		 *
		 */
		Node.prototype.__defineGetter__('xml',function(){
			var oSerializer = new XMLSerializer();
			//将这个xml对象转换成字符串    
			return oSerializer.serializeToString(this,"text/xml");
		});

	}
		//此方法是从IE和Mozilla浏览器中得到xmldom对象,并返回xml对象oXmlDom
	function XmlDom(){
		if(window.ActiveXObject){
			alert('创建了IE的xml对象');
			//IE中xml对象的各个版本
			var arrSignatures	=['MSXML2.DOMDocument.5.0','MSXML2.DOMDocument.4.0','MSXML2.DOMDocument.3.0','MSXMS2.DOMDocument','Microsoft.XmlDom'];
			for(var i=0;i < arrSignatures.length;i++){
				try{
					//IE中创建基于ActiveX的ActiveXObject对象
					var oXmlDom = new ActiveXObject(arrSignatures[i]);
					return oXmlDom
				}catch(oError){
					//抛出异常
					throw new Error("无法创建IE的"+arrSignatures[i]+"版本的ActiveXObject对象");
				}
			}
		}else if(document.implementation && document.implementation.createDocument){
			alert('创建了Mozilla的xml对象');
			//创建Mozilla的XML DOM对象
			var oXmlDom = document.implementation.createDocument('','',null);
			/*IE中XML的错误特性是parseError,对parseError自身取值,返回的是errorCode代码,不等于0则表示没有错误
			 *因为Mozilla中如果解析XML错误后不会报错,而是直接显示出错误(判断oXmlDom.documentElement.tagName == *'parsererror')
			 *所以要给Mozilla的XML对象创建parseError属性,并重写valueOf和toString方法
			 */
			oXmlDom.parseError = {
				//直接返回错误代码
				valueOf:function(){
					return this.errorCode;
				},
				//返回错误信息
				toString:function(){
					return this.errorCod.toString()
				}
			};
			/*当IE和Mozilla的XML对象都有parseError属性后
			 *初始化parseError的各个属性的初始值
			 */
			oXmlDom._initError_();
			/*因为Mozilla的load没有改变事件状态,所以我们自己加上事件状态部分
			 *在Mozilla的对象创建完后,调用load方法时,如果成功将状态改为4,即完全加载完成状态
			 */
			oXmlDom.addEventListener("load",function(){
				this._checkForErrors_();
				this._changeReadyState_(4);
			},false);
			return oXmlDom;
		}else{
			throw new Error("Your browser doesn't support an XML DOM object");
		}
	}

		var oXmlDom = new XmlDom();
		oXmlDom.onreadystatechange = function(){
			alert('事件状态监听:'+oXmlDom.readyState);
			if(oXmlDom.readyState == 4){
				if(oXmlDom.parseError !=0){
					alert('错误信息\n'+oXmlDom.parseError);
					var oError = oXmlDom.parseError;
					alert('An error occurred:\nError Cod:'+oError.errorCode+'\nLine:'+oError.line+'\nLine Pos:'+oError.linepos+'\nReason:'+oError.reason);
				}else{
					alert('加载成功');
				}
			}
		}
		oXmlDom.async = false;
		oXmlDom.load('test.xml');
		alert('将oXmlDom对象转换成字符串:\n'+oXmlDom.xml);
  </script>
	</HEAD>

	<BODY>

		<input type="text" value="123"></input>
	</BODY>
</HTML>

分享到:
评论
2 楼 zheng12tian 2010-05-31  
不知道怎么在这个里面美化呢,呵呵!
1 楼 congdepeng 2010-05-27  
建议代码美化一下

相关推荐

    兼容Firefox的Javascript XSLT 处理XML文件

    Firefox和IE在处理XML和XSLT上有所不同,但通过编写兼容性的代码,可以确保在不同浏览器中都能达到相同的效果。在实际开发过程中,应充分测试代码以确保跨浏览器的兼容性,以提供更佳的用户体验。

    AJAX 常用函数创建XMLHTTP对象,区别IE,Mozilla浏览器

    这段代码会尝试创建`Msxml2.XMLHTTP`对象,如果失败则尝试创建`Microsoft.XMLHTTP`对象,以确保在不同版本的IE中都能正常工作。 接下来,我们将看到两个函数,分别用于获取服务器响应的文本和XML形式的数据: 1. `...

    AJAX应用的通用流程

    例如,在Internet Explorer(IE)中,XMLHttpRequest对象的创建需要通过ActiveXObject来实现,这是因为IE使用MSXML解析器处理XML。清单3展示了如何在IE中创建XMLHttpRequest对象的代码,它包含两部分尝试:首先尝试...

    sql+xml+firefox

    8. **DOM(文档对象模型)**:将XML视为树形结构,方便程序进行解析和操作。 **Firefox浏览器** Firefox是由Mozilla开发的开源网络浏览器,注重隐私和安全。其特性包括: 1. ** Gecko渲染引擎**:Firefox的核心,...

    纯css-loading兼容Safari ,Chrome,Mozilla Firefox,opera,ie10+

    本文将详细探讨如何创建一个兼容多种浏览器的纯CSS加载动画,包括Safari、Chrome、Mozilla Firefox、Opera以及IE10及以上的版本。 首先,我们需要了解CSS的特性。CSS(Cascading Style Sheets)是一种样式表语言,...

    最新Ajax题材

    为了跨浏览器兼容性,通常会编写一段检查和创建XMLHttpRequest对象的代码,确保在各种浏览器中都能正常工作。 在实际开发中,开发者还需要注意处理XMLHttpRequest对象的生命周期,包括打开连接、设置请求方法、URL...

    ajax学习资料总结

    由于不同浏览器对XMLHttpRequest对象的实现方式不同,通常需要编写兼容代码来确保在所有浏览器中都能正常工作。比如,Internet Explorer使用ActiveXObject,其他浏览器使用内建的XMLHttpRequest对象。使用try-catch...

    XUL - XML UI Language-开源

    测试套件的使用有助于开发者发现并修复兼容性问题,确保他们的XUL应用程序在各种环境中都能正常运行。 XUL的开放源代码展示示例,也被称为蓝图,是学习和理解XUL功能和潜力的重要资源。这些示例通常包含了丰富的...

    xulrunner-1.8.1.2pre.en-US.win32.zip

    XULRunner是一个开源的运行时环境,由Mozilla基金会开发,用于执行使用XUL(XML User Interface Language)构建的应用程序。XUL是一种标记语言,类似于HTML,但专为创建跨平台的图形用户界面而设计。在XULRunner的...

    ExtJS下书写动态生成的xml(兼容火狐)

    由于旧版IE浏览器通过`ActiveXObject`来创建XML文档,而标准的DOM方法在所有现代浏览器中都是通用的,因此我们需要兼容这两类浏览器的差异。在代码中,应该检测浏览器的类型,并执行相应的操作。例如,如果代码是为...

    Ajax的基础应用

    此外,为了确保在所有浏览器中都能正常工作,需要编写兼容性良好的代码,如上述示例中创建XMLHttpRequest对象的代码,通过检查浏览器特性来选择正确的创建方法。 ### 总结 Ajax技术使得网页能够无刷新地更新内容,...

    Java SE 6: Top 10 Features

    这一目标体现在对现有特性的优化和新功能的加入上,确保Java应用程序在不同的环境中都能保持一致的表现。 总之,Java SE 6的这十大特性共同构成了一个强大而灵活的开发平台,为开发者提供了广泛的可能性,同时也...

    Ajax简介属性介绍操作实例及其源码[定义].pdf

    它在所有主流浏览器中都有支持,包括Internet Explorer 5.0+、Safari 1.2、Mozilla 1.0 / Firefox、Opera 8+ 和Netscape 7。通过这个对象,我们可以创建一个函数来处理服务器的响应,比如Google Suggest就是一个很好...

    掌握 Ajax\掌握 Ajax第 5 部分-操纵 DOM

    无论是在Apple's Safari、Firefox、Microsoft Internet Explorer还是Mozilla等不同浏览器环境下,DOM都确保了代码的一致性和兼容性。 #### 跨浏览器与跨语言的DOM DOM作为一种标准,得到了几乎所有现代Web浏览器的...

    i-dont-know-what-to-do:帮我一个人

    3. **AJAX**:异步JavaScript和XML,用于实现无刷新的数据交换,提高用户体验。 4. **ES6及以上版本的新特性**:如箭头函数、模板字符串、Promise、async/await等,这些都是现代JavaScript开发的必备知识。 5. **...

    三种方式获取XMLHttpRequest对象

    XMLHttpRequest(XHR)是Web开发中的一个关键技术,它允许JavaScript在不刷新整个页面的情况下与服务器进行异步数据交换,这就是我们常说的AJAX(Asynchronous JavaScript and XML)。本篇文章将详细解析获取...

    AJAX介绍

    AJAX(Asynchronous JavaScript and XML)是一种用于创建交互式网页应用的技术,它允许网页在不重新加载整个页面的情况下与服务器交换数据并更新部分网页内容。AJAX 的出现极大地提升了用户体验,因为它使得用户能够...

    嵌入浏览器需要.rar

    `xulrunner`是Mozilla Firefox的一个组件,用于运行XUL(XML User Interface Language)应用程序,它包含了运行Web内容所需的基础结构。在SWT中嵌入浏览器时,有时会用到XULRunner作为WebKit或Gecko渲染引擎的后端,...

    js取得2008奥运金牌排名

    - **IE和Mozilla浏览器标识**:`/msie/`表示Internet Explorer,`/gecko/`表示基于Gecko引擎的浏览器,如Firefox。 ### 2. 动态加载JavaScript文件 动态加载JavaScript文件是一种常见的技术,可以用来实现按需加载...

Global site tag (gtag.js) - Google Analytics