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

Выборка элементов в LINQ to XML

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

Большим преимуществом LINQ to XML является то, что эта технология позволяет легко извлекать нужные элементы из документа xml. Например, возьмем xml-файл people.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>

Переберем его элементы и выведем их значения на консоль:


using System.Xml.Linq;

XDocument xdoc = XDocument.Load("people.xml");
// получаем корневой узел
XElement? people = xdoc.Element("people");
if (people is not null)
{
    // проходим по всем элементам person
    foreach (XElement person in people.Elements("person"))
    {

        XAttribute? name = person.Attribute("name");
        XElement? company = person.Element("company");
        XElement? age = person.Element("age");

        Console.WriteLine($"Person: {name?.Value}");
        Console.WriteLine($"Company: {company?.Value}");
        Console.WriteLine($"Age: {age?.Value}");

        Console.WriteLine(); //  для разделения при выводе на консоль
    }
}

И мы получим следующий вывод:

Person: Tom
Company: Microsoft
Age: 37

Person: Bob
Company: Google
Age: 41

Чтобы начать работу с имеющимся xml-файлом, надо сначала загрузить его с помощью статического метода XDocument.Load(), в который передается путь к файлу.

XDocument xdoc = XDocument.Load("people.xml");

Поскольку xml хранит иерархически выстроенные элементы, то и для доступа к элементам надо идти начиная с высшего уровня в этой иерархии и далее вниз. Так, для получения элементов person и доступа к ним надо сначала обратиться к корневому элементу, а через него уже к элементам person:


// получаем корневой узел
XElement? people = xdoc.Element("people");
if (people is not null)
{
    // проходим по всем элементам person
    foreach (XElement person in people.Elements("person"))
    {

Метод Element("имя_элемента") возвращает первый найденный элемент с таким именем. Метод Elements("имя_элемента") возвращает коллекцию одноименных элементов. В данном случае мы получаем коллекцию элементов person и поэтому можем перебрать ее в цикле.

Спускаясь дальше по иерархии вниз, мы можем получить атрибуты или вложенные элементы, например, получение элемента <company>

XElement? company = person.Element("company");

Значение простых элементов, которые содержат один текст, можно получить с помощью свойства Value:

string? companyValue = person.Element("company")?.Value;

Сочетая операторы Linq и LINQ to XML можно довольно просто извлечь из документа данные и затем обработать их. Например:


using System.Xml.Linq;

XDocument xdoc = XDocument.Load("people.xml");

var microsoft = xdoc.Element("people")?   // получаем корневой узел people
    .Elements("person")             // получаем все элементы person
    // получаем все person, у которого company = Microsoft
    .Where(p => p.Element("company")?.Value == "Microsoft")    
    .Select(p => new        // для каждого объекта создаем анонимный объект
    {
      name = p.Attribute("name")?.Value,
      age = p.Element("age")?.Value,
      company = p.Element("company")?.Value
  });

if (microsoft is not null)
{
    foreach (var person in microsoft)
    {
        Console.WriteLine($"Name: {person.name}  Age: {person.age}");
    }
}

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

Другой пример - выберем элемент person, в котором атрибут name равен "Tom":


using System.Xml.Linq;

XDocument xdoc = XDocument.Load("people.xml");

var tom = xdoc.Element("people")?   // получаем корневой узел people
    .Elements("person")             // получаем все элементы person
    .FirstOrDefault(p => p.Attribute("name")?.Value == "Tom");

var name = tom?.Attribute("name")?.Value;
var age = tom?.Element("age")?.Value;
var company = tom?.Element("company")?.Value;

Console.WriteLine($"Name: {name}  Age: {age}  Company: {company}");

Проверь себя

📋 Тест по теме «Выборка элементов в LINQ to XML» Тест по теме

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

Лёгкое Ручная проверка Заполните пропуск в коде (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._____.Linq;

XDocument xdoc = XDocument.Load("people.xml");
// получаем корневой узел
XElement? people = xdoc.Element("people");
if (people is not null)
{
    // проходим по всем элементам person
    foreach (XElement person in people.Elements("person"))
    {

        XAttribute? name = person.Attribute("name");
        XElement? company = person.Element("company");
        XElement? age = person.Element("age");

        Console.WriteLine($"Person: {name?.Value}");
        Console.WriteLine($"Company: {company?.Value}");
        Console.WriteLine($"Age: {age?.Value}");

        Console.WriteLine(); //  для разделения при выводе на консоль
    }
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (3)
+10 XP

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

_____ xdoc = XDocument.Load("people.xml");
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (4)
+10 XP

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

// получаем корневой узел
X_____? people = xdoc.Element("people");
if (people is not null)
{
    // проходим по всем элементам person
    foreach (XElement person in people.Elements("person"))
    {
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (5)
+10 XP

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

XElement? _____ = person.Element("company");
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (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.Linq;

XDocument xdoc = XDocument.Load("people.xml");
// получаем корневой узел
XElement? people = xdoc.Element("people");
if (people is _____ null)
{
    // проходим по всем элементам _____
    foreach (XElement person in people.Elements("person"))
    {

        XAttribute? name = person.Attribute("name");
        XElement? company = person.Element("company");
        XElement? age = person.Element("age");

        Console.WriteLine($"Person: {name?.Value}");
        Console.WriteLine($"Company: {company?.Value}");
        Console.WriteLine($"Age: {age?.Value}");

        Console.WriteLine(); //  для разделения при выводе на консоль
    }
}
Войдите, чтобы отправить решение
Среднее Ручная проверка Расставьте строки кода в правильном порядке
+20 XP

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

XElement? people = xdoc.Element("people");
{
    foreach (XElement person in people.Elements("person"))
if (people is not null)
// получаем корневой узел
    // проходим по всем элементам person
    {
Войдите, чтобы отправить решение
Сложное Ручная проверка Объясните и модифицируйте пример из урока «Выборка элементов в LINQ to XML»
+30 XP

Опишите своими словами, что делает приведённый пример кода из урока «Выборка элементов в LINQ to 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>
Войдите, чтобы отправить решение
Сложное Ручная проверка Найдите потенциальную проблему в коде урока «Выборка элементов в LINQ to XML»
+30 XP

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

using System.Xml.Linq;

XDocument xdoc = XDocument.Load("people.xml");
// получаем корневой узел
XElement? people = xdoc.Element("people");
if (people is not null)
{
    // проходим по всем элементам person
    foreach (XElement person in people.Elements("person"))
    {

        XAttribute? name = person.Attribute("name");
        XElement? company = person.Element("company");
        XElement? age = person.Element("age");

        Console.WriteLine($"Person: {name?.Value}");
        Console.WriteLine($"Company: {company?.Value}");
        Console.WriteLine($"Age: {age?.Value}");

        Console.WriteLine(); //  для разделения при выводе на консоль
    }
}
Войдите, чтобы отправить решение
Мини-проект Ручная проверка Мини-проект по теме «Выборка элементов в LINQ to XML»
+50 XP

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

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

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

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

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

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