C#: Чтение XML-документа (XmlDocument)

На сегодняшний день XML является одним из наиболее распространенных (наряду с JSON) форматов для передачи данных. Сегодня я хотел бы рассказать о том, как можно читать XML-документы штатными средствами C#.

Для начала кратко о том, что из себя представляет XML-документ. В таком документе обязательно есть корневой элемент, у которого могут быть дочерние элементы. Каждый такой элемент может так же иметь свои дочерние элементы. В результате получается древовидная структура.

1
2
3
4
5
<root>
   <sub param="value">
       <sub2>textHere</sub2>
   </sub>
</root>
<root>
   <sub param="value">
       <sub2>textHere</sub2>
   </sub>
</root>

Между тегами (названия произвольны с некоторыми ограничениями) располагается значение. У элементов могут быть атрибуты. Атрибут имеет вид «Название Атрибута=Значение» Значение, следуя стандарту, должно помещаться в кавычки.

Переходим непосредственно к чтению.

Для работы с XML в .Net существует пространство имен System.Xml. Первое, что нужно сделать, — создать экземпляр класса XmlDocument:

1
 XmlDocument xmlDoc = new XmlDocument();
 XmlDocument xmlDoc = new XmlDocument();

У этого класса существует масса методов для работы с XML. Я рассмотрю лишь некоторые.  Независимо от вашей цели, вам потребуется загрузить файл. Сделать это можно так:

1
xmlDoc.Load("FileName.xml");
xmlDoc.Load("FileName.xml");

А далее работа. Рассмотрим такой код:

1
2
3
4
5
6
7
8
9
10
            foreach (XmlNode task in xmlDoc.DocumentElement.ChildNodes)
            {
                if (task.Attributes.GetNamedItem("id").Value == "5")
                {
                    foreach (XmlNode param in task.ChildNodes)
                    {
                        Console.WriteLine(param.InnerText);
                    }
                }
            }
            foreach (XmlNode task in xmlDoc.DocumentElement.ChildNodes)
            {
                if (task.Attributes.GetNamedItem("id").Value == "5")
                {
                    foreach (XmlNode param in task.ChildNodes)
                    {
                        Console.WriteLine(param.InnerText);
                    }
                }
            }

DocumentElement — это тот самый коренной элемент, единственный для всего документа. Мы перебираем его дочерние элементы в цикле foreach.

Далее первая интересная вещь — обращение к атрибуту:

1
task.Attributes.GetNamedItem("id").Value
task.Attributes.GetNamedItem("id").Value

Так можно получить значение атрибута id некоторого элемента. Чтобы получить значение самого элемента, нужно воспользоваться свойством InnerText (см код выше).

Этого базового уровня должно хватить вам для чтения простых XML документов.

5 Responses

  1. Александр 06.03.2012 / 13:06

    А можно весь листинг, пример небольшой программы, пожалуйста, ни как не разберусь?

  2. Елена 14.08.2012 / 13:00

    У меня не сработало if (task.Attributes.GetNamedItem(«id»).Value == «5»). говорит, «Ссылка на объект не указывает на экземпляр объекта». Подскажите, пожалуйста как быть. Мой xml — файл :

    Простой хлеб

    Мука
    Дрожжи
    Тёплая вода
    Соль

    Смешать все ингредиенты и тщательно замесить.
    Закрыть тканью и оставить на один час в тёплом помещении.
    <!— Почитать вчерашнюю газету. — это сомнительный шаг… —>
    Замесить ещё раз, положить на противень и поставить в духовку.

Добавить комментарий