В данном уроке будет рассмотрена работа с XML на языке C#, в частности, создание простого XML-файла и его чтение в Windows Forms и в консольном приложении Visual Studio.
Что такое XML?
XML — это так называемый язык разметки, который используется для представления иерархических данных и структиуривания передаваемой информации в удобной для программ, приложений и различных систем форме. XML универсален и не зависит от платформы, на которой используется. Как и у любого языка, у него есть свой собственный (но довольно несложный) синтаксис, представленный в основном в виде различных тегов. Внешне он несколько похож на язык гипертекстовой разметки HTML, но если HTML используется для разметки страниц и отображения данных на них, то XML используется для структурирования данных, их сортировки, фильтрации и т.п. Можно даже приписать XML к аналогу баз данных, который не требует СУБД. В особенности XML-файлы хороши в представлении древовидных (иерархических) БД с произвольной длинной ветвей. В большинстве современных реляционных БД реализация подобной структуры далеко не всегда бывает эффективной и удобной, в особенности, когда длина ветвей доходит до десятков элементов.
Ко всему прочему, XML-документ довольно легко создать, для этого не нужно иметь никаких особенных программ и специфического ПО. В самом простом случае можно обойтись даже стандартной программой «Блокнот». А при наличии Visual Studio, предпочтительнее воспользоваться им, так как работа с XML-файлами в нём очень удобна и проста. Кроме того, есть возможность заполнить XML-файл программно, используя, например, консольное приложение Visual Studio.
Как создать XML-файл в Visual Studio вручную
Для начала попробуем создать простенький XML-файл вручную в Visual Studio и в блокноте.
Чтобы создать пустой XML-документ в Visual Studio, следует в окне программы нажать вкладку «Файл», а затем выбрать строки «Создать» и «Файл», как показано на скриншоте:
Затем в появившемся окне следует выбрать «XML-файл» и нажать кнопку «Открыть».
Вот и всё, XML-документ создан. Изначально в нём записана лишь одна строка:
1 |
<?xml version="1.0" encoding="utf-8"?> |
Как легко понять, она означает, что созданный файл поддерживает язык XML версии 1.0 и работает с кодировкой UTF-8.
Теперь давайте запишем в него какие-нибудь данные. Например, такие:
1 2 3 4 5 6 7 |
<?xml version="1.0" encoding="utf-8"?> <root> <Employee name="Ivan Ivanov"> <Age>30</Age> <Programmer>True</Programmer> </Employee> </root> |
Теги в XML можно именовать так, как удобно пользователю, что сильно упрощает визуализацию XML-файлов для людей. В данном примере у нас имеются иерархические данные в три ступени. Сначала идёт структура каталога, обозначенная тегами <root></root>. В неё вложен каталог с названием Employee и атрибутом name, которому присвоено значение «Ivan Ivanov». А в этот каталог вложены данные Age и Programmer. Иными словами, у нас теперь в корне структуры данных имеется некоторый сотрудник Иван Иванов, которому 30 лет и который является программистом. Таких сотрудников может быть очень много, как может быть много и атрибутов этих сотрудников, а также атрибутов у атрибутов этих сотрудников и даже атрибутов у атрибутов у атрибутов этих сотрудников.
Примерно так и выглядят XML-файлы. Данный способ создания XML-файла довольно прост и удобен в применении. Если же под рукой не оказалось Visual Studio или другой специализированной программы, то можно обойтись и простым блокнотом.
Как создать XML-файл в блокноте
Создавать какие-либо большие и объемные XML-файлы в блокноте будет довольно затруднительно, есть возможность запутаться и ошибиться во всём обилии тегов и данных, однако создать простенькую базу вполне возможно. Для этого надо лишь открыть Блокнот и просто начать писать. Например, ту же структуру, что и выше:
В принципе, можно обойтись и без строки о версии XML-языка и без присваивания кодировки, которая создавалась автоматически в примере с Visual Studio выше, но лучше будет записать и её. Чтобы сохранить данный файл правильно, надо при сохранении выбрать «Тип файла» — Все файлы, а к имени файла прибавить расширение .xml. Кроме того, стоит выбрать кодировку «UTF-8».
Таким образом и создаются XML-файлы вручную.
Как читать XML-файл C#
Давайте попробуем создать программу, которая считывала бы данные из какого-нибудь XML-файла. Мы будем использовать Windows Forms и язык C#.
В конце у нас должно получиться что-то вроде этого:
Но пока что мы создаем проект Windows Forms. Для начала нам нужен сам XML-файл, из-за которого мы и будем делать программу. Давайте создадим его. Для этого щёлкаем правой кнопкой мыши на проект в обозревателе решений и выбираем строки «Добавить» и «Создать элемент».
Там мы выбираем XML-файл и называем его.
Файл создан, теперь надо его заполнить, например так, как показано ниже:
После этого следует в обозревателе решений щёлкнуть на наш файл и в его свойствах изменить значение в вкладке «Копировать в выходной каталог» на «Всегда копировать», как показано ниже. Это нужно для того, чтобы данные из файла выводились пользователю через программу, т.к. позже будет создан каталог для этих целей.
Итак, наш XML-файл готов. Преступаем к программе.
Для внешней начинки Form1 нам понадобится элемент propertyGrid и ListBox:
В propertyGrid мы отключили HelpVisible:
Теперь нам надо создать класс, который будет получать данные из нашего файла. Для создания класса надо правой кнопкой мыши щёлкнуть на проект и выбрать «Добавить» «Класс».
Называем наш класс как-нибудь, например, Employee и нажимаем кнопку «Добавить».
Затем пишем следующее:
1 2 3 4 5 |
class Employee { public string Name { get; private set; } public int Age { get; private set; } public bool Programmer { get; private set; } |
Таким образом мы инициализируем свойства, которые будем получать из файла. Для нас это строковая переменная Name, целочисленная Age и логический тип Programmer.В свойствах мы указываем два метода — get (метод для получения данных) и set (метод для чтения данных). Запись { get; private set; } указывает, что данное свойство используется только для чтения данных, но не для их записи.
Далее создаем конструктор экземпляра:
1 2 3 4 5 6 7 8 9 10 11 12 |
public Employee(string name, int age, bool programmer) { Name = name; Age = age; Programmer = programmer; } public override string ToString() { return Name; } } |
Здесь мы присваиваем считанные выше значения новым переменным и возвращаем переменную Name — её значения будут выводиться в ListBox’e.
В классе Employee мы настроили всё, что нам необходимо. Теперь свяжем все части воедино через Form1. Переходим к коду формы. Для начала нам надо создать метод LoadEmployees, который будет загружать данные из XML-документа и через класс Employee выводить полученные данные в ListBox. Как мы помним, из класса Employee возвращается переменная Name, поэтому в ListBox’e у нас и будут выводиться только имена сотрудников, а остальные атрибуты мы выведем в propertyGrid’e.
Сначала нам надо подключить директиву
1 |
using System.Xml; |
Именно она помогает работать с XML.
Далее создадим сам метод:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
private void LoadEmployees() { XmlDocument doc = new XmlDocument(); doc.Load("xmltext.xml"); foreach(XmlNode node in doc.DocumentElement) { string name = node.Attributes[0].Value; int age = int.Parse(node["Age"].InnerText); bool programmer = bool.Parse(node["Programmer"].InnerText); listBox1.Items.Add(new Employee(name, age, programmer)); } } |
Класс XmlDocument указывает на то, что переменная doc будет являться файлом с XML-кодом.
doc.Load, как можно догадаться, указывает на то, что в doc будет загружен XML-файл с именем «xmltext.xml» — это и есть наш файл, который мы создали в самом начале.
Оператор foreach нужен для циклического обращения к элементам коллекции данных, которая в нашем случае представлена базой сотрудников. Запись в скобках этого оператора, грубо говоря, указывает на то, что каждый конкретный узел в нашем файле представлен XML кодом, и именно так его и надо представлять программе.
Далее считываются имя, возраст и причастность к должности программиста. Все данные заносятся по позициям в ListBox.
Для того, чтобы данный метод запускался одновременно с запуском программы, надо добавить запись LoadEmployees() в область кода, показанного ниже:
1 2 3 4 5 |
public Form1() { InitializeComponent(); LoadEmployees(); } |
Теперь нам надо сделать так, чтобы при выборе имени в ListBox’e, все данные, включая имя, возраст и определение, является ли человек программистом, выводились в propertyGrid’e. Для этого дважды щёлкаем левой кнопкой мыши на ListBox’e в форме и в появившемся блоке кода пишем:
1 2 3 4 5 6 7 |
private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { if (listBox1.SelectedIndex != -1) { propertyGrid1.SelectedObject = listBox1.SelectedItem; } } |
Запись if (listBox1.SelectedIndex != -1) означает, что если в ListBox’e выбран какой-либо элемент, а в нашем случае, имя сотрудника (элементы в нём нумеруются с нуля: 0,1,2,3 и т.д., -1 означает, что не выбран ни один элемент), то в propertyGrid’e должны вывестись элементы, которые закреплены в ListBox’e за конкретным именем.
Наша программа готова. Исходник программы «Чтение XML файла» на C# можно скачать по ссылке ниже:
Скачать исходник
Поделиться в соц. сетях:
А как создать такой же файл XML при помощи WinForms и при этом учитывать что есть в файле записи и нужно добавлять?
В ближайшем времени сделаем такую программу и разберем её в отдельной статье.
Было бы не так плохо если бы можно было бы сделать к данной программе с данным XML
Вот пока что сама программа: https://yadi.sk/d/jqW3TPWVm8rcs
Статья по ней будет написана чуть позже.
Ссылка уже не работает. Можете показать исходники кода, где происходит запись или дать работающую ссылку? Спасибо
————————————————————————————————
Ответ автора: у нас на сайте уже имеется отдельная статья по данной программе: http://vscode.ru/prog-lessons/sozdanie-redaktirovanie-i-udalenie-dannyih-xml-fayla-c-sharp.html
Приятного изучения :)
Большое спасибо. Оч интересно и удобно таким образом смотреть информацию)