javascript xpath(二)

function createXMLDOM() {
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]);
		return xmlDom;
	
	}catch(e){
	
	}
}
	throw new Error("您的系统或浏览器不支持MSXML库!");
}

/*
//模拟loadXML()方法,可以简易的创建XML字符串
var xmlParser = new DOMParser();    
var xmlStr = "<root>\n\t<user>Lee</user>\n</root>";
var xmlDom = xmlParser.parseFromString(xmlStr,"text/xml");


//模拟.xml属性序列化字符串
var serializer = new XMLSerializer();
var xml = serializer.serializeToString(xmlDom);
var errors = xmlDom.getElementsByTagName("parsererror");

if(errors.length == 0) {
	alert(xml);
}else{
	throw new Error("错误信息:"+errors[0].textContent);
}
*/

//跨浏览器返回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;
}

//跨浏览器单一节点
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.ORDERED_NODE_ITERATOR_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]));

/*
try{
	var node = selectSingleNode(xmlDom,"root/user[2]");
	alert(serializerXML(node));

}catch(e){

	throw new Error("XPath有误!");
}
*/


/*
//两种方式创建XPathResult

//第一种方法
//单一节点,W3C的XPath下标从1开始
var eva = new XPathEvaluator();
var result = eva.evaluate("root/user[2]",xmlDom,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null);
if(result !== null) {
	alert(serializerXML(result.singleNodeValue));
}

//第二种方法
var result = xmlDom.evaluate("root/user",xmlDom,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null);
if(result !== null) {
	alert(serializerXML(result.singleNodeValue));
}
*/
/*
//节点集合
var result = xmlDom.evaluate("root/user[1]",xmlDom,null,XPathResult.ORDERED_NODE_ITERATOR_TYPE,null);

if(result != null){
	var nodes = [];
	var node = result.iterateNext();
	while(node !== null){
		nodes.push(node);
		node = result.iterateNext();
	}
}

alert(serializerXML(nodes[0]));
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值