如何使用 XPath – Evaluate() 方法
XPath
XPath(XML 路径语言)提供了一种灵活的方法,可以使用非 XML 语法指向基于 XML 文档的不同部分。XPath 的名称源于路径表达式,它提供了一种分层寻址文档树中节点的方法。XPath 是一种查询语言,具有多种可能性。XPath 允许处理符合 DOM 数据模型的值;它以 HTML 文档的 DOM 表示法为基础,通过各种标准选择节点。XPath 表达式还可用于 C 和 C++、JavaScript、XML Schema、PHP、Python 以及许多其他语言。
XPath 主要用于使用 XPath 表达式浏览基于 XML 语言文档的 DOM。您可以在 HTML 和 SVG 中使用 XPath,而不是依赖 GetElement() 或 QuerySelectorAll() 方法和其他 DOM 函数。
本文介绍如何使用 Evaluate() 方法浏览 HTML 文档并通过 XPath 查询选择节点。您将学习如何使用 XPath 表达式从 HTML 文档中选择所有照片。
您可以从 GitHub 下载数据文件和完整的 C# 示例,这些示例演示了 XPath 查询中 Evaluate() 方法的使用。
评估()方法
XPath 查询主要使用
Document 类的
Evaluate() 方法。Evaluate(expression
, contextNode
, resolver
, type
, result
) 方法接受一个 XPath 表达式和其他给定参数,并返回指定类型的结果。让我们来看看该方法的参数:
expression
是要评估的 XPath 的字符串表示形式。contextNode
指定了评估 XPath 表达式的上下文节点。通常将文档作为上下文节点。resolver
允许将 XPath 表达式中的所有前缀(包括 xml 命名空间前缀)转换为适当的命名空间 URI。type
与要返回的 XPathResult 结果类型相对应。如果指定了特定类型,则结果将以相应类型返回。result
是最常见的,它将创建一个新的 XPathResult。
XPath 查询 – 从网页中获取图像
通常情况下,您希望保存来自不同服务的大量图像,例如某个相册中的照片。手动操作是可行的,但需要花费大量时间。因此,这既费时又低效,您可以使用 Aspose.HTML 库来自动完成这一过程。
在本例中,您将学习如何使用 Evaluate() 方法和 XPath 表达式查找网页上所有所需图片的链接。XPath 是一种功能强大的查询语言,可让您自由定制查询。让我们来看看 HTML 文档 xpath-image.htm。它包括包含广告图片的页眉和页脚,以及包含照片行和广告横幅的主元素。
获取文档中所有图像的链接
让我们从一个直接的 XPath 查询开始,查询文档中的所有图像。下面使用了 XPath 表达式 //img
。它会选择所有 img
元素,无论它们在文档中的哪个位置:
XPath Expression
1//img
C# code
1var result = doc.Evaluate("//img", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
JavaScript code
1var result = document.evaluate("//img", document, null, XPathResult.ANY_TYPE, null);
此 XPath 查询将返回页眉和页脚的所有图像(照片、横幅)链接,以及照片行之间和照片行之间的链接。
去除页眉和页脚的横幅广告
首先,让我们去掉页眉和页脚中的横幅,有很多方法可以做到这一点,但在本例中,我们将通过父级元素设置过滤。XPath 查询//main//img
会返回所有//main
元素内嵌套的所有//img
元素。这个结果已经更适合从文档中获取照片的请求,但仍包含额外的横幅。
XPath Expression
1//main//img
C# code
1var result = doc.Evaluate("//main//img", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
JavaScript code
1var result = document.evaluate("//main//img", document, null, XPathResult.ANY_TYPE, null);
删除 “主 “容器中的一些横幅广告
下一步,让我们清除 main
容器的偶数 /div
子元素中的横幅。通过 XPath 表达式,您可以选择所有其位置编号除以 2 后余数为奇数的 /div
子元素:
XPath Expression
1//main/div[position() mod 2 = 1]//img
C# code
1var result = doc.Evaluate("//main/div[position() mod 2 = 1]//img", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
JavaScript code
1var result = document.evaluate("//main/div[position() mod 2 = 1]//img", document, null, XPathResult.ANY_TYPE, null);
因此,我们得到了一个包含照片和横幅广告链接的列表,这些链接位于所有奇特的 div
元素中,而这些元素都是 main
容器的子元素。
仅从 HTML 文档中获取照片链接
要清除照片中的横幅广告,XPath 表达式必须包含图像类名称,因为行中的所有照片都有相应的类 photo
:
XPath Expression
1//main/div[position() mod 2 = 1]//img[@class = 'photo']
C# code
1var result = doc.Evaluate("//main/div[position() mod 2 = 1]//img[@class = 'photo']", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
JavaScript code
1var result = document.evaluate("//main/div[position() mod 2 = 1]//img[@class = 'photo']", document, null, XPathResult.ANY_TYPE, null);
结果,我们得到了一个只包含照片链接的列表。因此,唯一要做的就是下载它们。
C# 示例 – 仅从 HTML 文档中获取照片链接
让我们以 C# 为例,看看如何使用 Evaluate() 方法,使用 XPath 表达式从 HTML 文档中选择所有照片。您应遵循以下几个步骤
- 加载现有的 HTML 文件 ( xpath-image.htm)。
- 使用 Document 类的 Evaluate() 方法,并向其传递 XPath 表达式和其他参数。
- 遍历结果节点,并将其打印到控制台。
- 您将得到一个仅包含 HTML 文档中照片链接的列表。
1// Use XPath to get only links to photos from HTML
2
3// Create an instance of an HTML document
4using (HTMLDocument doc = new HTMLDocument(Path.Combine(DataDir, "xpath-image.htm")))
5{
6 // Evaluate the XPath expression
7 IXPathResult result = doc.Evaluate("//main/div[position() mod 2 = 1]//img[@class = 'photo']", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
8 // Iterate over the resulted nodes and print them to the console
9 Node node;
10 while ((node = result.IterateNext()) != null)
11 {
12 HTMLImageElement img = (HTMLImageElement)node;
13 Console.WriteLine(img.Src);
14 }
15}
Aspose.HTML 提供免费的 HTML 网络应用程序,是转换器、合并器、搜索引擎优化工具、HTML 代码生成器、URL 工具等的在线集合。这些应用程序可在任何装有网络浏览器的操作系统上运行,无需安装任何其他软件。它是一种快速、简便的方法,能有效解决与 HTML 相关的任务。