Firefox中的XPath

导读:
<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
Firefox 中的 XPath

FirefoxXPath实现遵循DOM标准,不过与IE中的实现差别较大。Firefox的实现版本允许XPath表达式以相同方式在HTMLXML文档中运行。这里最主要的对象有两个:XPathEvaluatorXPathResult


XPathEveluator类使用evaluate()方法对给定的XPath表达式进行求值,evaluate()方法包含五个参数:需要计算的XPath表达式字符串,表达式执行的上下文节点,命名空间解析器(处理表达式中命名空间的函数),结果类型(允许10种不同的结果类型)以及包含结果的XPathResult对象(如果参数为null,那么返回新的XPathResult对象)。


在继续深入讨论之前,理解evalute()方法返回的不同结果类型是很重要的。它们分别是:


q  XPathResult.ANY_TYPE,返回不确定类型。该方法返回的类型由表达式计算的结果决定。


q  XPathResult.ANY_UNORDERED_NODE_TYPE,返回通过singleNodeValue属性访问的某个节点的节点集合,如果没有匹配的节点,那么返回null。返回的节点集合不一定按出现的顺序排列。


q  XPathResult.BOOLEAN_TYPE,返回布尔值。


q  XPathResult.FIRST_ORDERED_NODE_TYPE,返回某个节点的节点集合。该节点使用XPathResult类的singleNodeValue属性访问。返回的节点是文档中第一个出现的节点。


q  XPathResult.NUMBER_TYPE,返回数字值。


q  XPathResult.ORDERED_NODE_ITERATOR_TYPE,返回文档顺序的节点集合(使用iterateNext()方法遍历)。因此,可以容易地访问集合中每个独立的节点。


q  XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,返回文档顺序的节点集合(结果集合的快照)。任何对文档中节点的修改都不影响结果。


q  XPathResult.STRING_TYPE,返回字符串值。


q  XPathResult.UNORDERED_NODE_ITERATOR_TYPE,返回可以遍历的节点集合,然而,节点的顺序与其在文档中出现的顺序不一定一致。


q  XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,返回无序快照节点集合。任何对文档中节点的修改都不影响结果。


最常用的结果类型是XPathResult.ORDERED_NODE_ITERATOR_TYPE


var ōEvaluator = new XPathEvaluator();


var sXPath = "book/author";


var ōResult = oEvaluator.evaluate(sXPath,oXmlDom.documentElement,null,


       XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);


 


var aNodes = new Array;


 


if (oResult != null) {


    var oElement;


    while (oElement = oResult.iterateNext()) {


       aNodes.push(oElement);


    }


}


这段代码创建了一个XPathEvaluator对象,该对象用于计算文档根节点上下文中的XPath表达式book/author。因为结果类型是ORDERED_NODE_ITERATOR_TYPE,所以将返回一个可以使用iterateNext()方法进行遍历的节点集合。


iterateNext()方法类似于DOM节点的nextSibling属性,在结果集合中选择下一个节点,当到达结果集合结尾时返回null。该函数可以在while循环中使用,只要oElement不为null,那么就可以通过push()方法将其添加到aNodes数组中。填充数组的方法与IE中的方法类似,因此,可以容易地在for循环中使用或访问每个数组元素。


4.2.5  使用命名空间解析器


evaluate()方法的语法中,你将看到一个对命名空间解析器的引用。命名空间解析器(namespace resolver是一个将XPath表达式中命名空间前缀解析成命名空间URI的函数。该命名空间解析器函数可以由你自行命名,但是要求传入一个字符串参数(需要解析的前缀)。


解析器对参数所提供的前缀进行检查,并返回相关的命名空间URI。为了在IE示例中使用命名空间URI,可以编写下列的解析器:


function nsResolver(sPrefix) {


    switch (sPrefix) {


       case "na":


           return "http://site1.com";


           break;


       case "pub":


           return "http://site2.com";


           break;


       default:


           return null;


           break;


    }


}


有了上面的解析器,那么就可以在IE命名空间示例中对修改后的books.xml文档使用下列XPath表达式:


var sXPath = "na:book/pub:name";


 


var ōEvaluator = new XPathEvaluator();


 


var ōResult = oEvaluator.evaluate(sXPath,oXmlDom.documentElement,nsResolver,


       XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);


 


 


var aNodes = new Array;


 


if (oResult != null) {


    var oElement;


    while (oElement = oResult.iterateNext()) {


        aNodes.push(oElement);


    }


}


该示例与上一段计算表达式的代码类似。不过,请注意对evaluate()方法的补充:之前编写的nsResolver()函数的指针,作为参数传入evaluate()方法来处理XPath表达式的命名空间。其余部分应该相当熟悉了。使用XPathResult类的iterateNext()方法遍历返回结果NodeList,并转换成数组。


正如你所见,FirefoxXPath实现与微软提供的方法有很大的不同,因此使用一个跨浏览器兼容的库会使得执行XPath计算更加简单。




本文转自

http://www.phpchina.com/html/34/12834_itemid_30583.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值