跨浏览器兼容XPath

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
//跨浏览器返回XMLDOM对象
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){
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;
}
var xmlStr='<root><user id="5">Leee</user><user id="6">Koko</user></root>';
var xmlDom=getXMLDOM(xmlStr);


//节点集合
// var result=xmlDom.evaluate('root/user',xmlDom,null,XPathResult.ORDERED_NODE_ITERATOR_TYPE,null);
// alert(serializerXML(result.iterateNext()))
// if(result!=null){
// var nodes=[];
// var node=result.iterateNext();
// while(node!==null){
// nodes.push(node);
// node=result.iterateNext();
// }
// }

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

// 3.XPath跨浏览器兼容
// 思考:1.如果传递一个节点的下标,IE是从0开始计算,W3C从1开始计算,可以通过传递获取下标进行增1减1的操作来进行。
// 2.独有的功能放弃,为了保证跨浏览器。
// 3.只获取单一节点和节点列表即可,基本可以完成所有的操作

// 跨浏览器单一节点
// 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+']');
// // alert(xpath);
// }
// 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;
// }
// try{
// var node=selectSingleNode(xmlDom,'root/user[2]');
// alert(serializerXML(node));
// }catch(e){
// throw new Error('XPath有误!');
// }

// 跨浏览器节点集合
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+']');
// alert(xpath);
}
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 nodes=selectNodes(xmlDom,'root/user');
alert(nodes.length);
alert(serializerXML(nodes[0]));
alert(serializerXML(nodes[1]));
</script>
</head>
<body>
 
</body>
</html>
posted @ 2017-09-21 17:45  耿鑫  阅读(169)  评论(0编辑  收藏  举报