2016-05-05
XPath是JavaScript 中节点查找手段,ie9以后的版本才支持w3c标准,其他浏览器基本支持。在e8之前的浏览器,通过基于 activeX的xml dom对象实现。
为了便于测试先写出两个将xml字符串解析和将xml对象序列化的函数:
//解析xml字符串 function parseXML(xmlstr){ var doParse=new DOMParser(); var xmlDom=doParse.parseFromString(xmlStr,'text/xml'); return xmlDom; } //序列化字符串 function serializeXML(xmlDom){ var ser=new XMLSerializer(); var serString=ser.serializeToString(xmlDom); return serString; }
在ie9之前的浏览器中,实现xpath方法如下
对于获取单个节点
//获取单个节点 var node=xmlDom.selectSingleNode('root/user'); //用//可以忽略节点层次直接获取某个名称节点 //var node=xmlDom.selectSingleNode('//user[1]/text()'); //用/只能找到直系儿子,用//可以找到任意层次的后代, //var node=xmlDom.selectSingleNode('root//user[1]/text()'); //id获取某个节点 //var //node=xmlDom.selectSingleNode('root//user[@id=6]'); //获取同级第二个节点的文本 var node=xmlDom.selectSingleNode('root/user[1]/text()'); alert(serializeXML(node));
这个xml dom节点是上下文对象,节点默认指向root前,如果变动了节点指针位置,必须和路径相互配合好,不然会出错!!!
获取多个节点
var node=xmlDom.selectNodes('root/user'); alert(node.length);
标准w3c两种创建xml dom方法,利用两个对象XpathResult XpathEvaluator
//用第一种方法利用XPATHEVALUATOR XPathResult对象创建单一节点
var eva=new XPathEvaluator();
var result=eva.evaluate('root/user',xmlDom,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null);
alert(serializeXML(result));
//第二种方法创建多个节点即不用new 出XPathEvaluator 对象
var result1=xmlDom.evaluate('root/user',xmlDom,null,XPathResult.ORDERED_NODE_ITERATOR_TYPE,null);
//创建一个节点数组存放多个节点
if(result1!=null)
{
var nodes=[];
var node=result1.iterateNext();
while(node!==null)
{
nodes.push(node);
node=result1.iterateNext();
}
}
alert(parseXML(nodes[1]));
);