Как использовать XPath – Evaluate() метод

XPath

XPath (XML Path Language) обеспечивает гибкий способ указания на различные части XML-документа с использованием синтаксиса, отличного от XML. Имя XPath происходит от выражения пути, которое обеспечивает средство иерархической адресации узлов в дереве документа. XPath – это язык запросов с множеством возможностей. XPath позволяет обрабатывать значения, соответствующие модели данных DOM; он основан на DOM-представлении HTML-документа и выбирает узлы по различным критериям. Выражения XPath также можно использовать в C и C++, JavaScript, XML-схеме, PHP, Python и многих других языках.

XPath в основном используется для навигации по модели DOM языкового документа на основе XML с использованием выражений XPath. Вы можете использовать XPath в HTML и SVG вместо того, чтобы полагаться на GetElement() или QuerySelectorAll() и другие функции DOM.

В этой статье рассказывается, как использовать метод Evaluate() для навигации по документу HTML и выбора узлов по XPath-запрос. Вы узнаете, как выбрать все фотографии из документа HTML, используя выражения XPath.

Вы можете загрузить файлы данных и полные примеры C#, демонстрирующие использование метода Evaluate() для запросов XPath, из GitHub.

Метод Evaluate()

Запросы XPath в основном выполняются с использованием Evaluate() метода Document класса. Метод Evaluate(expression, contextNode, resolver, type, result) принимает выражение XPath и другие заданные параметры и возвращает результат указанного типа. Рассмотрим параметры метода:

Запрос XPath – получение изображений с веб-страницы

Часто требуется сохранить большое количество изображений из разных сервисов, например фотографии из определенного альбома. Вручную это можно сделать, но это займет значительное количество времени. Таким образом, это долго и неэффективно, поэтому вы можете использовать библиотеку Aspose.HTML для автоматизации этого процесса. В этом примере вы узнаете, как найти ссылки на все нужные изображения на веб-странице, используя метод Evaluate() и выражение XPath. XPath – это мощный язык запросов, предоставляющий широкие возможности для настройки запросов. Давайте взглянем на HTML-документ xpath-image.htm. Он состоит из шапки и футера (header and footer), содержащих рекламные изображения, а также основного элемента, состоящего из рядов фотографий, перемежающихся рекламными баннерами.

Получить ссылки на все изображения в документе

Начнем с простого 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-запрос вернет все ссылки на изображения (фотографии, баннеры) из header и footer, а также те, что находятся между рядами фотографий и среди них.

Для начала избавимся от баннеров в header и footer, есть много способов сделать это, но в данном примере мы поставим фильтрацию по родителю. Запрос XPath //main//img возвращает все вложенные элементы //img во все элементы //main. Этот результат уже лучше подходит для запроса на получение фотографий из документа, но все еще содержит лишние баннеры.

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);

Избавьтесь от некоторых баннеров в «основном» контейнере

На следующем шаге давайте избавимся от баннеров в четных дочерних элементах /div контейнера main. Это выражение XPath позволяет выбрать все дочерние элементы /div, номер позиции которых даст остаток при делении на 2, то есть нечетный:

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() для выбора всех фотографий из HTML-документа с использованием выражений XPath. Вы должны выполнить несколько шагов:

  1. Загрузите существующий файл HTML ( xpath-image.htm).
  2. Используйте метод Evaluate() класса Document и передайте ему выражение XPath и другие параметры.
  3. Переберите полученные узлы и выведите их на консоль.
  4. Вы получите список, содержащий только ссылки на фотографии из HTML-документа.
 1using Aspose.Html;
 2using Aspose.Html.Dom;
 3using Aspose.Html.Dom.XPath;
 4using System.IO;
 5...	
 6
 7	// Create an instance of an HTML document
 8	using (var doc = new HTMLDocument(Path.Combine(DataDir, "xpath.htm")))
 9	{
10	    // Evaluate the XPath expression
11		var result = doc.Evaluate("//main/div[position() mod 2 = 1]//img[@class = 'photo']", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
12	    
13		// Iterate over the resulted nodes and print them to the console
14		Node node;
15	    while ((node = result.IterateNext()) != null)
16	    {
17	        var img = (HTMLImageElement)node;
18	        Console.WriteLine(img.Src);
19	    }       
20	}        

Aspose.HTML предлагает бесплатные Веб-приложения HTML, которые представляют собой онлайн-коллекцию конвертеров, слияний, загрузчиков, инструментов SEO, генераторов HTML-кода и многое другое. Приложения работают в любой операционной системе с веб-браузером и не требуют установки дополнительного программного обеспечения. Это быстрый и простой способ эффективно и действенно решать ваши задачи, связанные с HTML.

Text “Баннер веб-приложений HTML”

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.