XPath语法

本文介绍了XPath的基本语法,包括符号、数学及逻辑运算符,并详细解释了XPath轴的应用场景。此外,还提供了.Net环境下使用XPathDocument和XmlDocument进行节点选择的具体示例。

XPath的语法:

1. XPath中的符号

符号

说明

示例

示例说明

/

表示从根节点开始选择

/pets

选择根节点pets

表示节点和子节点之间的间隔符

/pets/dog

选择pets节点下的dog节点

//xx

表示从整个xml文档中查找,而不考虑当前节点位置

//price

选择文档中所有的price节点

.

单个英文半角句点表示选择当前节点

/pets/.

选择pets节点

..

双点,表示选择父节点

/pets/dog[0]/..

表示pets节点,也就是第一个dog节点的父节点

@xx

表示选择属性

//dog/@color

表示选择所有dog节点的color属性集合

[…]

中括号表示选择条件,括号内为条件

//dog[@color=’white’]

所有color为white的dog节点

//dog[/price<100]

所有price字节点值小于100的dog节点

中括号内数字为节点索引,类似c#等语言中的数组,数组下标是从1开始的

//dog[1]

第1个dog节点

//dog[last()]

最后一个dog节点,last()是xPath内置函数

|

单竖杠表示合并节点结合

//dog[@color=’white’] | //cat[@color=’white’]

color属性为white的dog节点和color属性为white的cat节点

*

星号表示任何名字的节点或者属性

//dog/*

表示dog节点的所有子节点

//dog/@*

表示dog节点的所有属性节点

 

2. XPath数学运算符
+  加号表示加
- 表示数字相减
* 表示乘以
div 表示除以,这里数学上的除号/已经被用作节点之间分隔符了
mod 表示取余
 
3. XPath逻辑运算符
= 等于,相当于c#中的 ==
!= 不等于
> 大于
>= 大于等于
< 小于
<= 小于等于
and 并且 与关系
or 或者 或关系
 
 
4.  XPath Axes 从字面翻译这个是XPath轴的意思,但根据我的理解这个翻译成XPath节点关系运算关键字更合适,就是一组关键字加上::双冒号表示和当前节点有关系的一个或者一组节点.
使用语法: axisname::nodetest[predicate] 即轴名字::节点名字[取节点条件]
具体说明如下:

关键字

说明

示例

示例说明

ancestor

当前节点的父祖节点

ancestor::pig

当前节点的祖先节点中的pig节点

ancestor-or-self

当前节点以及其父祖节点

ancestor::pig

 

attribute

当前节点的所有属性

attribute::weight

相当于@weight,attribute::和@是等价的

child

当前节点的所有字节点

child::*[name()!=’price’]

选择名字不是price的子节点

descendant

子孙节点

descendant::*[@*]

有属性的子孙节点

descendant-or-self

子孙节点以及当前节点

descendant-or-self::*

 

following

Xml文档中当前节点之后的所有节点

following::*

 

following-sibling

当前节点的同父弟弟节点

following-sibling::

 

preceding

Xml文档中当前节点之前的所有节点

preceding::*

 

namespace

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

namespace::*

 

parent

当前节点的父节点

parent::

相当于双点..

preceding-sibling

当前节点之后的同父兄节点

preceding-sibling::*

 

self

当前节点

self::*

相当于单点.

 
5. 常用的XPath函数介绍:
在XPath表达式中常用的函数有下面两个:
position() 表示节点的序号例如 //cat[position() = 2] 表示取序号为2的dog节点
last() 表示取最后一个节点 //cat[last()] 
name() 表示当前节点名字 /pets/*[name() != 'pig'] 表示/pets下名字不是pig的子节点
 
XPath的函数还有很多,包括字符串函数,数字函数和时间函数等,具体可以参考w3的网站。
 
以上是XPath的语法,下面我们看下如何在.Net中使用XPath
在.Net中可以通过XPathDocument或者XmlDocument类使用XPath。XPathDocument是只读的方式定位Xml节点或者属性文本等,而XmlDocument则是可读写的。
 
如下代码示例展示了如何使用XPathDocument和XmlDocument
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.XPath;
using System.Xml;
 
namespace UseXPathDotNet
{
     class Program
     {
         static void Main( string [] args)
         {
             UseXPathWithXPathDocument();
 
             UseXPathWithXmlDocument();
 
             Console.Read();
         }
 
         static void UseXPathWithXmlDocument()
         {
             XmlDocument doc = new XmlDocument();
             doc.Load( "http://www.cnblogs.com/yukaizhao/rss" );
             //使用xPath选择需要的节点
             XmlNodeList nodes = doc.SelectNodes( "/rss/channel/item[position()<=10]" );
             foreach (XmlNode item in nodes)
             {
                 string title = item.SelectSingleNode( "title" ).InnerText;
                 string url = item.SelectSingleNode( "link" ).InnerText;
                 Console.WriteLine( "{0} = {1}" , title, url);
             }
         }
 
         static void UseXPathWithXPathDocument()
         {
             XPathDocument doc = new XPathDocument( "http://www.cnblogs.com/yukaizhao/rss" );
             XPathNavigator xPathNav = doc.CreateNavigator();
             //使用xPath取rss中最新的10条随笔
             XPathNodeIterator nodeIterator = xPathNav.Select( "/rss/channel/item[position()<=10]" );
             while (nodeIterator.MoveNext())
             {
                 XPathNavigator itemNav = nodeIterator.Current;
                 string title = itemNav.SelectSingleNode( "title" ).Value;
                 string url = itemNav.SelectSingleNode( "link" ).Value;
                 Console.WriteLine( "{0} = {1}" ,title,url);
             }
 
         }
     }
}

 

具体参见:

http://www.cnblogs.com/yukaizhao/archive/2011/07/25/xpath.html

http://www.cnblogs.com/loofah/archive/2012/05/10/2494036.html

 

其它有用的示例:

//节点InnerText的等值查询
string xpath = "users/user[username='huo' and password='123']";
//节点InnerText的模糊查询
string xpath = "users/user[contains(username,'huo') and contains(password,'123')]";

//属性的等值查询:
string xpath = "users/user[@username='huo' and @password='123']";
//属性的模糊查询:
string xpath = "users/user[contains(@username,'huo') and contains(@password,'123')]";

如果XPath的开头是一个斜线(/)代表这是绝对路径。如果开头是两个斜线(//)表示文件中所有符合模式的元素都会被选出来,即使是处于树中不同的层级也会被选出来。
以下的语法会选出文件中所有叫做cd的元素(在树中的任何层级都会被选出来):
//cd

选择未知的元素
使用星号(Wildcards,*)可以选择未知的元素。
下面这个语法会选出/catalog/cd 的所有子元素:
/catalog/cd/*
以下的语法会选出所有catalog的子元素中,包含有price作为子元素的元素。
/catalog/*/price
以下的语法会选出有两层父节点,叫做price的所有元素。
/*/*/price
以下的语法会选择出文件中的所有元素。
//*
要注意的是,想要存取不分层级的元素,XPath语法必须以两个斜线开头(//),想要存取未知元素才用星号(*),星号只能代表未知名称的元素,不能代表未知层级的元素。

选择分支
使用中括号可以选择分支。以下的语法从catalog的子元素中取出第一个叫做cd的元素。XPath的定义中没有第0元素这种东西。
/catalog/cd[1]
以下语法选择catalog中的最后一个cd元素:(XPathj并没有定义 first() 这种函式喔,用上例的 [1]就可以取出第一个元素。
/catalog/cd[last()]

转载于:https://www.cnblogs.com/spriteflk/archive/2012/06/05/2537027.html

<think>首先,用户的问题是:“我想查找Xpath语法的相关信息或使用指南请问Xpath语法使用指南”。用户要求查找XPath语法的相关信息或使用指南。现在,用户提供了几个站内引用:-引用[1]:PythonXPath语法完全指南,介绍了基础语法和高级用法,包括节点选择等。-引用[2]:XPath"或"逻辑使用,涉及|和or操作。-引用[3]:Jsoup和JsoupXpath的实际使用案例,包含依赖引入。-引用[4]:Jsoupxpath的使用,详细说明伪选择器。用户说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。”但在这个对话中,用户上一次的问题就是这个请求,所以我需要基于当前问题来回答。系统级指令:-所有行内数学表达式必须使用$...$。-独立公式使用$$...$$。-LaTeX语法正确。-使用中文回答。-生成相关问题。-回答中引用的段落末尾自然地添加引用标识,如[^1]。回答结构应该清晰,帮助用户逐步解决问题。用户的需求是了解XPath语法和使用指南。参考提供的引用:-引用[1]是关于XPath语法的基础和高级应用的完美匹配。-引用[2]讨论了逻辑操作。-引用[3]和[4]是关于JsoupXpath的实现,涉及具体代码和伪选择器。我应该构建一个全面的回答,覆盖XPath语法的核心部分。大纲回答结构:1.**介绍XPath**:简要解释XPath是什么、用途。2.**基础语法**-节点选择(如引用[1]提到的)。-路径表达式(绝对路径、相对路径)。-轴(如child,parent,attribute)。-谓语。3.**高级用法**-逻辑操作(如引用[2]的|和or)。-函数(如contains,text())。-通配符。4.**实例和常见使用**-结合引用[3]和[4]提供代码示例,展示在Jsoup中的使用。-包括伪选择器如:contains,:eq等(来自引用[4])。5.**指南部分**:如何应用在实践中,如网页抓取、自动化测试。6.**生成相关问题**:在最后添加相关问题。添加引用标识:-当使用引用中的信息时,在段落末尾添加[^1],[^2],等。例如,在讨论基础语法时加[^1]。使用中文回答。生成相关问题:-类似于示例,添加§§相关问题§§部分。-问题如:-"如何在XPath中使用逻辑操作符?"-"XPath在自动化测试中的实践?"-"XPath伪选择器的详解?"LaTeX:XPath通常不涉及数学表达式,但如果有数字索引或公式,确保使用正确语法。例如,如果提到索引从0开始,可用$index=0$等。完整回答结构:-开头:介绍XPath-逐步讲解语法:基础、高级、实例。-结束时:鼓励学习和使用。-添加相关问题。</think> 以下我将根据您的要求,全面介绍XPath语法和使用指南。您的需求是查找XPath(XML Path Language)的相关语法和使用信息,这是一种用于在XML和HTML文档中定位元素的查询语言,广泛应用于网页抓取、数据提取和自动化测试等领域[^1]。参考您提供的站内引用,我将结构化地介绍核心语法、高级用法和实际应用实例,确保回答基于可靠信息。回答内容包括基础语法、高级逻辑操作、代码实现指南以及常见问题解答。重点围绕引用中的关键点进行整合:[^1] 聚焦于XPath的核心语法,[^2] 强调逻辑操作符的使用,[^3] 和 [^4] 则提供JsoupXpath的实战案例和伪选择器细节。 我会分步解释,帮助您从基础到高级逐步上手。记住,XPath语法不涉及复杂数学公式,但索引值(如0基)会用行内格式表示(例如 $index=0$)。如有代码部分,我会清晰标注。 --- ### XPath语法完全指南 XPath允许您通过路径表达式定位文档中的特定节点(如元素、属性或文本)。下面从基础语法讲起,逐步深入到高级应用,并结合实例给出实用指南。 #### 1. **基础语法(节点选择)** XPath的基础由节点选择和路径表达式构成,这些是入门必备。参考引用[^1],核心包括: - **路径表达式**:使用 `/` 定义绝对路径(从根节点开始),或 `//` 定义相对路径(从任意位置搜索)。例如: - `/bookstore/book`:选择根节点下所有 `<book>` 子节点。 - `//div`:选择文档中所有 `<div>` 元素,无论位置如何。 - **轴(axes)**:用于指定节点间的导航关系。常见的有: - `child::`:选择当前节点的子节点(可缩写如 `book/child::title`,等同于 `book/title`)。 - `attribute::`:选择属性节点,例如 `@id` 匹配元素的ID属性。 - **谓语(predicates)**:添加筛选条件,放在方括号 `[]` 中。 - `book[1]`:选择第一个 `<book>` 元素(索引基于 $1$ 基,但注意伪选择器可能不同)。 - `book[@price > 10]`:选择 `price` 属性值大于10的 `<book>` 元素。 这些语法XPath的骨架,便于快速定位元素[^1]。实践中,总是优先在浏览器开发者工具中测试表达式,避免错误。 #### 2. **高级语法:逻辑操作与函数** XPath支持逻辑操作符和函数,用于处理复杂场景。引用[^2] 强调了逻辑操作的核心: - **逻辑运算符**- `or` 和 `and`:用于单个表达式内的条件组合。例如,`book[@type='fiction' or @price < 15]` 选择类型为小说或价格低于15的书本。这需要在同一路径下设置多个条件,确保结构一致性[^2]。 - `|`(或):合并多个路径结果。例如,`//title | //price` 返回所有标题和价格节点(不同于 `or`,它用于独立路径)。 - **常用函数**:扩展筛选能力。 - `text()`:获取元素文本,如 `//h1[text()='Welcome']`。 - `contains()`:模糊匹配文本,如 `//p[contains(text(), 'XPath')]`(大小写敏感)。 - 位置函数:如 `position()` 用于索引比较(`position()=1` 选择第一个节点)。 高级用法要求"明确需求":先确定是否需要合并路径(用 `|`)还是条件组合(用 `or`)。引用[^2] 建议使用开发者工具提前验证,减少脚本调试时间。例如,在自动化测试中,逻辑操作符能高效处理动态页面[^2]。 #### 3. **使用指南:实战代码与伪选择器** XPath语法常用于库如JsoupXpath。参考引用[^3]和[^4],我会提供完整实现案例。JsoupXpath 是Java库,依赖Jsoup处理HTML。 - **依赖和代码实现**: 先引入依赖(如Maven): ```xml <!-- JsoupXpath自动依赖Jsoup --> <dependency> <groupId>cn.wanghaomiao</groupId> <artifactId>JsoupXpath</artifactId> <version>2.3.2</version> </dependency> ``` 示例代码:从HTML中提取所有段落文本。 ```java import cn.wanghaomiao.xpath.core.XPathEvaluator; import org.jsoup.nodes.Document; public class XPathExample { public static void main(String[] args) { Document doc = ...; // 加载HTML文档(Jsoup解析) XPathEvaluator evaluator = new XPathEvaluator(); // 使用XPath选择所有<p>元素 List<Object> results = evaluator.compile("//p").evaluate(doc).get(); for (Object element : results) { System.out.println(element.text()); } } } ``` 这段代码展示了基础查询,但重点是“伪选择器”,它能更精确地定位[^4]。 - **伪选择器详细说明**: 伪选择器是高级定位工具,基于索引或条件。引用[^4] 列举了常用伪选择器(都是 $0$ 基索引): - `:lt(n)`:选择索引小于 $n$ 的同级元素(例如 `td:lt(3)` 选择前三个表格单元)。 - `:gt(n)`:选择索引大于 $n$ 的同级元素(例如 `div p:gt(2)` 跳过前三个段落)。 - `:eq(n)`:选择索引等于 $n$ 的同级元素(例如 `form input:eq(1)` 选择第二个输入框)。 - `:has(selector)`:选择包含指定子元素的元素(例如 `div:has(p)` 选择所有包含 `<p>` 的 `<div>`)。 - `:not(selector)`:排除特定元素(例如 `div:not(.logo)` 忽略有logo类的div)。 - `:contains(text)`:选择包含文本的元素(大小写敏感,例如 `p:contains('jsoup')`)。 这些特别适合网页抓取:例如,抓取搜索结果时,用 `:lt(5)` 获取前五个条目[^4]。 #### 4. **综合应用场景与最佳实践** - **适用场景**XPath在自动化测试、数据提取和API集成中非常高效。例如: - 网页抓取:使用相对路径 `//` 和函数如 `contains()` 处理动态内容。 - 自动化测试:利用逻辑操作符 `or` 和 `|` 应对页面变化,参考引用[^2]的"工具验证"建议,先用Chrome DevTools测试XPath[^2]。 - **使用技巧**- 优先从简单表达式开始,逐步添加谓语避免错误。 - 在JsoupXpath中,伪选择器与CSS选择器类似,但更简洁(见引用[^4])。 - 对于性能优化,避免过多嵌套路径(如 `//div//p` 可能效率低)。 总结:XPath语法从基础路径到高级逻辑和伪选择器,形成一个完整体系。核心是:熟悉节点选择、逻辑操作和函数应用;实践中借助工具如Jsoup库实现快速开发[^3][^4]。如果您是初学者,建议从引用[^1]的指南入手,进行小规模测试。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值