Как использовать XPath для выбора узлов XML – C#

XPath (XML Path Language) основан на DOM-представлении XML-документа. Таким образом, вы можете использовать XPath для поиска определенного узла или узлов в файле XML, которые соответствуют некоторым критериям, определенным в выражении XPath. В статье рассмотрены С# примеры выбора необходимой информации из XML-файла с помощью XPath-запросов. Вы узнаете, как перемещаться по XML-документу и выбирать узлы с помощью XPath.

Чтобы узнать, как использовать метод Evaluate() для навигации по HTML-документу и выбора узлов с помощью запроса XPath, см. статью Как использовать XPath – Evaluate() метод.

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

Запрос XPath – выбор узлов из XML-файла

В этих примерах показано, как выбрать необходимую информацию из XML-файла с помощью языка запросов XPath. Давайте взглянем на XML-документ cars.xml. Этот тестовый XML-документ содержит базу данных автомобильных дилеров, их номера телефонов, имена и список автомобилей, которыми они владеют.

Давайте последовательно составим выражения XPath, которые будут выбирать имена, номера телефонов и список интересующих вас автомобилей. XPath обладает мощными возможностями, как вы увидите в следующих примерах:

Выберите все узлы “Dealer” в файле XML.

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

Начнем с простого XPath-запроса для всех узлов “Dealer” в XML-документе. В следующем примере используется выражение XPath //Dealer. Он выбирает все элементы “Dealer” независимо от того, где они находятся в документе:

C# code

1var dealers = doc.Evaluate("//Dealer", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);

JavaScript code

1var dealers = document.evaluate("//Dealer", document, null, XPathResult.ANY_TYPE, null);

Таким образом, вы выбираете информацию обо всех дилерах из XML-файла без каких-либо ограничений. Выражение XPath //Dealer позволяет вам выбрать все вложенные узлы с именем “Dealer”.

Выберите узлы, используя оси XPath – descendant::

Запрос XPath с ограничениями по дате выпуска автомобиля

Усложним XPath-запрос и добавим ограничение на год выпуска автомобиля.

Вы можете использовать оси XPath в выражениях XPath. Оси XPath представляют отношение к текущему узлу и используются для поиска узлов относительно этого узла в дереве документа. Ось «потомок» (descendant) указывает на всех дочерних элементов узла контекста, всех их дочерних элементов и т.д. Другими словами, потомок выбирает всех потомков (детей, внуков и т. д.) текущего узла. Например, Descendant::Car выбирает всех потомков Car текущего узла.

Итак, давайте создадим выражение XPath, чтобы найти дилеров, у которых есть автомобиль descendant::Car с датой выпуска модели новее 2005 года descendant::Model > 2005. С точки зрения дерева DOM мы ищем всех дочерних элементов “Dealer” с именем “Car”, у которых есть дочерний элемент с именем “Model”, значение которого превышает “2005”. В следующем примере используется выражение XPath //Dealer[descendant::Car[descendant::Model > 2005]].

C# code

1var dealers = doc.Evaluate("//Dealer[descendant::Car[descendant::Model > 2005]]", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);

JavaScript code

1var dealers = document.evaluate("//Dealer[descendant::Car[descendant::Model > 2005]]", document, null, XPathResult.ANY_TYPE, null);

XPath-запрос с ограничениями на дату производства и цену автомобиля

На следующем шаге добавим больше ограничений: введем ограничение на цену автомобиля and descendant::Price < 25000. Выражение XPath выглядит следующим образом: //Dealer[descendant::Car[descendant::Model > 2005 and descendant::Price < 25000]].

Примечание: условия по цене и году выпуска объединены знаком and, что означает выполнение обоих этих условий одновременно:

C# code

1var dealers = doc.Evaluate("//Dealer[descendant::Car[descendant::Model > 2005 and descendant::Price < 25000]]", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);

JavaScript code

1var dealers = document.evaluate("//Dealer[descendant::Car[descendant::Model > 2005 and descendant::Price < 25000]]", document, null, XPathResult.ANY_TYPE, null);

В результате будут выбраны только дилеры, имеющие автомобиль с датой выпуска не старше 2005 года и ценой менее 25 000.

Пример C#, часть 1. Выбор узлов из XML-файла

Рассмотрим, как выбрать из XML-файла дилеров, у которых есть автомобиль с датой выпуска не старше 2005 года и ценой менее 25 000, и вывести в консоль необходимую информацию. Вы должны выполнить несколько шагов:

  1. Загрузите существующий XML-файл ( cars.xml).
  2. Используйте метод Evaluate() класса Document и передайте ему выражение XPath //Dealer[descendant::Car[descendant::Model > 2005 and descendant::Price < 25000]]и другие параметры.
  3. Переберите полученные узлы и выведите их содержимое на консоль.
  4. Вы получите список дилеров со всем содержимым узлов “Dealer”.
 1using Aspose.Html;
 2using Aspose.Html.Dom;
 3using Aspose.Html.Dom.XPath;
 4using System.IO;
 5...
 6
 7	// Create an instance of a document
 8	using (var doc = new HTMLDocument(Path.Combine(DataDir, "cars.xml")))
 9	{
10	    // Evaluate the XPath expression
11		var dealers = doc.Evaluate("//Dealer[descendant::Car[descendant::Model > 2005 and descendant::Price < 25000]]", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);    
12	    Node dealer;
13
14	        // Iterate over the resulted nodes and print their contents to the console
15	        while ((dealer = dealers.IterateNext()) != null)
16	        {
17	            Output.WriteLine(dealer.TextContent);
18	        }
19	}

Пример C#, часть 2. Выбор конкретной информации из выбранных узлов

В предыдущей части примера запрос XPath выбирает все содержимое узла “Dealer”, которое соответствует выражению XPath //Dealer[descendant::Car[descendant::Model > 2005 and descendant::Price < 25000]]. Но вы можете выбрать и распечатать только интересующую вас информацию из всего содержимого выбранного диллера.

В этом примере ( cars.xml) внутренний запрос был добавлен внутри цикла к выбранным узлам “Dealer”. Запрос собирает в виде строки информацию о дилере, такую ​​как “Name” и “Telephone”: concat('Dealer name: ', Name, 'Telephone: ', Telephone)". Обратите внимание на второй переданный параметр в Evaluate(expression, contextNode, resolver, type, result) метод. Это узел, относительно которого будет выполняться запрос – текущий узел “Dealer”. Этот запрос объединяет содержимое узлов с именами Name и Telephone.

Примечание. запрос использует ожидаемый тип результата строки XPathResultType.String, а значение результата получается через свойство StringValue, а не через итератор узла.

К списку выбранных дилеров можно добавить атрибут CarID, указывающий на конкретный автомобиль. Запрос должен быть сделан с выражением XPath .//Car[descendant::Model > 2005 and descendant::Price < 25000]/@CarID. В добавленном запросе есть несколько функций; давайте посмотрим на них:

 1using Aspose.Html;
 2using Aspose.Html.Dom;
 3using Aspose.Html.Dom.XPath;
 4using System.IO;
 5...	
 6
 7	// Create an instance of a document
 8	using (var doc = new HTMLDocument(Path.Combine(DataDir, "cars.xml")))
 9	{
10	    // Select dealers that match XPath expression
11	    var dealers = doc.Evaluate("//Dealer[descendant::Car[descendant::Model > 2005 and descendant::Price < 25000]]", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
12	    Node dealer;
13
14	    // Iterate over the selected dealers
15	    while ((dealer = dealers.IterateNext()) != null)
16	    {
17	        // Get and print Dealer name and Telephone
18	        var dealerInfo = doc.Evaluate("concat('Dealer name: ', Name, ' Telephone: ', Telephone)", dealer, doc.CreateNSResolver(doc), XPathResultType.String, null);
19	        Console.WriteLine(dealerInfo.StringValue);
20
21	        // Select and print CarID that match XPath expression
22	        var carIds = doc.Evaluate(".//Car[descendant::Model > 2005 and descendant::Price < 25000]/@CarID", dealer, doc.CreateNSResolver(doc), XPathResultType.Any, null);
23	        Node carId;
24
25	        while ((carId = carIds.IterateNext()) != null)
26	        {
27	            Console.WriteLine("Car id: " + carId.TextContent);
28	        }
29	    }
30	}

В результате получаем список дилеров с именами, телефонами и идентификационными кодами интересующих нас автомобилей.

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

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

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.