Полное руководство по языку программирования С# 14 и платформе .NET 10 / Работа с XML

XPath

Начальный ⏱ 2 мин чтения 👁 2 🕓 обновлено 11.08.2026

XPath представляет язык запросов в XML. Он позволяет выбирать элементы, соответствующие определенному селектору.

Рассмотрим некоторые наиболее распространенные селекторы:

.

выбор текущего узла

..

выбор родительского узла

*

выбор всех дочерних узлов текущего узла

person

выбор всех узлов с определенным именем, в данном случае с именем "person"

@name

выбор атрибута текущего узла, после знака @ указывается название атрибута (в данном случае "name")

@*

выбор всех атрибутов текущего узла

element[3]

выбор определенного дочернего узла по индексу, в данном случае третьего узла

//person

выбор в документе всех узлов с именем "person"

person[@name='Tom']

выбор элементов с определенным значением атрибута. В данном случае выбираются все элементы "person" с атрибутом name='Tom'

person[company='Microsoft']

выбор элементов с определенным значением вложенного элемента. В данном случае выбираются все элементы "person", у которых дочерний элемент "company" имеет значение 'Microsoft'

//person/company

выбор в документе всех узлов с именем "company", которые находятся в элементах "person"

Действие запросов XPath основано на применении двух методов класса XmlElement:

  • SelectSingleNode(): выбор единственного узла из выборки. Если выборка по запросу содержит несколько узлов, то выбирается первый

  • SelectNodes(): выборка по запросу коллекции узлов в виде объекта XmlNodeList

Для запросов возьмем xml-документ из прошлых тем:


<?xml version="1.0" encoding="utf-8" ?>
<people>
  <person name="Tom">
    <company>Microsoft</company>
    <age>37</age>
  </person>
  <person name="Bob">
    <company>Google</company>
    <age>41</age>
  </person>
</people>

Теперь выберем все узлы корневого элемента, то есть все элементы person:


using System.Xml;

XmlDocument xDoc = new XmlDocument();
xDoc.Load("people.xml");
XmlElement? xRoot = xDoc.DocumentElement;

// выбор всех дочерних узлов
XmlNodeList? nodes = xRoot?.SelectNodes("*");
if (nodes is not null)
{
    foreach (XmlNode node in nodes)
        Console.WriteLine(node.OuterXml);
}

Консольный вывод:

<person name="Tom"><company>Microsoft</company><age>37</age></person>
<person name="Bob"><company>Google</company><age>41</age></person>

Выберем все узлы <person>:


XmlNodeList? personNodes = xRoot?.SelectNodes("person");

Выведем на консоль значения атрибутов name у элементов person:


using System.Xml;

XmlDocument xDoc = new XmlDocument();
xDoc.Load("people.xml");
XmlElement? xRoot = xDoc.DocumentElement;
XmlNodeList? personNodes = xRoot?.SelectNodes("person");
if(personNodes is not null)
{
    foreach (XmlNode node in personNodes)
        Console.WriteLine(node.SelectSingleNode("@name")?.Value);
}

Результатом выполнения будет следующий вывод:


Tom
Bob

Выберем узел, у которого атрибут name имеет значение "Tom":


XmlNode? tomNode = xRoot?.SelectSingleNode("person[@name='Tom']");
Console.WriteLine(tomNode?.OuterXml);

Допустим, нам надо получить только компании. Для этого надо осуществить выборку вниз по иерархии элементов:


using System.Xml;

XmlDocument xDoc = new XmlDocument();
xDoc.Load("people.xml");
XmlElement? xRoot = xDoc.DocumentElement;

XmlNodeList? companyNodes = xRoot?.SelectNodes("//person/company");
if(companyNodes is not null)
{
    foreach (XmlNode node in companyNodes)
        Console.WriteLine(node.InnerText);
}

Проверь себя

📋 Тест по теме «XPath» Тест по теме

Практические задания

Лёгкое Ручная проверка Заполните пропуск в коде (1)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

<?_____ version="1.0" encoding="utf-8" ?>
<people>
  <person name="Tom">
    <company>Microsoft</company>
    <age>37</age>
  </person>
  <person name="Bob">
    <company>Google</company>
    <age>41</age>
  </person>
</people>
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (2)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

using System._____;

XmlDocument xDoc = new XmlDocument();
xDoc.Load("people.xml");
XmlElement? xRoot = xDoc.DocumentElement;

// выбор всех дочерних узлов
XmlNodeList? nodes = xRoot?.SelectNodes("*");
if (nodes is not null)
{
    foreach (XmlNode node in nodes)
        Console.WriteLine(node.OuterXml);
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (3)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

XmlNodeList? personNodes = _____?.SelectNodes("person");
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (4)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

using System.Xml;

XmlDocument _____ = new XmlDocument();
xDoc.Load("people.xml");
XmlElement? xRoot = xDoc.DocumentElement;
XmlNodeList? personNodes = xRoot?.SelectNodes("person");
if(personNodes is not null)
{
    foreach (XmlNode node in personNodes)
        Console.WriteLine(node.SelectSingleNode("@name")?.Value);
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (5)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

_____
Bob
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (1)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

<?xml version="1.0" encoding="utf-8" ?>
<people>
  <_____ name="_____">
    <company>Microsoft</company>
    <age>37</age>
  </person>
  <person name="Bob">
    <company>Google</company>
    <age>41</age>
  </person>
</people>
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (2)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

using System.Xml;

XmlDocument xDoc = new XmlDocument();
xDoc.Load("people.xml");
XmlElement? xRoot = xDoc.DocumentElement;

// выбор всех дочерних узлов
XmlNodeList? _____ = xRoot?.SelectNodes("*");
if (_____s is not null)
{
    foreach (XmlNode node in nodes)
        Console.WriteLine(node.OuterXml);
}
Войдите, чтобы отправить решение
Сложное Ручная проверка Объясните и модифицируйте пример из урока «XPath»
+30 XP

Опишите своими словами, что делает приведённый пример кода из урока «XPath», и предложите одно осмысленное изменение (например, другое входное значение или дополнительное условие). Приведите итоговый код.

<?xml version="1.0" encoding="utf-8" ?>
<people>
  <person name="Tom">
    <company>Microsoft</company>
    <age>37</age>
  </person>
  <person name="Bob">
    <company>Google</company>
    <age>41</age>
  </person>
</people>
Войдите, чтобы отправить решение
Сложное Ручная проверка Найдите потенциальную проблему в коде урока «XPath»
+30 XP

Изучите приведённый фрагмент кода и опишите, при каких входных данных или условиях он может сработать не так, как ожидается (граничный случай, отсутствие проверки и т.п.). Предложите исправленный вариант.

using System.Xml;

XmlDocument xDoc = new XmlDocument();
xDoc.Load("people.xml");
XmlElement? xRoot = xDoc.DocumentElement;

// выбор всех дочерних узлов
XmlNodeList? nodes = xRoot?.SelectNodes("*");
if (nodes is not null)
{
    foreach (XmlNode node in nodes)
        Console.WriteLine(node.OuterXml);
}
Войдите, чтобы отправить решение
Мини-проект Ручная проверка Мини-проект по теме «XPath»
+50 XP

Соберите небольшую программу, которая последовательно демонстрирует ключевые идеи урока. Программа должна быть рабочей и содержать минимум два самостоятельно написанных фрагмента, а не просто копию примера из урока.

Войдите, чтобы отправить решение
Домашнее задание Ручная проверка Домашнее задание по теме «XPath»
+25 XP

Напишите собственную небольшую программу, применяющую материал темы «XPath». Используйте не менее одной конструкции, показанной в примерах урока. Прикрепите код решения и краткое описание того, что он делает.

Войдите, чтобы отправить решение

Обсуждение (0)

Войдите, чтобы оставить комментарий.