如何使用 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 表达式和其他给定参数,并返回指定类型的结果。让我们来看看该方法的参数:

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 文档中选择所有照片。您应遵循以下几个步骤

  1. 加载现有的 HTML 文件 ( xpath-image.htm)。
  2. 使用 Document 类的 Evaluate() 方法,并向其传递 XPath 表达式和其他参数。
  3. 遍历结果节点,并将其打印到控制台。
  4. 您将得到一个仅包含 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 相关的任务。

文本 “HTML 网络应用程序”

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.