一、概述
XPath(XML Path Language)是一门在XML文档中查找信息的语言,它也可用于HTML文档,因为HTML可以看作是XML的一种特殊形式。XPath通过路径表达式来选取XML/HTML文档中的节点或者节点集。
二、节点类型
在XPath中,有多种节点类型,主要包括以下几种:
- 元素节点:这是最常见的节点类型,例如在HTML中,
<div>
、<p>
等标签对应的就是元素节点。例如在<div class="container">
这个代码片段中,<div>
就是一个元素节点。 - 属性节点:是元素节点的属性,比如对于
<a href="https://example.com">
,href
及其值https://example.com
构成一个属性节点,它属于<a>
这个元素节点。 - 文本节点:元素节点中的文本内容。如
<p>这是一段文本</p>
,“这是一段文本”就是一个文本节点。
三、基本语法
- 选取节点
- 绝对路径:从根节点开始选取,路径以斜杠
/
开头。例如,在一个XML文档中,如果根节点是<bookstore>
,要选取所有的<book>
元素,XPath表达式可以是/bookstore/book
。在HTML文档中,根节点是<html>
,如果要选取<body>
下的所有<div>
元素,表达式可以是/html/body/div
。 - 相对路径:不从根节点开始,而是从当前节点开始选取。例如,如果当前节点是
<section>
,要选取它内部的所有<p>
元素,可以使用p
这个相对路径表达式。
- 绝对路径:从根节点开始选取,路径以斜杠
- 通配符
*
:可以匹配任何元素节点。例如/bookstore/*
会选取bookstore
根节点下的所有子元素。@*
:可以匹配任何属性节点。例如//*[@*]
会选取文档中带有任何属性的所有元素。
- 轴(Axes)
- 子元素轴(child):默认情况下,XPath路径表达式选取的是子元素。例如
/bookstore/book
中的book
是bookstore
的子元素。 - 后代元素轴(descendant):使用
//
表示。例如//book
会选取文档中所有的book
元素,无论它们在文档结构中的层次有多深。 - 父元素轴(parent):可以用来选取当前节点的父节点。例如,如果当前节点是
<p>
,表达式parent::*
会选取<p>
的父元素。 - 祖先元素轴(ancestor):可以选取当前节点的所有祖先节点。例如
ancestor::div
会选取当前节点的所有<div>
类型的祖先节点。
- 子元素轴(child):默认情况下,XPath路径表达式选取的是子元素。例如
四、在编程语言中的应用
- Python
- 在Python中,可以使用
lxml
库来解析XML/HTML并使用XPath。首先需要安装lxml
库,然后可以这样使用:
from lxml import etree# 解析XML或HTML文档 tree = etree.parse('example.xml') # 使用XPath表达式选取节点 elements = tree.xpath('/bookstore/book') for element in elements:print(element.text)
- 在Python中,可以使用
- Java
- 在Java中,可以使用
JAXP
(Java API for XML Processing)结合XPath来处理。例如:
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathFactory; import org.w3c.dom.Document; import org.w3c.dom.NodeList;public class XPathExample {public static void main(String[] args) throws Exception {DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document document = builder.parse("example.xml");XPathFactory xpathFactory = XPathFactory.newInstance();XPath xpath = xpathFactory.newXPath();NodeList nodeList = (NodeList) xpath.evaluate("/bookstore/book", document, XPathConstants.NODESET);for (int i = 0; i < nodeList.getLength(); i++) {System.out.println(nodeList.item(i).getTextContent());}} }
- 在Java中,可以使用