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

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

https://cdn.victorz.ru/file/2018/20180916738-xml.zip

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

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

using System;
using System.IO;
using System.Xml;
using System.Windows.Forms;

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

/// <summary> Путь к рабочему каталогу, относительно исполняемого файла </summary>
public static string dirWork = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

public static string fileXML = dirWork + @"\XMLFileForParse.xml";

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

<?xml version="1.0" encoding="utf-8" ?>
<body>
  <ns2:TransportResponse xmlns:ns2="http://webservices.victorz.ru/">
    <TransportName>Газель</TransportName>
    <TransportNumber>р999вд</TransportNumber>
    <TransportRegion>77</TransportRegion>
  </ns2:TransportResponse>
  <country>
    <name>Россия</name>
    <param coin="рубль" language="русский" stolitsa="Москва" />
  </country>
  <country>
    <name>USA</name>
    <param coin="usd" language="english" stolitsa="New York" />
  </country>
</body>

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

/// <summary>


private void button2_Click(object sender, EventArgs e)
{
	textBoxResult.Clear(); 
	XmlDocument docXML = new XmlDocument(); 
	docXML.Load(fileXML); 
	string _name = docXML.GetElementsByTagName("TransportName")[0].InnerText; 

	
	XmlNamespaceManager _namespaceManager = new XmlNamespaceManager(docXML.NameTable); 
	_namespaceManager.AddNamespace("ns2", "http://webservices.victorz.ru/"); 

	string _region = docXML.DocumentElement.SelectNodes("//ns2:TransportResponse/TransportRegion", _namespaceManager)[0].InnerText; 

	
	string _number = docXML["body"]["ns2:TransportResponse"]["TransportNumber"].InnerText; ; 

	textBoxResult.Text = _name + " - " + _number + " - " + _region; 
}

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

/// <summary>


private void button3_Click(object sender, EventArgs e)
{
	textBoxResult.Clear(); 
	
	XmlDocument docXML = new XmlDocument(); 
	docXML.Load(fileXML); 


	textBoxResult.Text = docXML.GetElementsByTagName("name")[1].InnerText; 

	textBoxResult.Text = docXML.DocumentElement.SelectNodes("//country/name")[1].InnerText; 
}

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

/// <summary>


private void button4_Click(object sender, EventArgs e)
{
	textBoxResult.Clear(); 
	
	XmlDocument docXML = new XmlDocument(); 
	docXML.Load(fileXML); 
	string _coin = docXML.DocumentElement.SelectNodes("//country/param")[0].Attributes["coin"].Value; 
	string _language = docXML.DocumentElement.SelectNodes("//country/param")[0].Attributes["language"].Value; 
	string _stolitsa = docXML.DocumentElement.SelectNodes("//country/param")[0].Attributes["stolitsa"].Value; 

	textBoxResult.Text = _coin + " - " + _language + " - " + _stolitsa; 
}

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