论坛首页 Web前端技术论坛

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

浏览 2734 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-05-27   最后修改:2010-06-03
<!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>

   发表时间:2010-05-27  
建议代码美化一下
0 请登录后投票
   发表时间:2010-05-31  
不知道怎么在这个里面美化呢,呵呵!
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics