XML中用XPath方式查找节点
一、在IE8及之前的IE浏览器,XPath是采用内置基于ActiveX的XML DOM文档对象实现的。
在每一个节点上提供了两个方法:selectSingleNode()和selectNodes()。
selectSingleNode()方法接受一个XPath模式(也就是查找路径),找到匹配的第一个节点并将它返回,没有则返回null。
var user = xmlDom.selectSingleNode('root/user'); //得到第一个user节点
alert(user.xml); //查看xml序列
我们通过xmlDom这个对象实例调用方法,而xmlDom这个对象实例其实就是一个上下文节点,这个节点指针指向的是根,也就是root元素之前。那么如果我们把这个指针指向user元素之前,那么结果就会有所变化。
通过xmlDom.documentElement,并且使用user路径,省去了root
var user = xmlDom.documentElement.selectSingleNode('user');
通过xmlDom,并且使用user路径,省去了root
var user = xmlDom.selectSingleNode('user');
alert(user.tagName); //找不到了,出错
xmlDom和xmlDom.documentElement都是上下文节点,主要就是定位当前路径查找的指针,而xmlDom对象实例的指针就是在最根上。
XPath常用语法
通过user[n]来获取第n+1条节点,XPath其实是按1为起始值的
var user = xmlDom.selectSingleNode('root/user[1]');
alert(user.xml);
通过text()获取节点内的值
var user = xmlDom.selectSingleNode('root/user/text()');
alert(user.xml);
alert(user.nodeValue);
通过//user表示在整个xml获取到user节点,不关心任何层次
var user = xmlDom.selectSingleNode('//user');
通过root//user表示在root包含的层次下获取到user节点,在root内不关心任何层次
var user = xmlDom.selectSingleNode('root//user');
通过root/user[@id=6]表示获取user中id=6的节点
var user = xmlDom.selectSingleNode('root/user[@id=6]');
selectSingleNode()方法是获取单一节点,而selectNodes()方法则是获取一个节点集合。
var users = xmlDom.selectNodes('root/user'); //获取user节点集合
alert(users[1].xml);
二、W3C下的XPath
在DOM3级XPath规范定义的类型中,最重要的两个类型是XPathEvaluator和XPathResult。其中,XPathEvaluator用于在特定上下文对XPath表达式求值。
XPathEvaluator的方法:
evaluate(e, c, n ,t ,r):结合上下文来获取XPath表达式的值
createExpression(e, n):将XPath表达式及命名空间转化成XPathExpression
createNSResolver(n):根据n命名空间创建一个新的XPathNSResolver对象
W3C实现XPath查询节点比IE来的复杂,首先第一步就是需要得到XPathResult对象的实例。得到这个对象实例有两种方法,一种是通过创建XPathEvaluator对象执行evaluate()方法,另一种是直接通过上下文节点对象(比如xmlDom)来执行evaluate()方法。
使用XPathEvaluator对象创建XPathResult:
var eva = new XPathEvaluator();
var result = eva.evaluate('root/user', xmlDom, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
alert(result);
使用上下文节点对象(xmlDom)创建XPathResult:
var result = xmlDom.evaluate('root/user', xmlDom, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
alert(result);
相对而言,第二种简单方便一点,evaluate方法有五个属性:
1.XPath路径
2.上下文节点对象
3.命名空间求解器(通常是null)
4.返回结果类型
5保存结果的XPathResult对象(通常是null)
第4个参数中的返回的结果类型,有10中不同的类型
XPathResult.ANY_TYPE:返回符合XPath表达式类型的数据
XPathResult.ANY_UNORDERED_NODE_TYPE:返回匹配节点的节点集合,但顺序可能与文档中的节点的顺序不匹配
XPathResult.BOOLEAN_TYPE:返回布尔值
XPathResult.FIRST_ORDERED_NODE_TYPE:返回只包含一个节点的节点集合,且这个节点是在文档中第一个匹配的节点
XPathResult.NUMBER_TYPE:返回数字值
XPathResult.ORDERED_NODE_ITERATOR_TYPE:返回匹配节点的节点集合,顺序为节点在文档中出现的顺序。这是最常用到的结果类型
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE:返回节点集合快照,在文档外捕获节点,这样将来对文档的任何修改都不会影响这个节点列表
XPathResult.STRING_TYPE:返回字符串值
XPathResult.UNORDERED_NODE_ITERATOR_TYPE:返回匹配节点的节点集合,不过顺序可能不会按照节点在文档中出现的顺序排列
XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE:返回节点集合快照,在文档外捕获节点,这样将来对文档的任何修改都不会影响这个节点列表
上面的常量过于繁重,常用的也就两个:1.获取一个单一节、2.获取一个节点集合。
获取一个单一节点
var result = xmlDom.evaluate('root/user', xmlDom, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
if (result !== null) {alert(result.singleNodeValue.tagName);} //singleNodeValue属性得到节点对象
获取节点集合
var result = xmlDom.evaluate('root/user', xmlDom, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
var nodes = [];
if (result !== null) {
while ((node = result.iterateNext()) !== null) {
nodes.push(node);
}
}