Как просто распарсить XML в C#

Как просто распарсить XML в C#
Перед многими часто встаёт задача распарсить XML с помощью C#. В данной статье опишу простейшие методы разбора XML без излишней сложности и без подключения библиотек сторонних разработчиков. Описанных примеров хватит для большинства существующих задач.

Создадим в Visual Studio проект Windows Form и набросаем кнопки и текстовые поля и получим примерно такую форму:

Как просто распарсить XML в C#

По кнопке «Машина» мы будем получать из XML марку, номер и регион, в котором зарегистрирован автомобиль. По кнопке «Страна 2» мы будем получать из XML название второй страны и выводить данные в поле результата. По кнопке «Параметры Страна 1» мы будем получать из XML параметры первой страны (валюта, язык, столица) и выводить данные в поле результата.

Подключим к проекту:

Объявим пару переменных:

«XMLFileForParse.xml» — это XML-файл который мы будем разбирать, и который имеет следующую структуру:

Давайте получим из XML марку автомобиля, номер и регион. Все три значения мы будем получать разными способами, чтобы охватить шире тему. В коде все строки стараюсь комментировать подробно:

У нас в XML есть одинаковые теги «country», «name», «param».
Давайте получим название второй страны, тег «name»:

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

Основы рассмотрели. Надеюсь в работе вам это поможет. Для наглядности приложил пример проекта с расширенными комментариями.

8 комментариев

  1. Отоичная инфа бро! Пили есчо

  2. Отличная статья!

  3. Спасибо за статью! Мне нужно распарсить служебный файл, там сложная структура, во многом Ваша статья мне помогла. Но вот в одном месте не могу сообразить, как правильно написать. В общем, структура xml допустим такая (упростила)

    <documents>
    <docdetails>
    <kind>01</kind>
    <number>08-03</number>
    <date>2019-05-03</date>
    </docdetails>
    <docdetails>
    <kind>02</kind>
    <number>843</number>
    <date>2019-05-15</date>
    </docdetails>
    <docdetails>
    <kind>03</kind>
    <number>LV007</number>
    <date>2019-05-15</date>
    </docdetails>
    </documents>

    Т.е. элемент с тегом docdetails встречается в файле несколько раз, но у него разное содержимое. Подскажите, как можно добавить условие, что:
    if (элемент с тегом docdetails имеет потомка kind с тегом 01) {
    string text = значение тега number вложенного в этот docdetails (т.е. в данном случае это значение «08-03»
    }
    Спасибо заранее!

    • На скорую такой ответ:
      1. Соберите все «kind» и запишите в массив или в список.
      2. Определите в цикле какой из них содержит 01. Потом определите его порядковый номер в массиве.
      3.1. Если количество тегов «kind» равно количеству тегов «docdetails», то мы сразу узнаем порядковый номер «docdetails» и считаем вложенный в него «number».
      3.2. Или соберите все «number» в массив и порядковый номер «number» будет равен порядковому номеру «kind», его мы и считаем.

      Если подумать подольше, то можно и ещё варианты подобрать.

      • ну и задали вы мне задачку, учитывая то, что я чуть ли ни вчера занялась программированием ))) По первому варианту есть вопрос. Допустим я создаю List
        и мне нужно добавить значение всех тегов kind в него, но их может быть неограниченное (заранее неизвестное) количество. Вот как мне определить длину массива? Т.е. в данном файле их 3, и, если бы это было бы постоянная величина, то я бы написала так:

        List array = new List();
                for (int i = 0; i < 3; i++) 
                {
                    string _king = docXML.GetElementsByTagName("kind")[i].InnerText;
                    array.Add(_king);
                }
        • У List не надо задавать размер и это поможет, а по поводу реализации надо думать.
          Первое что приходит в голову это получить количество «kind» так:

          int count = xml.Elements("docdetails").Elements("kind").Count();
          • не знаю, не получилось. По первому варианту вроде все срослось с одним файлом, но загрузила другой, а там «kind» вложен также в другой элемент (не только в «docdetails»)

            • Тогда вам надо определиться какие «kind» вам нужны. Если все, то Count получайте по всем. Если определённые, то Count получайте по примеру выше.

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

Ваш адрес email не будет опубликован.