使用 XPath 获取 XML 文档的数据

XPath 简介

XPath 是使用路径表达式快速在 XML 导航的 W3C 标准

节点类型

XPath 中有七种类型的节点: 元素、属性、文本、命名空间、处理指令、注释以及文档(跟)节点。

对于下面的 HTML

 1 <html lang="zh_CN">                     (1) (2)
 2   <head>                                (3)
 3     <title>Hello XPath</title>          (4)
 4   </head>
 5 
 6   <body>
 7     <!-- comments -->                   (5)
 8     <p>XPath</p>                        (4)
 9   </body>
10 </html>
1 html 是文档(跟)节点
2 lang 是属性节点
3 headbody 是元素节点
4 Hello XPathXPath 是文本节点
5 <!-- comments -→ 注释节点

XPath 语法

选取节点

可以把待查找 HTML 或 XML 的 Dom 树看作 Unix 的文件系统树。

表达式

表达式 XPath 意义 Unix 目录意义

/

跟节点

根目录

//

后代节点

.

当前节点

当前目录

..

父节点

父目录

@

选取属性

示例

表达式 含义

/

跟节点

/html

选取跟节点 html,跟节点不为 html 则为空

/html/body

选取跟节点 html 的 body 子节点

//meta

所有 meta 节点

//body//header

选取所有 body 节点的 header 后代节点

//@name

选取所有的 name 属性,通常是 meta 或表单

谓语

谓语被嵌入在方括号中,用来查找某个特定的节点或包含某个特定的值的节点

示例

表达式 含义

//meta[3]

选取第三个 meta 节点

//meta[last()]

选取最后一个 meta 节点

//meta[last() - 2]

选取倒数第三个 meta 节点

//meta[position() < 3]

选取最前面的两个 meta 节点

//meta[positino() > (last() - 2)]

选取最后两个 meta 节点

//a[@class]

选取所有有 class 属性的 a 节点

//a[@class="classname"]

选取所有 class 为 classname 的 a 节点

通配

选取未知的节点

表达式

表达式 含义

*

选取任何元素节点

@*

选取任何属性节点

node()

选取任何类型节点

示例

表达式 含义

//*

所有元素节点

//body/*

body 节点的所有子元素节点

//body[@*]

带有任意属性节点的 body 元素

合并结果

| 对多条路径的结果进行合并

示例

//header|//footer 选取所有的 header 节点或者 footer 节点

XPath 轴

轴 Axes 用来定义相对于当前节点的节点集

轴名称 含义

self

选取当前节点。

preceding

选取文档中当前节点的开始标签之前的所有节点。

preceding-sibling

选取当前节点之前的所有同级节点。

attribute

选取当前节点的所有属性。

following

选取文档中当前节点的结束标签之后的所有节点。

namespace

选取当前节点的所有命名空间节点。

parent

选取当前节点的父节点

ancestor

选取当前节点的所有祖先元素

ancestor-or-self

选取当前节点的所有祖先元素以及当前节点本身。

child

选取当前节点的所有子元素。

descendant

选取当前节点的所有后代元素

descendant-or-self

选取当前节点的所有后代元素以及当前节点本身。

示例

表达式 含义

child::head

当前节点的所有 head 元素子节点

child::*

当前节点的所有元素子节点

child::text()

当前节点的所有文本子节点

child::node()

当前节点的所有子节点

attribute::name

当前节点的所有 name 属性节点

attribute::*

当前节点的所有属性节点

ancestor::div

当前节点的所有 div 祖先节点

descendant::a

当前节点的所有 a 后代节点

Ruby 的解析工具

Ruby 中 NokogiriHTML::Document#xpath XML::Document#xpath 提供了 XPath 支持

 1 require 'open-uri'
 2 require 'nokogiri'
 3 
 4 html = Nokogiri::HTML.parse(open('http://www.baidu.com'))
 5 
 6 # 文本节点
 7 html.xpath('//title/text()').first.content
 8 # => "百度一下,你就知道"
 9 
10 # 注释
11 html.xpath('comment()').first.content
12 # => "STATUS OK"
13 
14 # 属性
15 html.xpath('//link[@rel="dns-prefetch"]')

本文作者: zhustec

本文标题: 使用 XPath 获取 XML 文档的数据

本文链接: https://blog.zhustec.me/posts/fetch-xml-document-data-with-xpath

发布时间: 2014-12-09T23:26:23+00:00

版权声明: 本文由 zhustec 原创 采用 CC BY-NC-ND 4.0 许可协议 转载请保留以上声明信息!