兼容所有浏览器加载xml文件的代码

2009-03-10 16:44:17 作者:Movsesyan Gregory | 【

js操作xml文件的一个很严重的问题是浏览器的兼容性,SoftXMLLib脚本库的目的就是在不同的浏览器中创建XMLHTTP 和 XMLDOM 对象,脚本库包含了最基本函数和属性,Microsoft.XMLDOM ActiveXObject对象里面有的功能,在这个库里都有

脚本库的全部代码如下

var ajaxObj=null;
var xmlDOMObj=null;
	
function createAjaxObject(){
		if(window.XMLHttpRequest){
			 try {
				  ajaxObj = new XMLHttpRequest(); 
			 }
			 catch(e) {
				  alert("Problem creating AJAX!");
  		}
		}
		else {
			 try {
				  ajaxObj = new ActiveXObject("Microsoft.XMLHTTP");
			 }
			 catch(e) {
				  alert("Problem creating AJAX!");
			 }	
		}
		return ajaxObj;
}

window.onerror = errorHandler;

function errorHandler(message, url, line) {
		alert("Error loading file!");
		return true;
}

var doc;

function load(xmlfile) {
		if (document.implementation && document.implementation.createDocument) {
				xmlDOMObj = document.implementation.createDocument("", "", null);
				xmlDOMObj.async=false;
		} else if (window.ActiveXObject) {
				xmlDOMObj = new ActiveXObject("Microsoft.XMLDOM");
				xmlDOMObj.async=false;
		} else {
				alert('Your browser can\'t handle this script');
				return;
		}
		l=xmlDOMObj.load(xmlfile);
		if(!l) {
				this.loadError = 1;
		} else {
				SoftXMLLib.prototype.documentElement = xmlDOMObj.documentElement;
		}
}
	
function loadXML(xmlString){
		if (document.implementation && document.implementation.createDocument) {
				var parser = new DOMParser();
				try {
					 var doc = parser.parseFromString(xmlString, "text/xml");
				}
				catch(e){alert("XML file is not valid!");};	
				if(doc.documentElement.nodeName=="parsererror") {
					 this.loadXMLError = 1;
				} else {
					 SoftXMLLib.prototype.DOM = doc;
					 SoftXMLLib.prototype.documentElement = doc.documentElement;
				}
		} else if (window.ActiveXObject) {
		  xmlDOMObj = new ActiveXObject("Microsoft.XMLDOM");
		  xmlDOMObj.async=false;
		  l = xmlDOMObj.loadXML(xmlString);
				if(!l){
			   this.loadXMLError = 1;
	 } else {
			 SoftXMLLib.prototype.DOM = xmlDOMObj;
			 SoftXMLLib.prototype.documentElement = xmlDOMObj.documentElement;
		}
	 } else {
		  alert('Your browser can\'t handle this script');
		  return;
		}
}
	
function selectNodes(xpath){
		var selectedNodes = new Array();
		doc = this.documentElement;
		if(doc==null){
				alert("Error loading file!");
				return;
		}
			
		if(document.all){
				var cxpath = new String(xpath).toLowerCase();
				f = doc.selectNodes(xpath);
				for(var i=0;i<f.length;i++) {
					 var elemattr="";
					 var curAttributes = f[i].attributes;
					 if(curAttributes.length>0) {
						  for(y=0;y<curAttributes.length;y++) {
							   if(y<curAttributes.length-1) {
								    var dt=",";
							   } else {
								    var dt="";
							 }
							 elemattr+=curAttributes[y].nodeName + ":\"" + curAttributes[y].nodeValue + "\"" + dt;
						}
				}
				var t = eval("[{" + elemattr + "}]");
				if(f[i].parentNode.nodeName == this.documentElement.nodeName){
						this.self = f[i];
				} else {
						this.self = f[i].parentNode;
				}
				selectedNodes[selectedNodes.length] = {innerText:f[i].text,attributes:t,self:this.self};
		}
		return selectedNodes;
		} else {
				if(navigator.userAgent.indexOf("Firefox")!=-1){
					 var versionindex=navigator.userAgent.indexOf("Firefox")+8
					 if (parseInt(navigator.userAgent.charAt(versionindex))>=1)
					 var xpe = new XPathEvaluator();
					 var nsResolver = xpe.createNSResolver(doc.ownerDocument.documentElement);
					 var headings = xpe.evaluate(xpath, doc, nsResolver, 0, null);
		} else {
					var headings = document.evaluate(xpath, doc, null, XPathResult.ANY_TYPE,null);
		}
		var thisHeading = headings.iterateNext();
		while (thisHeading) {
				var elemattr="";
				var curAttributes = thisHeading.attributes;
				if(curAttributes.length>0) {
						for(var i=0;i<curAttributes.length;i++) {
							 if(i<curAttributes.length-1) {
								  var dt=",";
							 } else {
								  var dt="";
							 }
						elemattr+=thisHeading.attributes[i].nodeName + ":\"" + thisHeading.attributes[i].nodeValue + "\"" + dt;
				}
		}	
		var t = eval("[{" + elemattr + "}]");
				if(thisHeading.parentNode.nodeName == this.documentElement.nodeName) {
						this.self = thisHeading;
				} else {
						this.self = thisHeading.parentNode;
				}
				selectedNodes[selectedNodes.length] = {innerText:thisHeading.textContent,attributes:t,self:this.self};
				thisHeading = headings.iterateNext();
				}
				return selectedNodes;
		};
}
	
function Decode(str) {
		var decoded = "";
		var curStr = new String(str);
		var spl = curStr.split(",");
		for(var i=0;i<spl.length;i++) {
			 decoded+=String.fromCharCode(spl[i])
		}
		return decoded;
}

function Encode(str){
		var encoded = "";
		var curStr = new String(str);
		for(var i=0;i<curStr.length;i++){
			 if(i<curStr.length-1){
				  var dt=",";
			 } else {
				  var dt="";
			 }
		  encoded+=curStr.charCodeAt(i) + dt;
		}
		return encoded;
}
	
function SoftXMLLib(){
		this.createAjaxObject = createAjaxObject;
		this.loadXMLError = 0;
		this.loadError = 0;
		this.load = load;
		this.selectNodes = selectNodes;
		this.loadXML = loadXML;
		this.self = null;
		this.Decode = Decode;
		this.Encode = Encode;
	}



调用方法:
把脚本保存到SoftXMLLib.js文件,然后在网页<head>取功过一下代码调用
<script type="text/javascript" src="SoftXMLLib.js"></script>

相关资源