|
|||||||
XML в примерах
Время создания: 18.09.2019 21:56
Автор: https://shwanoff.ru
Текстовые метки: xml, c#
Раздел: Компьютер - C# - XML
Запись: Kozlov-AE/Tetra/master/base/1564331563fy0oiy2w9g/text.html на raw.githubusercontent.com
|
|||||||
|
|||||||
Что такое XML? XML (eXtensible Markup Language) — это универсальный расширяемый язык для разметки информации. Он позволяет структурировать, хранить и передавать информацию в определенном формате. Особенность данного языка заключается в том, что самоопределяемым, что позволяет самостоятельно расширять набор условных меток — тегов. Используя их, можно формировать данные в виде древовидной структуры, когда одни элементы содержат в себе другие. Пример XML разметки В качестве примера можно рассмотреть телефонную книгу, в которой хранятся такие данные как имя человека, номер телефона и заметка. <?xml version="1.0" encoding="UTF-8"?> <!--XML заголовок--> <catalog> <!--Корневой элемент--> <phone> <!--Элемент данных--> <name>Саша</name> <!--Первое значение данных--> <number>890953317</number> <!--Второе значение--> <remark>Не бери трубку!</remark> <!--Третье значение--> </phone> <!--Закрытие элемента данных--> <phone> <name>Дима</name> <number>890512309</number> <remark>Босс</remark> </phone> <phone group="important"> <!--Используем атрибут для дополнительного свойства--> <name>Рита</name> <number>890198735</number> <remark>Невероятная девчонка</remark> </phone> </catalog> <!--Завершение всех данных--> Первым строкой в XML файле должен идти заголовок, который указывает какую версию XML использовать, а также кодировку текста. Затем должен обязательно идти единственных корневой элемент, в который включены все остальные данные. В дальнейшем все данные разбиваются на объекты, включающие другие объекты и так далее, в зависимости от структуры данных. Также у объекта могут быть указаны дополнительные свойства, они называются атрибуты. Работа с XML на языке C# Для взаимодействия с XML файлом в языке программирования C# имеется несколько отличных библиотек, но для начала мы рассмотрим одну из самых простых реализаций, расположенную в пространстве имен System.XML. Данная библиотека позволяет как читать, так и сохранять данные в XML файлы. Реализуем две основные операции, это чтение Xml данных из файла, и сохранение данных в Xml файл. Рассмотрим основной метод приложения. Program.cs static void Main(string[] args) { // Устанавливаем кодировку консоли. // Нужно только если при использовании англоязычной Windows // на консоль вместо кириллицы выводятся знаки вопроса (??? ????? ??????) Console.OutputEncoding = Encoding.Unicode;
// Читаем Xml файл. ReadXmlFile("example.xml");
// Ждем ввода пользователя. Console.ReadLine();
// Создаем структуру данных. var catalog = new Catalog() // Корневой элемент { Phones = new List<Phone>() // Коллекция номеров телефонов. { new Phone() {Name = "Саша", Number = 890953317, Remark = "Не бери трубку!", Important = false}, // Запись номера телефона. new Phone() {Name = "Дима", Number = 890512309, Remark = "Босс", Important = false}, new Phone() {Name = "Рита", Number = 890198735, Remark = "Невероятная девчонка", Important = true} } };
// Пишем в файл. WriteXmlFile("result.xml", catalog);
// Сообщаем пользователю о завершении. Console.WriteLine("ОК"); Console.ReadLine(); } Чтение XML файла на языке C# Возьмем в качестве исходного файла пример указанный выше, для простоты удалив комментарии. Program.cs /// <summary> /// Прочитать Xml файл. /// </summary> /// <param name="filename"> Путь к Xml файлу. </param> private static void ReadXmlFile(string filename) { // Создаем экземпляр Xml документа. var doc = new XmlDocument();
// Загружаем данные из файла. doc.Load(filename);
// Получаем корневой элемент документа. var root = doc.DocumentElement;
// Используем метод для рекурсивного обхода документа. PrintItem(root); }
/// <summary> /// Метод для отображения содержимого xml элемента. /// </summary> /// <remarks> /// Получает элемент xml, отображает его имя, затем все атрибуты /// после этого переходит к зависимым элементам. /// Отображает зависимые элементы со смещением вправо от начала строки. /// </remarks> /// <param name="item"> Элемент Xml. </param> /// <param name="indent"> Количество отступов от начала строки. </param> private static void PrintItem(XmlElement item, int indent = 0) { // Выводим имя самого элемента. // new string('\t', indent) - создает строку состоящую из indent табов. // Это нужно для смещения вправо. // Пробел справа нужен чтобы атрибуты не прилипали к имени. Console.Write($"{new string('\t', indent)}{item.LocalName} ");
// Если у элемента есть атрибуты, // то выводим их поочередно, каждый в квадратных скобках. foreach(XmlAttribute attr in item.Attributes) { Console.Write($"[{attr.InnerText}]"); }
// Если у элемента есть зависимые элементы, то выводим. foreach(var child in item.ChildNodes) { if (child is XmlElement node) { // Если зависимый элемент тоже элемент, // то переходим на новую строку // и рекурсивно вызываем метод. // Следующий элемент будет смещен на один отступ вправо. Console.WriteLine(); PrintItem(node, indent + 1); }
if(child is XmlText text) { // Если зависимый элемент текст, // то выводим его через тире. Console.Write($"- {text.InnerText}"); } } } В результате получим следующий вывод на консоль
Создание XML файла на языке C# Для начала нам нужно определить классы модели данных, то есть указать свойства, которые хотим хранить в файле. Phone.cs namespace XML { /// <summary> /// Телефонный контакт. /// </summary> public class Phone { /// <summary> /// Имя. /// </summary> public string Name { get; set; }
/// <summary> /// Телефонный номер. /// </summary> public int Number { get; set; }
/// <summary> /// Заметка. /// </summary> public string Remark { get; set; }
/// <summary> /// Важный контакт. /// </summary> public bool Important { get; set; }
/// <summary> /// Приведение объекта к строке. /// </summary> /// <returns> Имя. </returns> public override string ToString() { return Name; } } } Catalog.cs using System.Collections.Generic;
namespace XML { /// <summary> /// Каталог телефонных номеров. /// </summary> public class Catalog { /// <summary> /// Список телефонных номеров. /// </summary> public List<Phone> Phones { get; set; } = new List<Phone>(); } } Теперь реализуем метод формирования Xml файла на основе имеющихся данных. Program.cs /// <summary> /// Сохранить данные в Xml файл. /// </summary> /// <param name="filename"> Путь к сохраняемому файлу. </param> /// <param name="catalog"> Сохраняемые данные. </param> private static void WriteXmlFile(string filename, Catalog catalog) { // Создаем новый Xml документ. var doc = new XmlDocument();
// Создаем Xml заголовок. var xmlDeclaration = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
// Добавляем заголовок перед корневым элементом. doc.AppendChild(xmlDeclaration);
// Создаем Корневой элемент var root = doc.CreateElement("catalog");
// Получаем все записи телефонной книги. foreach(var phone in catalog.Phones) { // Создаем элемент записи телефонной книги. var phoneNode = doc.CreateElement("phone");
if (phone.Important) { // Если установлен атрибут Важный в true, // то создаем и добавляем атрибут к элементу записи телефонной книги.
// Создаем атрибут и нужным именем. var attribute = doc.CreateAttribute("group");
// Устанавливаем содержимое атрибута. attribute.InnerText = "important";
// Добавляем атрибут к элементу. phoneNode.Attributes.Append(attribute); }
// Создаем зависимые элементы. AddChildNode("name", phone.Name, phoneNode, doc); AddChildNode("number", phone.Number.ToString(), phoneNode, doc); AddChildNode("remark", phone.Remark, phoneNode, doc);
// Добавляем запись телефонной книги в каталог. root.AppendChild(phoneNode); }
// Добавляем новый корневой элемент в документ. doc.AppendChild(root);
// Сохраняем документ. doc.Save(filename); }
/// <summary> /// Добавить зависимый элемент с текстом. /// </summary> /// <param name="childName"> Имя дочернего элемента. </param> /// <param name="childText"> Текст, который будет внутри дочернего элемента. </param> /// <param name="parentNode"> Родительский элемент. </param> /// <param name="doc"> Xml документ. </param> private static void AddChildNode(string childName, string childText, XmlElement parentNode, XmlDocument doc) { var child = doc.CreateElement(childName); child.InnerText = childText; parentNode.AppendChild(child); } В результате, после выполнения программы, мы получим файл Xml с идентичной структурой и данными. Заключение Здесь рассмотрено элементарное взаимодействие с Xml файлами. В дальнейшем мы обязательно вернемся к данной теме. Исходный код доступен в репозитории https://github.com/shwanoff/XML .
|
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|