Как найти 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>

Задача: найти все xml элементы, которые содержат атрибут «age» со значением 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 элемент, у которого атрибут «age» не существует, то в результате Вы получите исключение. Например, не много изменим XML файл и удалим у четвертого элемента атрибут «age».
<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;
Теперь всё в порядке.
Читайте также:
Привет. А как найденное вывести в dataGridView1 (я ее уже создал)?
Два варианта:
1) вручную создать столбцы
2) автоматически создать столбцы
Привет. Любой из этих вариантов.
//добавляем колонку в dgv dataGridView1.Columns.Add("xml_elm", "элемент"); //здесь находим элемент и выводим foreach (var xml_element in xml_elements) { //добавляем полученный элемент в колонку dataGridView1.Rows[0].Cells[0].Value = xml_element; }