浏览器中的XPath

浏览器中的XPath支持
1、每个XPath表达式都有两部分:一个上下文节点和一个节点模式。上下文节点提供了节点模式起始的位置。节点模式是由一个或多个 节点选择器组成的字符串。
XPath表达式:employee/name
要选择<employee/>元素的第一个<name/>元素,表达式要变成:
employee[position() = 1]/name
在XPath中,方框记号用于为某个节点提供更加确切的信息。这个例子使用了XPath的position()函数,它用于返回元素在父节点下的位置。
除位置和名称外,还可以使用不同的方法来匹配元素。假设要选择所有title特性等于“Salesperson”的<employee/>元素,则XPath表达式变成:
employee[@title = "Salesperson"] @是attribute的缩写
2、IE中的XPath支持
每个节点都有两个可用于获取匹配XPath模式的节点的方法:selectNodes(),用于返回匹配某个模式的节点的集合:selectSingleNode(),用于返回匹配给定模式的第一个节点。
可用下面的代码选择所有<employee/>元素下的<name/>元素:
var lstNodes = oXmlDom.documentElement.selectNodes("employee/name");
方法返回包含所有匹配给定模式的节点的NodeList,也就是说,可以这样迭代所有的元素:
for(var i = 0;i < listNodes.length; i++)
{
 alert(lstNodes[i]);
}
如果没有匹配给定模式的节点,还是会返回NodeList.如果为空,则它的length属性值等于0.
如果只需要匹配模式的第一个元素,则可以使用selectSingleNode():
var oElement = oXmlDom.documentElement.selectSingleNode("employee/name");
如果发现了节点,则selectSingleNode()方法返回一个Element,否则它返回null.
evaluate()方法有五个参数:XPath表达式、上下文节点、命名空间解释程序和返回的结果的类型,同时,在XPathResult中存放结果(通常为null)。

指定的结果类型决定了如何获取结果的值。下面是个典型的例子:
var oEvaluator = new XPathEvaluator();
var oResult = oEvaluator.evaluate("employee/name",oXmlDom.documentElement,null,XpathResult.ORDERED_NODE_ITERATOR_TYPE,null);
if(oResult != null)
{
 var oElement = oResult.iterateNext();
 while(oElement)
 {
  alert(oElement.tagName);
  oElement = oResult.iterateNext();
 }
}
可以用节点迭代子为Mozilla创建一个selectNodes()方法:
Element.prototype.selectNodes = function(sXPath)
{
 var oEvaluator = new XPathEvaluator();
 var oResult = oEvaluator.evaluate(sXPath,this,null,XPathResult.ORDERED_NODE_ITERATOR_TYPE,null);
var aNodes = new Array;
if(oResult != null)
{
 var oElement = oResult.iterateNext();
 while(oElement)
 {
  aNodes.push(oElement);
  oElement = oResult.iterateNext();
 }
}
 return aNodes;
};
给Element类添加selectNodes()方法以模仿IE中的行为。调用evaluate()时,把用this关键字作为上下文节点(这也是IE的工作方式)。然后,在结果数组(aNodes)中放入匹配的节点。新方法用法如下:
var aNodes = oXmlDom.documentElement.selectNodes("employee/name");
for(var i = 0;i < aNodes.length; i++)
{
 alert(aNodes[i].xml);
}
如果指定了快照结果类型(不管是有序的还是无序的),都可使用snapshotItem()以及snapshotLength()方法,如下例所示:
var oEvaluator = new XPathEvaluator();
var oResult = oEvaluator.evaluate("employee/name",oXmlDom.documentElement,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);
if(oResult != null)
{
 for(var i = 0; i < oResult.snapshotLength; i++)
 {
  alert(oResult.snapshotItem(i).tagName);
 }
}
snapshotLength返回节点的数量,snapshotItem()返回快照中给定位置上的节点(类似于NodeList的Length和item()).
XPathResult.FIRST_ORDERED_NODE_TYPE结果返回第一个匹配的节点,可通过singeNodeValue特性来访问:
var oEvaluator = new XPathEvaluator();
var oResult = oEvaluator.evaluate("employee/name",oXmlDom.documentElement,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null);
alert(oResult.singleNodeValue.xml);

posted @ 2009-09-13 20:42  flora_asp.net  阅读(309)  评论(0编辑  收藏  举报