日期:2014-05-16  浏览次数:20333 次

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