`
JavaSam
  • 浏览: 955234 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

javascript XPath 超强检索页面节点的函数

 
阅读更多
该函数document.evaluate函数暂且不支持所有浏览器!IE不支持

使用 Greasemonkey 时会遇到的功能最为强大的一个工具就是 evaluate 函数。通过使用XPath这种查询语言,它可以用来寻找页面中的元素,属性和文本。

举个例子来说,如果您想获得某个页面上的全部链接。您也许会想到使用document.getElementsByTagName('a');但是如果您还要继续检查是否每个链接都具有href属性,因为<a>还可以用来作为锚名称使用,这时,您需要使用Firefox内建的XPath 支持去获取全部具有href属性的<a>元素。

例子: 获取页面上的全部链接

var allLinks, thisLink;
 allLinks = document.evaluate(
      '//a[@href]',
      document,
      null,
      XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
      null);
 for (var i = 0; i < allLinks.snapshotLength; i++) {
      thisLink = allLinks.snapshotItem(i);
      // do something with thisLink
 }
 这里,document.evaluate 是关键的部分。 它把 XPath 查询语句作为一个字符串,其它的参数稍后再做解释。 这条 XPath   查询语句可以找到全部具有href属性的<a>元素,并将它们按照随机的顺序依次返回。(这就是说,第一个被返回的元素并一定也是页面上的第一个这样的元素。) 随后,您就可以用 allLinks.snapshotItem(i) 函数访问每一个元素。


 XPath表达式所能做到的甚至会使您惊讶。请看下面这个例子,它获取了全部具有title属性的元素。

 


 例子: 获取全部具有title属性的元素

var allElements, thisElement;
 allElements = document.evaluate(
      '//*[@title]',
      document,
      null,
      XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
      null);
 for (var i = 0; i < allElements.snapshotLength; i++) {
      thisElement = allElements.snapshotItem(i);
      switch (thisElement.nodeName.toUpperCase()) {
          case 'A':
              // this is a link, do something
              break;
          case 'IMG':
              // this is an image, do something else
              break;
          default:
              // do something with other kinds of HTML elements
      }
 }

 

如果您已经引用了某个元素(例如上面的 thisElement),您就可以用 thisElement.nodeName 来替代它所对应的在   HTML 页面中的标签名称。如果被访问的这个页面是以 text/html 的方式被服务器执行, 那么标签名称总是用大写子母返回,不论它在原始页面是如何定义的。 如果页面是 application/xhtml+xml 方式的, 那么标签名称就会以小写子母返回。 不论哪种情况,我总是用   thisElement.nodeName.toUpperCase() 得到大写的标签名称。  


 这是另外一个 XPath 查询,它返回了 div 中的一个特殊的类。


 例子: 获取 div 中的 sponsoredlink 类

var allDivs, thisDiv;
 allDivs = document.evaluate(
      "//div[@class='sponsoredlink']",
      document,
      null,
      XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
      null);
 for (var i = 0; i < allDivs.snapshotLength; i++) {
      thisDiv = allDivs.snapshotItem(i);
      // do something with thisDiv
 }
 注意我在 XPath 查询语句外使用了双引号,这样在语句内部就可以使用单引号。


 在 document.evaluate 函数中有很多参数。第二个参数 (在前两个例子中都是docoment) 可以是一个元素, XPath 查询只返回包含在这个元素内的元素。所以,如果您已经引用了一个元素(比如, 通过 document.getElementById 或者 通过   document.getElementsByTagName 得到的数组中的一个元素), 那么您就可以限制查询只返回这个元素的子元素。


 第三个参数是对一个叫做 namespace resolver 函数的引用, 它只有在工作在 application/xhtml+xml 类型的页面上的用户脚本中是有效的。即使您对它不是很了解也没有关系,因为那种类型的页面不是很多,您可能一次也遇不到。如果您很想知道它是如何使用的,请参考   Mozilla XPath documentation (http://www-jcsu.jesus.cam.ac.uk/~jg307/mozilla/xpath-tutorial.html),那里解释了它的用法。


 第四个参数是结果的返回方式。在前面的两个例子中都使用了 XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, 它将结果以随机的方式返回。我使用的几乎全部都是这种方式,但是,出于某种原因,您想让结果以它们在页面上出现的顺序返回,您可以使用   XPathResult.ORDERED_NODE_SNAPSHOT_TYPE 这种方式。 Mozilla XPath documentation (http://www-jcsu.jesus.cam.ac.uk/~jg307/mozilla/xpath-tutorial.html)还给出了另外的一些用例。


 第五个参数用来合并两次 XPath 查询的结果。 在获得第一次调用 document.evaluate 得到的结果之后,它将两次查询的结果一起返回。在前面的两个例子中,这个参数都用了null,这意味着我们只想获得本次查询的结果。


 现在您明白了吗?XPath 既可以很简单,也可以很难,这取决于您要如何使用它。在此我强烈推荐您尽快去阅读 this excellent XPath tutorial (http://www.zvon.org/xxl/XPathTutorial/General/examples.html),从而了解更多的 XPath 语法。至于 document.evaluate 函数的其它参数, 我几乎从来不使用它们。事实上,您可以自己定义一个函数来封装它们。


 例子: 自定义的 xpath 函数

function xpath(query) {
      return document.evaluate(query, document, null,
          XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
 }

在定义了这个函数之后,您就可以调用 xpath('//a[@href]') 来获得某个页面上的全部链接, 或者调用 xpath('//* [@title]') 来获得具有 title 属性的元素。您仍然需要通过 snapshotItem 函数来访问结果中的每一项,这个函数的类型并不是一个规则的Javascript数组。




XPaht学习文档url:http://www.zvon.org/xxl/XPathTutorial/General/examples.html





 

0
0
分享到:
评论

相关推荐

    XPath实例

    8. **函数**:XPath提供了丰富的内置函数,如 `count()` 计算节点数量,`substring()` 截取字符串,`normalize-space()` 去除字符串两端空格等。 在你的实例文件 `book.xml` 中,你可能会有一个结构化的XML文档,...

    Xpath读取xml文件,实现文件缓存。

    3. **XPath函数**: XPath包含一系列内置函数,如 `text()` 返回节点的文本内容,`count()` 计算节点集的个数,`concat()` 连接字符串等。这些函数能进一步增强我们对XML数据的处理能力。 4. **文件缓存**: 文件缓存...

    采用XPATH在线查询XML文件的搜索引擎源码

    了解XPath的基本语法、选择器和函数,是理解这个搜索引擎工作原理的基础。 2. **ASP.NET Web 应用程序开发**:掌握ASP.NET的MVC(Model-View-Controller)架构,以及如何创建HTTP请求处理管道,理解页面生命周期和...

    xpath详细使用介绍.pdf

    此外,XPath 还提供函数库,比如 `text()` 用于获取节点的文本内容,`count()` 计算节点数量,以及 `contains()` 检查字符串是否包含特定子串。 XPath 在实际应用中广泛用于 XSLT(XSL 转换)中,用来从源 XML 文档...

    XMLDOM T-SQL XPath 正则表达式等CHM格式学习文档

    此外,XPath还提供了函数库,用于对节点集进行运算,如排序、数值计算等。 CSS(Cascading Style Sheets)是用于描述HTML或XML(包括SVG、MathML等各种XML方言)文档样式的样式表语言。CSS控制网页元素的布局、颜色...

    IEXPath.zip

    4. **函数库支持**:内置了完整的XPath函数库,用户可以直接调用这些函数,如字符串操作、数值计算、节点集合处理等。 5. **代码生成**:对于开发者而言,IEXPath可以生成适用于各种编程语言(如Java、Python、...

    译文 XML 路径语言

    - **函数调用**: XPath定义了一系列内置函数,用于处理节点集合、字符串、数字和布尔值。 - **节点集合**: XPath中的路径表达式返回的是节点集合。 - **布尔**: 提供了`true()`, `false()`, `not()`等函数来处理布尔...

    CSS、DHTML、XMLDOM、T-SQL、XPath、正则表达式等.chm文件帮助文档

    XPath基于节点树模型,可以用来选取节点,如元素、属性、文本等。它提供了一种简洁的语法来定位XML文档的特定部分,也可以进行数值计算和逻辑运算,常用于XSLT和XQuery等XML处理技术中。 最后,正则表达式,是一种...

    php手册,mysql手册,w3school教程,xpath教程等等大杂烩

    XPath表达式可以用来导航XML文档的结构,选择特定的节点,或者计算数值。学习XPath对于XML处理和XSLT转换至关重要,特别是在需要从大型XML文件中提取特定信息时。 综合以上,这个压缩包是一个全面的IT学习资源库,...

    AJAX技术总结

    4. **异步数据获取**:使用XMLHttpRequest对象进行后台数据查询和检索,实现局部页面刷新。 5. **脚本绑定**:使用JavaScript将以上各项技术整合起来。 AJAX并非单一技术,而是一系列技术的组合应用。例如,DHTML和...

    jquery读取xml

    通过`jQuery.parseXML()`解析XML字符串,使用`find()`和`each()`遍历节点,结合XPath或`$.ajax()`获取服务器上的XML,以及有效地处理错误,你可以轻松地构建功能丰富的XML应用程序。在实际项目中,根据具体需求选择...

    Dom文档对象模型2010版(CHM格式)

    4. **DOM Level 3 XPath**:引入XPath支持,允许使用XPath表达式快速定位文档中的节点。 5. **DOM Level 3 CSS**:提供了与CSS样式表交互的API,可以查询和修改元素的样式。 学习DOM不仅有助于理解和操作网页内容,...

    Python and XML

    - XPath是一种用于在XML文档中查找信息的语言,它可以用来选择节点或节点集。 - XPath表达式可以非常精确地定位到文档中的某个位置,这对于数据提取非常有用。 - **5.2 XPath的应用场景** - XPath广泛应用于各种...

    使用XQuery开发mashup

    它不仅能够高效地解析XML,还能通过简洁的语法进行复杂的数据检索和转换。 在Web 2.0时代,随着Asynchronous JavaScript and XML (Ajax)的广泛应用,动态Web应用程序的用户体验得到了显著提升。Ajax允许在不刷新...

    extjs-basex.js

    2. **XPath和XQuery支持**:支持XPath查询语言来定位XML节点,以及XQuery语言来处理XML数据。 3. **RESTful API**:通过HTTP协议提供RESTful服务,方便Web应用访问。 4. **版本控制**:具有版本控制系统,可以跟踪和...

    XML 高级编程(5).rar

    XML数据库专门设计用于存储和检索XML文档,它们提供对XML数据的原生支持,例如XPath查询和XQuery语言。 八、XML与JSON XML和JSON(JavaScript Object Notation)都是数据交换格式,但JSON通常用于前端和后端间的轻...

    XML高级编程 XML高级编程

    XPath表达式可以选取文档中的元素、属性、文本等,并提供了丰富的函数库进行节点操作。 4. **XSLT**:XSL Transformations(XSLT)是一种转换XML文档的语言,它用于将XML文档转换为其他XML文档,或者HTML、PDF等非...

    xml手册,xml手册,xml手册

    XML与XSLT(Extensible Stylesheet Language Transformations)和XPath(XML Path Language)相结合,可以实现数据的格式化和检索。XSLT用于转换XML文档的结构和样式,而XPath则提供了一种表达在XML文档中查找信息的...

    flickr架构

    尽管如此,flickr通过使用Expatriate(通过PEAR::XML::Parser封装)来克服这一限制,但遗憾的是,当时并未有XPath支持,这在一定程度上限制了查询和数据提取的灵活性。 总体而言,flickr的架构设计展示了如何在一个...

    XML编程从入门到精通

    **XPath**:XML路径语言,用于在XML文档中查找信息,通过路径表达式选取节点。 **XQuery**:一种更强大的查询语言,专门用于XML数据的检索和处理。 **XML在Web服务中的应用**:XML是SOAP(简单对象访问协议)和...

Global site tag (gtag.js) - Google Analytics