XPath

<!--Topic built:11/28/2007 07:08:00--> DropDown imageDropDownHover imageCollapse imageExpand imageCollapseAll imageExpandAll imageCopy imageCopyHover image

本主题回顾整个 XPath 参考中出现的语法示例。 所有示例均基于 XPath 语法的示例 XML 文件 (inventory.xml)。 有关在测试文件中使用 XPath 表达式的示例,请参见本主题最后的“联合 ( | ) 示例”。

表达式 引用

./author

当前上下文中的所有 <author> 元素。注意,此表达式等效于下一行中的表达式。

author

当前上下文中的所有 <author> 元素。

first.name

当前上下文中的所有 <first.name> 元素。

/bookstore

此文档的文档元素 (<bookstore>)。

//author

文档中的所有 <author> 元素。

book[/bookstore/@specialty=@style]

style 属性值等于文档根处 <bookstore> 元素的 specialty 属性值的所有 <book> 元素。

author/first-name

作为 <author> 元素子级的所有 <first-name> 元素。

bookstore//title

<bookstore> 元素中一级或多级深度的所有 <title> 元素(任意后代)。注意,此表达式不同于下一行中的表达式。

bookstore/*/title

作为 <bookstore> 元素的孙代的所有 <title> 元素。

bookstore//book/excerpt//emph

位于 <book> 元素的 <excerpt> 子级内任意位置和位于 <bookstore> 元素内任意位置的所有 <emph> 元素。

.//title

当前上下文中一级或多级深度的所有 <title> 元素。注意,本质上只有这种情况需要句点表示法。

author/*

作为 <author> 元素子级的所有元素。

book/*/last-name

作为 <book> 元素孙级的 <last-name> 所有元素。

*/*

当前上下文的所有孙级元素。

*[@specialty]

具有 specialty 属性的所有元素。

@style

当前上下文的 style 属性。

price/@exchange

当前上下文中 <price> 元素上的 exchange 属性。

price/@exchange/total

返回空节点集,因为属性不包含元素子级。 XML 路径语言 (XPath) 语法允许使用此表达式,但是严格意义上讲无效。

book[@style]

当前上下文的具有 style 属性的 <book> 所有元素。

book/@style

当前上下文的所有 <book> 元素的 style 属性。

@*

当前元素上下文的所有属性。

./first-name

当前上下文节点中的所有 <first-name> 元素。 请注意,这等效于下一行中的表达式。

first-name

当前上下文节点中的所有 <first-name> 元素。

author[1]

当前上下文节点中的第一个 <author> 元素。

author[first-name][3]

具有 <first-name> 子级的第三个 <author> 元素。

my:book

my 命名空间中的 <book> 元素。

my:*

my 命名空间中的所有元素。

@my:*

my 命名空间中的所有属性(不包括 my 命名空间中的元素的未限定属性)。

注意,索引相对于父级。 考虑以下数据:

<x>
  <y/>
  <y/>
</x>
<x>
  <y/>
  <y/>
</x>
表达式 引用

x/y[1]

每个 <x> 的第一个 <y> 子级。 此表达式等效于下一行中的表达式。

x/y[position() = 1]

每个 <x> 的第一个 <y> 子级。

(x/y)[1]

<x> 元素的整个 <y> 子级集合中的第一个 <y>

x[1]/y[2]

第一个 <x> 的第二个 <y> 子级。

其他示例引用 XPath 的示例 XML 文件。

表达式 引用

book[last()]

前上下文节点的最后一个 <book> 元素。

book/author[last()]

前上下文节点的每个 <book> 元素的最后一个 <author> 子级。

(book/author)[last()]

当前上下文节点的 <book> 元素的整个 <author> 子级集合中的最后一个 <author> 元素。

book[excerpt]

包含至少一个 <excerpt> 元素子级的所有 <book> 元素。

book[excerpt]/title

作为 <book> 元素子级,同时包含至少一个 <excerpt> 元素子级的所有 <title> 元素。

book[excerpt]/author[degree]

包含至少一个 <degree> 元素子级,并作为同样包含至少一个 <excerpt> 元素的 <book> 元素的子级的所有 <author> 元素。

book[author/degree]

包含 <author> 子级,这些子级又包含至少一个 <degree> 子级的所有 <book> 元素

author[degree][award]

包含至少一个 <degree> 元素子级和至少一个 <award> 元素子级的所有 <author> 元素。

author[degree and award]

包含至少一个 <degree> 元素子级和至少一个 <award> 元素子级的所有 <author> 元素。

author[(degree or award) and publication]

包含至少一个 <degree><award> 和至少一个 <publication> 作为子级的所有 <author> 元素。

author[degree and not(publication)]

包含至少一个 <degree> 元素子级并且不包含 <publication> 元素子级的所有 <author> 元素。

author[not(degree or award) and publication]

包含至少一个 <publication> 元素子级,但不包含 <degree><award> 元素子级的所有 <author> 元素。

author[last-name = "Bob"]

包含至少一个值为 Bob<last-name> 元素子级的所有 <author> 元素。

author[last-name[1] = "Bob"]

第一个 <last-name> 子元素的值为 Bob 的所有 <author> 元素。 请注意,这等效于下一行中的表达式。

author[last-name [position()=1]= "Bob"]

第一个 <last-name> 子元素的值为 Bob 的所有 <author> 元素。

degree[@from != "Harvard"]

from 属性不等于 "Harvard" 的所有 <degree> 元素。

author[. = "Matthew Bob"]

值为 Matthew Bob 的所有 <author> 元素。

author[last-name = "Bob" and ../price &gt; 50]

包含值为 Bob<last-name> 子元素和值大于 50 的 <price> 同级元素的所有 <author> 元素。

book[position() &lt;= 3]

前三本书(1、2、3)。

author[not(last-name = "Bob")]

不包含值为 Bob<last-name> 子元素的所有 <author> 元素。

author[first-name = "Bob"]

至少有一个值为 Bob<first-name> 子级的所有 <author> 元素。

author[* = "Bob"]

所有包含任何值为 Bob 的子元素的 author 元素。

author[last-name = "Bob" and first-name = "Joe"]

具有值为 Bob<last-name> 子元素和值为 Joe<first-name> 子元素的所有 <author> 元素。

price[@intl = "Canada"]

上下文节点中 intl 属性等于 "Canada" 的所有 <price> 元素。

degree[position() &lt; 3]

作为上下文节点子级的前两个 <degree> 元素。

p/text()[2]

上下文节点中每个 <p> 元素的第二个文本节点。

ancestor::book[1]

上下文节点最近的 <book> 上级。

ancestor::book[author][1]

上下文节点最近的 <book> 上级,并且此 <book> 元素具有 <author> 元素作为其子级。

ancestor::author[parent::book][1]

当前上下文最近的 <author> 上级,并且此 <author> 元素是 <book> 元素的子级。

联合 ( | ) 示例

为了演示 union 运算,我们使用以下 XPath 表达式:

x | y/x

在以下 XML 文件中选择所有值为 greenblue 的 <x> 元素:

XML 文件 (data1.xml)

Xml
<?xml version='1.0'?>
<?xml-stylesheet type="text/xsl" href="union.xsl"?>
<root>
   <x>green</x>
   <y>
      <x>blue</x>
      <x>blue</x>
   </y>
   <z>
      <x>red</x>
      <x>red</x>
   </z>
   <x>green</x>
</root>

XSLT 文件 (union.xsl)

Xml
<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="root">
   <xsl:for-each select="x | y/x">
      <xsl:value-of select="."/>,
      <xsl:if test="not(position()=last())">,</xsl:if>
   </xsl:for-each>
</xsl:template>

</xsl:stylesheet>
格式化输出

green,blue,blue,green

处理器输出

<?xml version="1.0" encoding="UTF-16"?>green,blue,blue,green

09-26
XPath 即 XML 路径语言(XML Path Language),是一种用于在 XML 或 HTML 文档中定位元素的查询语言。以下是关于 XPath 的详细介绍和使用方法: ### 简介 XPath 基础教程适合初学者,能帮助学习者掌握 XPath 元素定位的基本原理和常用技巧。学习完相关课程后,可熟练使用 XPath 在 HTML 或 XML 文档中定位元素,为后续的 Web 自动化测试、数据提取等工作打下坚实基础 [^1]。 ### 使用方法 - **基本路径表达式**: - `/title`:表示根节点下的所有 `title` 标签。 - `//div`:表示根节点下的所有 `div` 标签。 - **谓语(Predicates)**:用于筛选节点。例如 `./div[@class="text"]` 表示当前节点下,属性 `class` 为 `"text"` 的所有 `div` 节点。而 `./div[@class="text"].text()` 则是获取这些 `div` 节点的文本内容 [^2]。 ### 应用场景 - **Web 爬虫**:从网页中提取特定的数据,如新闻标题、商品价格等。 - **Web 自动化测试**:定位页面元素,模拟用户操作,如点击按钮、输入文本等。 ### 代码示例 以下是使用 Python 和 `lxml` 库来演示 XPath 的使用: ```python from lxml import etree # 示例 HTML 文档 html = """ <!DOCTYPE html> <html> <body> <div class="text">This is a sample text.</div> <div>Another div without class.</div> <title>Sample Page</title> </body> </html> """ # 解析 HTML 文档 tree = etree.HTML(html) # 使用 XPath 定位元素 title = tree.xpath('/html/head/title') divs = tree.xpath('//div') text_divs = tree.xpath('.//div[@class="text"]') # 输出结果 print("Title:", title[0].text if title else "No title found") print("All divs:", [div.text for div in divs]) print("Divs with class 'text':", [div.text for div in text_divs]) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值