当前位置: 首页 > 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都扮演着重要的角色。

相关文章:

  • [vulnhub] Jarbas-Jenkins
  • numpy is not available
  • 982. 按位与为零的三元组
  • UI设计师面试整理-工具和技术技能
  • list(二) (list模拟实现)
  • HOJ网站开启https访问 申请免费SSL证书 部署证书详细操作指南
  • CANopen开源库canfestival的移植
  • 深度解析APP软件开发:构建卷轴式分销系统的实践探索
  • 一个PDF样本册免费上传网站
  • 【HTTP 和 HTTPS详解】3
  • 【PAM】Linux登录认证限制
  • 前后端传参
  • 企业内训|大模型/智算行业发展机会深度剖析-某数据中心厂商
  • EZUIKit.js萤石云vue项目使用
  • BufferQueue低延迟优化,以及SurfaceView帧率上限问题解决
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 2017前端实习生面试总结
  • create-react-app项目添加less配置
  • ES6 学习笔记(一)let,const和解构赋值
  • Java的Interrupt与线程中断
  • MySQL主从复制读写分离及奇怪的问题
  • PHP CLI应用的调试原理
  • Redis在Web项目中的应用与实践
  • XForms - 更强大的Form
  • 从0实现一个tiny react(三)生命周期
  • 翻译--Thinking in React
  • -- 数据结构 顺序表 --Java
  • 通信类
  • Java总结 - String - 这篇请使劲喷我
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • #pragma once与条件编译
  • #QT(智能家居界面-界面切换)
  • (1)STL算法之遍历容器
  • (2020)Java后端开发----(面试题和笔试题)
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (备忘)Java Map 遍历
  • (二)Optional
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (南京观海微电子)——COF介绍
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)jQuery 基础
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .net MySql
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .Net--CLS,CTS,CLI,BCL,FCL
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .NetCore部署微服务(二)
  • .net反编译工具
  • .net经典笔试题