跨浏览器读取XML

这里跨浏览器,但是只能读取字符串XML文档,可以通过Ajax方式load一个XML文档,将文件XML转变为字符串

// 跨浏览器返回XML DOM对象
function getXMLDOM(xmlStr) {
	var xmlDom = null;

	if (typeof window.DOMParser != 'undefined') {
		xmlDom = (new DOMParser).parseFromString(xmlStr, 'text/xml');
		var errors = xmlDom.getElementsByTagName('parsererror');
		if (errors.length > 0) {
			throw new Error('错误信息:' + errors[0].textContent);
		}
	} else if (typeof window.ActiveXObject != 'undefined') {
		var version = ['MSXML2.DOMDocument6.0', 'MSXML2.DOMDocument3.0',
				'MSXML2.DOMDocument'];

		for (var i = 0; i < version.length; i++) {
			try {
				var xmlDom = new ActiveXObject(version[i]);
			} catch (e) {
				// 跳过
			}
		}
		xmlDom.loadXML(xmlStr);
		if (xmlDom.parseError != 0) {
			throw new Error('错误信息:' + xmlDom.parseError.reason);
		}
		return xmlDom;
	} else {
		throw new Error('您的系统或浏览器不支持XML DOM对象!');
	}

	return xmlDom;
}

序列化XML,序列号的意思,这里就不做解释了哈。

function serializerXML(xmlDom) {
    var xml = '';
    if (typeof window.XMLSerializer != 'undefined') {
        xml = (new XMLSerializer()).serializeToString(xmlDom);
    } else if (typeof xmlDom.xml != 'undefined') {
        xml = xmlDom.xml;
    }
    return xml;
}

现在XMLDOM获取到了,我们接下来获取节点,其中xpath为节点名称。

//跨浏览器单一节点
function selectSingleNode(xmlDom, xpath) {
	var node = null;
	if (typeof xmlDom.evaluate != 'undefined') {		//W3C
		var patten = /[(d+)]/;
		var flag = xpath.match(patten);
		var num = 0;
		if (flag !== null) {
			num = parseInt(RegExp.$1) + 1;
			xpath = xpath.replace(patten, '[' + num + ']');
		}
		var result = xmlDom.evaluate(xpath, xmlDom, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
		if (result !== null) {
			node = result.singleNodeValue;
		}
	} else if (typeof xmlDom.selectSingleNode != 'undefined') {		//IE
		node = xmlDom.selectSingleNode(xpath);
	}
	
	return node;
}

获取节点集合

//跨浏览器节点集合
function selectNodes(xmlDom, xpath) {
	var nodes = [];
	if (typeof xmlDom.evaluate != 'undefined') {		//W3C
		var patten = /[(d+)]/;
		var flag = xpath.match(patten);
		var num = 0;
		if (flag !== null) {
			num = parseInt(RegExp.$1) + 1;
			xpath = xpath.replace(patten, '[' + num + ']');
		}
		var result = xmlDom.evaluate(xpath, xmlDom, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
		if (result != null) {
			var node = null;
			while ((node = result.iterateNext()) !== null) {
				nodes.push(node);
			}
		}
	} else if (typeof xmlDom.selectNodes != 'undefined') {		//IE
		nodes = xmlDom.selectNodes(xpath);
	}
	
	return nodes;
}

  测试代码

var xmlStr = '<root><user id="5">Lee</user><user id="6">Koko</user></root>';
var xmlDom = getXMLDOM(xmlStr);
var nodes = selectNodes(xmlDom, 'root/user');
alert(nodes.length);
alert(serializerXML(nodes[0]));
alert(serializerXML(nodes[1]));

  

 

原文地址:https://www.cnblogs.com/jerfer/p/3482722.html