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>




