XPath基础知识点讲解——用于在XML中查找信息的语言
1. 什么是XPath?
XPath(XML Path Language)是用于在XML(Extensible Markup Language)文档中查找信息的语言。它可以通过路径表达式来选择XML文档中的节点,类似于如何在文件系统中使用路径查找文件。XPath是W3C(万维网联盟)的标准,广泛应用于XML文档的解析和处理。
2. 为什么使用XPath?
XML是一种标记语言,用于以结构化方式存储和传输数据。由于XML文档常常包含大量嵌套的标签和复杂的层次结构,直接查找特定的节点(例如获取某个子标签或其属性值)会很复杂。XPath通过提供一种精确且强大的查询语言,使得可以轻松定位并提取所需的节点或属性。
举个例子:
<bookstore><book category="fiction"><title lang="en">Harry Potter</title><author>J.K. Rowling</author><year>2005</year><price>29.99</price></book><book category="technology"><title lang="en">Learning XML</title><author>Erik T. Ray</author><year>2003</year><price>39.95</price></book>
</bookstore>
在这个XML文档中,如果想查找第二本书的标题,可以使用XPath来高效获取该节点。
3. XPath的基本语法
XPath语法使用路径表达式来选择节点。最常见的路径表达式有以下几类:
3.1 节点选择器
- /:从根节点开始选择。例如,- /bookstore会选择根节点- <bookstore>。
- //:从文档中的当前节点选择匹配节点,不考虑它们的位置。例如,- //title会选择文档中所有的- <title>元素。
- .:选取当前节点。例如,- .//book会选取当前节点的所有- <book>子节点。
- ..:选取当前节点的父节点。例如,- ../book会选取父节点的- <book>元素。
- @:选取属性。例如,- //@category会选取所有节点的- category属性。
3.2 过滤条件
过滤条件允许根据特定条件来选择节点。过滤条件放在方括号[]中:
- [ ]:过滤器,用于指定查找条件。- 例子://book[price>30]会选择<price>大于30的书。
- 例子:/bookstore/book[2]会选择第二个<book>节点。
 
- 例子:
3.3 运算符
- =:等于。例如,- //book[@category='fiction']选择所有- category属性等于- fiction的书。
- !=:不等于。例如,- //book[@category!='fiction']选择- category属性不等于- fiction的书。
- >,- <,- >=,- <=:比较运算符,用于数值和字符串的比较。
4. XPath的节点类型
XPath会返回特定类型的节点,理解这些节点类型有助于编写正确的XPath查询。
- 元素节点:XML文档中的标签。例如<book>、<author>。
- 属性节点:元素的属性。例如category="fiction"中的category属性。
- 文本节点:标签内的文本内容。例如<title>Harry Potter</title>中的Harry Potter。
- 根节点:整个XML文档的根节点,通常是最外层的标签。
- 父节点:一个节点的上级节点。例如<book>是<title>的父节点。
5. XPath函数
XPath提供了许多内置函数来处理节点和字符串。
- text():返回元素的文本内容。例如,- //title/text()会返回所有标题的文本。
- contains():判断字符串是否包含某个子字符串。例如,- //title[contains(text(),'Harry')]会选择标题包含“Harry”的所有元素。
- starts-with():判断字符串是否以某个子字符串开头。例如,- //title[starts-with(text(),'Harry')]会选择标题以“Harry”开头的元素。
- string-length():返回字符串的长度。例如,- //title[string-length(text()) > 10]选择文本长度大于10的标题。
6. 常见XPath表达式示例
下面列出一些常见的XPath表达式及其含义:
-  选择根节点: 
 /bookstore
 选择<bookstore>节点。
-  选择所有子节点: 
 /bookstore/book
 选择<bookstore>下的所有<book>子节点。
-  选择所有节点的特定属性: 
 //@category
 选择所有节点的category属性。
-  选择特定条件的节点: 
 //book[price > 30]
 选择<price>值大于30的<book>节点。
-  选择第一个或最后一个节点: 
 /bookstore/book[1]
 选择第一个<book>节点。
 /bookstore/book[last()]
 选择最后一个<book>节点。
-  选择属性值匹配的节点: 
 //book[@category='fiction']
 选择category属性等于fiction的所有书。
7. XPath在实际中的应用
7.1 在浏览器开发工具中使用XPath
现代浏览器的开发者工具(如Chrome DevTools)允许你通过XPath查询HTML元素。这对于调试和分析网页结构非常有用。
操作步骤:
- 打开浏览器的开发者工具(右键点击网页 -> 审查元素)。
- 在“元素”面板中右键某个元素,选择“复制 -> XPath”。
- 在控制台中粘贴该XPath查询,点击回车,即可查看匹配的元素。
7.2 XPath在编程中的使用
常见的编程语言(如Python、Java、JavaScript等)都支持使用XPath解析和处理XML或HTML文档。
XPath在JavaScript中的使用
在JavaScript中,可以通过浏览器的内置API document.evaluate() 来使用XPath查询HTML文档。以下是一个JavaScript示例,演示如何使用XPath从HTML文档中查找元素:
示例1:JavaScript中使用XPath查找元素
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>XPath Example</title>
</head>
<body><div class="bookstore"><div class="book" category="fiction"><span class="title" lang="en">Harry Potter</span><span class="author">J.K. Rowling</span><span class="year">2005</span><span class="price">29.99</span></div><div class="book" category="technology"><span class="title" lang="en">Learning XML</span><span class="author">Erik T. Ray</span><span class="year">2003</span><span class="price">39.95</span></div></div><script>// 使用XPath查找所有书的标题const xpath = "//div[@class='book']/span[@class='title']/text()";const result = document.evaluate(xpath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);for (let i = 0; i < result.snapshotLength; i++) {console.log(result.snapshotItem(i).nodeValue);  // 输出:Harry Potter, Learning XML}</script>
</body>
</html>
解释:
- document.evaluate():用于评估XPath表达式,返回符合查询条件的节点。
- XPathResult.ORDERED_NODE_SNAPSHOT_TYPE:返回多个结果节点的快照,允许使用- snapshotItem()按顺序获取每个节点。
- result.snapshotItem(i).nodeValue:获取文本节点的值(即书名)。
XPath在Java中的使用
在Java中,使用javax.xml.xpath包来处理XML文档中的XPath查询。需要先将XML文档解析为Document对象,然后通过XPath API执行查询。
示例2:Java中使用XPath查找元素
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathFactory;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathConstants;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import java.io.File;public class XPathExample {public static void main(String[] args) {try {// 解析XML文件File inputFile = new File("books.xml");DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();Document doc = dBuilder.parse(inputFile);doc.getDocumentElement().normalize();// 创建XPath对象XPath xPath = XPathFactory.newInstance().newXPath();// XPath表达式String expression = "//book/title/text()";// 执行XPath表达式,返回节点列表XPathExpression expr = xPath.compile(expression);NodeList nodeList = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);// 输出查询结果for (int i = 0; i < nodeList.getLength(); i++) {System.out.println(nodeList.item(i).getNodeValue());}} catch (Exception e) {e.printStackTrace();}}
}
解释:
- DocumentBuilderFactory和- DocumentBuilder:用于解析XML文件,并将其转换为- Document对象。
- XPathFactory.newInstance().newXPath():创建XPath对象。
- compile():编译XPath表达式。
- evaluate():执行XPath表达式,获取查询结果。
- XPathConstants.NODESET:表示结果将是节点集(多个节点)。
- nodeList.item(i).getNodeValue():获取文本节点的值。
XML文件(books.xml)示例:
 
<bookstore><book category="fiction"><title lang="en">Harry Potter</title><author>J.K. Rowling</author><year>2005</year><price>29.99</price></book><book category="technology"><title lang="en">Learning XML</title><author>Erik T. Ray</author><year>2003</year><price>39.95</price></book>
</bookstore>
8. 总结
XPath是一个强大且灵活的查询语言,能够轻松在复杂的XML文档中查找节点。通过掌握基本的路径表达式、过滤条件、函数等知识,可以高效地提取和处理XML文档中的数据。无论是在解析配置文件、处理网络数据、还是分析HTML文档,XPath都扮演着重要的角色。
相关文章:
XPath基础知识点讲解——用于在XML中查找信息的语言
1. 什么是XPath? XPath(XML Path Language)是用于在XML(Extensible Markup Language)文档中查找信息的语言。它可以通过路径表达式来选择XML文档中的节点,类似于如何在文件系统中使用路径查找文件。XPath是…...
Visual Studio 2022
VS(Visual Studio)是一款由微软开发的集成开发环境(IDE),用于开发应用程序、网站以及移动应用等。VS的历史可以追溯到1997年,当时发布了第一个版本的VS。以下是VS的一些重要历史里程碑: Visual …...
 
微软Win11 22H2/23H2 九月可选更新KB5043145发布!
系统之家于9月27日发出最新报道,微软针对Windows11系统,发布了九月最新可选更新补丁KB5043145,22H2用户安装后,系统版本号升至22621.4249,23H2用户安装后升至22631.4249。本次更新修复了Edge使用IE模式有时会停止响应等…...
 
试试号称最好的7B模型(论文复现)
试试号称最好的7B模型(论文复现) 本文所涉及所有资源均在传知代码平台可获取 文章目录 试试号称最好的7B模型(论文复现)概述论文原理部署与复现推理微调adapter 融合 概述 Mistral 7B 是一个新型的具有 7.3 万亿参数的大语言模型。…...
CTF中文件包含
php伪协议的分类 伪协议是文件包含的基础,理解伪协议的原理才能更好的利用文件包含漏洞。 php://input php://input代表可以访问请求的原始数据,简单来说POST请求的情况下,php://input可以获取到post的数据。 使用条件:includ…...
 
20.指针相关知识点1
指针相关知识点1 1.定义一个指针变量指向数组2.指针偏移遍历数组3.指针偏移的补充4.指针和数组名的见怪不怪5.函数、指针、数组的结合 1.定义一个指针变量指向数组 指向数组首元素的地址 指向数组起始位置:等于数组名 #include <stdio.h>int main(){int ar…...
 
PFC和LLC的本质和为什么要用PFC和LLC电路原因
我们可以用电感和电容的特性,以及电压和电流之间的不同步原理来解释PFC(功率因数校正)和LLC(谐振变换器)。 电感和电容的基本概念 电感(Inductor): 电感是一种储存电能的组件。它的电流变化比较慢,电流在电感中延迟,而电压变化得比较快。可以把电感想象成一个“滞后…...
 
自定义认证过滤器和自定义授权过滤器
目录 通过数据库动态加载用户信息 具体实现步骤 一.创建数据库 二.编写secutity配置类 三.编写controller 四.编写服务类实现UserDetailsService接口类 五.debug springboot启动类 认证过滤器 SpringSecurity内置认证流程 自定义认证流程 第一步:自定义一个类继承Abstr…...
单节点集群的设置及数据写入
背景:elasticsearch单个node节点写入数据-CSDN博客 单个节点数据,如下设置参数, 在单节点集群中,设置 `gateway.recover_after_nodes` 通常是没有意义的,因为单节点集群只有一个节点,无法满足 `gateway.recover_after_nodes` 的条件。然而,如果你仍然想在单节点集群中…...
 
【Linux学习】【Ubuntu入门】1-2 新建虚拟机ubuntu环境
1.双击打开VMware软件,点击“创建新的虚拟机”,在弹出的中选择“自定义(高级)” 2.点击下一步,自动识别ubuntu光盘映像文件,也可以点击“浏览”手动选择,点击下一步 3.设置名称及密码后…...
 
自动驾驶系列—自动驾驶MCU架构全方位解析:从单核到多核的选型指南与应用实例
🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…...
 
基于单片机多功能称重系统设计
** 文章目录 前言概要功能设计设计思路 软件设计效果图 程序文章目录 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对…...
 
PWA(Progressive web APPs,渐进式 Web 应用): manifest.json、 Service Worker
文章目录 引言I 什么是 PWA功能特性技术上分为三个部分安装应用II Web 应用清单将Web 应用清单文件链接到站点manifest.json字段说明III Service Worker( 缓存管理)IV 结合构建工具让项目支持 PWA应用使用插件vite-plugin-pwaworkbox-webpack-plugin插件扩展知识将 PWA 作为脱机…...
 
【学习笔记】手写 Tomcat 八
目录 一、NIO 1. 创建 Tomcat NIO 类 2. 启动 Tomcat 3. 测试 二、解析请求信息 三、响应数据 创建响应类 修改调用的响应类 四、完整代码 五、测试 六、总结 七、获取全部用户的功能 POJO 生成 POJO 1. 在 Dao 层定义接口 2. 获取用户数据 3. 在 Service 层定…...
 
24年九月份生活随笔
九月份最后一天,烈士纪念日。 上午看了一会儿直播,庄重的仪式,铭记先辈为新中国抛头颅洒热血,当今盛世,如您所愿。 郑州马拉松官方通告,今天十点公布直通,中签,候补结果。 看完直…...
 
[含文档+PPT+源码等]精品大数据项目-基于Django实现的高校图书馆智能推送系统的设计与实现
大数据项目——基于Django实现的高校图书馆智能推送系统的设计与实现背景,可以从以下几个方面进行详细阐述: 一、信息技术的发展背景 随着信息技术的飞速发展和互联网的广泛普及,大数据已经成为现代社会的重要资源。在大数据背景下…...
 
Leecode刷题之路第七天之整数反转
题目出处 07-整数反转 题目描述 个人解法 思路: 1.将整数转换为字符串 2.倒序输出字符串 3.兼容负数case 代码示例:(Java) public int reverse(int x) {Integer integer new Integer(x);String s integer.toString();Strin…...
 
SpringBoot项目 | 瑞吉外卖 | 短信发送验证码功能改为免费的邮箱发送验证码功能 | 代码实现
0.前情提要 之前的po已经说了单独的邮箱验证码发送功能怎么实现: https://blog.csdn.net/qq_61551948/article/details/142641495 这篇说下如何把该功能整合到瑞吉项目里面,也就是把原先项目里的短信发送验证码的功能改掉,改为邮箱发送验证…...
 
Windows暂停更新
目录 前言注册表设定参考 前言 不想Windows自动更新,同时不想造成Windows商店不可用,可以采用暂停更新的方案。 但是通过这里设定的时间太短了,所以我们去注册表设定。 注册表设定 win r 输入 regedit进入注册表 HKEY_LOCAL_MACHINE\SOFT…...
 
alpine安装docker踩坑记
文章目录 前言错误场景正确操作最后 前言 你好,我是醉墨居士,最近使用alpine操作系统上docker遇到了一些错误,尝试解决之后就准备输出一篇博客,帮助有需要的后人能够少踩坑,因为淋过雨所以想给别人撑伞 错误场景 我…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
 
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
 
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
 
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
 
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
 
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
