Как найти xml элемент по его атрибуту в XML файле?

Как найти xml элемент по его атрибуту?

Из этой статьи Вы узнаете, как найти xml элемент по его атрибуту с помощью простого LINQ запроса. И так для начала создадим Windows Forms приложение и поместим на форму: два элемента управления textBox (txtAtrName и txtAtrValue), кнопку и один listBox. Затем добавим в наш проект xml файл, который содержит следующую структуру:

<root>
<user id="1" age="20" name="Vasya"/>
<user id="2" age="25" name="Ola"/>
<user id="3" age="30" name="Petya"/>
<user id="4" age="25" name="Vasya"/>
</root>

Windows forms приложение

Задача: найти все xml элементы, которые содержат атрибут &#171;age&#187; со значением 25. Надеюсь, Вы уже знаете, что такое XML и как с ним работать, поэтому сразу же переходим к решению задачи.

исходный код

using System.Xml.Linq; //добавить
try
{
XDocument xDoc = XDocument.Load("My.xml");
var elements = from elmts in xDoc.Descendants()
where elmts.Attribute(txtAtrName.Text).Value == txtAtrValue.Text
select elmts;
foreach (var element in elements)
{
listBox1.Items.Add(element);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

Результат

найденные xml элементы

Всё работает, но если Вы сейчас попытаетесь найти XML элемент, у которого атрибут &#171;age&#187; не существует, то в результате Вы получите исключение. Например, не много изменим XML файл и удалим у четвертого элемента атрибут &#171;age&#187;.

<root>
...
<user id="4" name="Vasya"/>
</root>

Выполним выше указанный код, в результате получаем исключение NullReferenceException.

исключение

Чтобы этого избежать нужно, добавить в Linq запрос проверку на null. То есть сначала мы должны убедиться, что XML атрибут существует, а только потом получить его значение.

var elements = from elmts in xDoc.Descendants()
where elmts.Attribute(txtAtrName.Text) != null &&
elmts.Attribute(txtAtrName.Text).Value == txtAtrValue.Text
select elmts;

Теперь всё в порядке.

Читайте также:

2 комментария

  1. Игорь says:

    Привет. А как найденное вывести в dataGridView1 (я ее уже создал)?
    Два варианта:
    1) вручную создать столбцы
    2) автоматически создать столбцы

  2. Привет. Любой из этих вариантов.

    //добавляем колонку в dgv
    dataGridView1.Columns.Add("xml_elm", "элемент");
    //здесь находим элемент и выводим
    foreach (var xml_element in xml_elements)
    {
    //добавляем полученный элемент в колонку
    dataGridView1.Rows[0].Cells[0].Value = xml_element;
    }

Leave a Reply

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*