当前位置: 首页 > news >正文

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表达式及其含义:

  1. 选择根节点
    /bookstore
    选择<bookstore>节点。

  2. 选择所有子节点
    /bookstore/book
    选择<bookstore>下的所有<book>子节点。

  3. 选择所有节点的特定属性
    //@category
    选择所有节点的category属性。

  4. 选择特定条件的节点
    //book[price > 30]
    选择<price>值大于30的<book>节点。

  5. 选择第一个或最后一个节点
    /bookstore/book[1]
    选择第一个<book>节点。
    /bookstore/book[last()]
    选择最后一个<book>节点。

  6. 选择属性值匹配的节点
    //book[@category='fiction']
    选择category属性等于fiction的所有书。

7. XPath在实际中的应用

7.1 在浏览器开发工具中使用XPath

现代浏览器的开发者工具(如Chrome DevTools)允许你通过XPath查询HTML元素。这对于调试和分析网页结构非常有用。

操作步骤:

  1. 打开浏览器的开发者工具(右键点击网页 -> 审查元素)。
  2. 在“元素”面板中右键某个元素,选择“复制 -> XPath”。
  3. 在控制台中粘贴该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();}}
}
解释:
  1. DocumentBuilderFactoryDocumentBuilder:用于解析XML文件,并将其转换为Document对象。
  2. XPathFactory.newInstance().newXPath():创建XPath对象。
  3. compile():编译XPath表达式。
  4. evaluate():执行XPath表达式,获取查询结果。
  5. XPathConstants.NODESET:表示结果将是节点集(多个节点)。
  6. 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&#xff1f; XPath&#xff08;XML Path Language&#xff09;是用于在XML&#xff08;Extensible Markup Language&#xff09;文档中查找信息的语言。它可以通过路径表达式来选择XML文档中的节点&#xff0c;类似于如何在文件系统中使用路径查找文件。XPath是…...

Visual Studio 2022

VS&#xff08;Visual Studio&#xff09;是一款由微软开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于开发应用程序、网站以及移动应用等。VS的历史可以追溯到1997年&#xff0c;当时发布了第一个版本的VS。以下是VS的一些重要历史里程碑&#xff1a; Visual …...

微软Win11 22H2/23H2 九月可选更新KB5043145发布!

系统之家于9月27日发出最新报道&#xff0c;微软针对Windows11系统&#xff0c;发布了九月最新可选更新补丁KB5043145&#xff0c;22H2用户安装后&#xff0c;系统版本号升至22621.4249&#xff0c;23H2用户安装后升至22631.4249。本次更新修复了Edge使用IE模式有时会停止响应等…...

试试号称最好的7B模型(论文复现)

试试号称最好的7B模型&#xff08;论文复现&#xff09; 本文所涉及所有资源均在传知代码平台可获取 文章目录 试试号称最好的7B模型&#xff08;论文复现&#xff09;概述论文原理部署与复现推理微调adapter 融合 概述 Mistral 7B 是一个新型的具有 7.3 万亿参数的大语言模型。…...

CTF中文件包含

php伪协议的分类 伪协议是文件包含的基础&#xff0c;理解伪协议的原理才能更好的利用文件包含漏洞。 php://input php://input代表可以访问请求的原始数据&#xff0c;简单来说POST请求的情况下&#xff0c;php://input可以获取到post的数据。 使用条件&#xff1a;includ…...

20.指针相关知识点1

指针相关知识点1 1.定义一个指针变量指向数组2.指针偏移遍历数组3.指针偏移的补充4.指针和数组名的见怪不怪5.函数、指针、数组的结合 1.定义一个指针变量指向数组 指向数组首元素的地址 指向数组起始位置&#xff1a;等于数组名 #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软件&#xff0c;点击“创建新的虚拟机”&#xff0c;在弹出的中选择“自定义&#xff08;高级&#xff09;” 2.点击下一步&#xff0c;自动识别ubuntu光盘映像文件&#xff0c;也可以点击“浏览”手动选择&#xff0c;点击下一步 3.设置名称及密码后&#xf…...

自动驾驶系列—自动驾驶MCU架构全方位解析:从单核到多核的选型指南与应用实例

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…...

基于单片机多功能称重系统设计

** 文章目录 前言概要功能设计设计思路 软件设计效果图 程序文章目录 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通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年九月份生活随笔

九月份最后一天&#xff0c;烈士纪念日。 上午看了一会儿直播&#xff0c;庄重的仪式&#xff0c;铭记先辈为新中国抛头颅洒热血&#xff0c;当今盛世&#xff0c;如您所愿。 郑州马拉松官方通告&#xff0c;今天十点公布直通&#xff0c;中签&#xff0c;候补结果。 看完直…...

[含文档+PPT+源码等]精品大数据项目-基于Django实现的高校图书馆智能推送系统的设计与实现

大数据项目——基于Django实现的高校图书馆智能推送系统的设计与实现背景&#xff0c;可以从以下几个方面进行详细阐述&#xff1a; 一、信息技术的发展背景 随着信息技术的飞速发展和互联网的广泛普及&#xff0c;大数据已经成为现代社会的重要资源。在大数据背景下&#xf…...

Leecode刷题之路第七天之整数反转

题目出处 07-整数反转 题目描述 个人解法 思路&#xff1a; 1.将整数转换为字符串 2.倒序输出字符串 3.兼容负数case 代码示例&#xff1a;&#xff08;Java&#xff09; public int reverse(int x) {Integer integer new Integer(x);String s integer.toString();Strin…...

SpringBoot项目 | 瑞吉外卖 | 短信发送验证码功能改为免费的邮箱发送验证码功能 | 代码实现

0.前情提要 之前的po已经说了单独的邮箱验证码发送功能怎么实现&#xff1a; https://blog.csdn.net/qq_61551948/article/details/142641495 这篇说下如何把该功能整合到瑞吉项目里面&#xff0c;也就是把原先项目里的短信发送验证码的功能改掉&#xff0c;改为邮箱发送验证…...

Windows暂停更新

目录 前言注册表设定参考 前言 不想Windows自动更新&#xff0c;同时不想造成Windows商店不可用&#xff0c;可以采用暂停更新的方案。 但是通过这里设定的时间太短了&#xff0c;所以我们去注册表设定。 注册表设定 win r 输入 regedit进入注册表 HKEY_LOCAL_MACHINE\SOFT…...

alpine安装docker踩坑记

文章目录 前言错误场景正确操作最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;最近使用alpine操作系统上docker遇到了一些错误&#xff0c;尝试解决之后就准备输出一篇博客&#xff0c;帮助有需要的后人能够少踩坑&#xff0c;因为淋过雨所以想给别人撑伞 错误场景 我…...

使用openpyxl轻松操控Excel文件

目录 1. openpyxl 简介2. 安装与快速入门2.1 安装 openpyxl2.2 快速创建一个 Excel 文件2.3 读取 Excel 文件 3. openpyxl 的核心概念3.1 工作簿&#xff08;Workbook&#xff09;3.2 工作表&#xff08;Worksheet&#xff09;3.3 单元格&#xff08;Cell&#xff09;3.4 行与列…...

指定PDF或图片多个识别区域,识别区域文字,并批量对PDF或图片文件改名

常见场景 用户有大量图片/PDF文件&#xff0c;期望能按照图片/PDF中的某些文字对图片/PDF文件重命名。期望工具可以批量处理、离线识别&#xff08;保证数据安全性&#xff09;。手工操作麻烦。具体场景&#xff1a;用户有工程现场照片&#xff0c;订单&#xff0c;简历等PDF或…...

Web3中的跨链技术:实现无缝连接的挑战

Web3的到来为互联网带来了去中心化的愿景&#xff0c;而跨链技术则是实现这一愿景的关键。跨链技术旨在解决不同区块链之间的互操作性问题&#xff0c;使得用户和应用能够在多个区块链网络之间无缝地传输数据和价值。尽管这一技术具有广阔的前景&#xff0c;但在实现过程中仍面…...

词袋(Bag of Words, BoW)

词袋&#xff08;Bag of Words, BoW&#xff09;模型详解 词袋&#xff08;BoW&#xff09;是一种用于文本处理的特征提取方法&#xff0c;常用于自然语言处理&#xff08;NLP&#xff09;任务中。在BoW模型中&#xff0c;文本被表示为一个词的无序集合&#xff0c;而忽略了词…...

HTTP Status 404 - /brand-demo/selectAllServlet错误解决原因-Servlet/JavaWeb/IDEA

检查xml文件的包名有无错误检查html文件的url有无写错&#xff0c;是否与Servlet的urlPatterns一致检查Servlet的urlpattern有没有写错(如写成name),检查doPost、doGet是否正常运行 注&#xff1a;IDEA新建Servlet时&#xff0c;默认的WebServlet注解中name需要改urlPatterns&…...

宁夏众智科技OA办公系统存在SQL注入漏洞

漏洞描述 宁夏众智科技OA办公系统存在SQL注入漏洞 漏洞复现 POC POST /Account/Login?ACTIndex&CLRHome HTTP/1.1 Host: Content-Length: 45 Cache-Control: max-age0 Origin: http://39.105.48.206 Content-Type: application/x-www-form-urlencoded Upgrade-Insecur…...

Spring邮件发送:配置与发送邮件详细步骤?

Spring邮件发送教程指南&#xff1f;怎么用Spring邮件发送服务&#xff1f; Spring框架提供了强大的邮件发送支持&#xff0c;使得开发者能够轻松地在应用程序中集成邮件发送功能。AokSend将详细介绍如何在Spring应用中配置和发送邮件&#xff0c;帮助开发者快速掌握这一关键技…...

iPhone/iPad技巧:如何解锁锁定的 iPhone 或 iPad

“在我更新 iPhone 上的软件后&#xff0c;最近我遇到了iPhone 被锁定到所有者的消息&#xff0c;该如何解决&#xff1f;” 根据我们的研究&#xff0c;许多用户在 iOS 18 更新或恢复出厂设置后都会遇到同样的问题。只要出现问题&#xff0c;您就无法使用 iPhone 或 第 1 部分…...

无源码实现免登录功能

因项目要求需要对一个没有源代码的老旧系统实现免登录功能&#xff0c;系统采用前后端分离的方式部署&#xff0c;登录时前端调用后台的认证接口&#xff0c;认证接口返回token信息&#xff0c;然后将token以json的方式存储到cookie中&#xff0c;格式如下&#xff1a; 这里有…...

大数据毕业设计选题推荐-民族服饰数据分析系统-Python数据可视化-Hive-Hadoop-Spark

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…...

苹果网站用什么做的/中国十大电商培训机构

解决报告 http://blog.csdn.net/juncoder/article/details/38136193 题目传送门 题意&#xff1a; n头m个机器&#xff0c;求最大匹配。 ps 一分钟前刚做了POJ1469 直接改了输入输出就交了&#xff0c;题意全然一样&#xff0c;&#xff0c;&#xff0c;sad &#xff0c;代码传…...

腾讯云 wordpress博客/山东网站seo

1)默认自带python2环境,自行安装pip yum -y install epel-release yum install python-pip 2)进行pip的更新,否则很多安装会报错 pip install --upgrade pip pip install --upgrade setuptools 3)安装开发库 yum install python-devel yum install libevent-devel yu…...

自己的网站怎么做隐藏内容/常德seo快速排名

程序集生成失败 -- 引用的程序集“Interop.MSScriptControl”没有强名称 为没有源码的DLL文件添加强名称如果项目中引用了其他没有源码的dll文件&#xff0c;并且此dll文件是没有强名称的程序集&#xff0c;则编译时会出现类似 "Assembly generation failed -- 引用的程序…...

昆明做网站的公司哪家好/软文范例大全200字

2019独角兽企业重金招聘Python工程师标准>>> 1.缓存 查询数据时将查询结果存放到内存&#xff08;缓存区&#xff09;中。每次查询数据时&#xff0c;先判断缓存区中是否存在数据&#xff0c; 如果存在&#xff0c;就从缓存区中获取数据如果不存在&#xff0c;就从数…...

网站做百度权重排名论坛/初学seo网站推广需要怎么做

merge merge 函数通过一个或多个键将数据集的行连接起来。 场景&#xff1a;针对同一个主键存在的两张包含不同特征的表&#xff0c;通过主键的链接&#xff0c;将两张表进行合并。合并之后&#xff0c;两张表的行数不增加&#xff0c;列数是两张表的列数之和。 def merge(left…...

flash做网站的论文/搜索热度查询

TMaMba 2014/01/13 17:010x00 前言在渗透测试和安全扫描工作中&#xff0c;发现越来越多站点部署了应用防护系统或异常流量监控系统&#xff0c;其中包括&#xff1a;WEB应用防火墙&#xff08;软件WAF、硬件WAF、云WAF&#xff09;、入侵检测系统、入侵防御系统、访问监控系统…...