Как сохранить xml файл c
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 данных из файла, и сохранение данных в Xml файл. Рассмотрим основной метод приложения.
Program.cs
static void Main(string[] args)
// Устанавливаем кодировку консоли.
// Нужно только если при использовании англоязычной Windows
// на консоль вместо кириллицы выводятся знаки вопроса (. . . )
Console.OutputEncoding = Encoding.Unicode;
// Читаем Xml файл.
ReadXmlFile("example.xml");
// Ждем ввода пользователя.
Console.ReadLine();
// Пишем в файл.
WriteXmlFile("result.xml", catalog);
// Сообщаем пользователю о завершении.
Console.WriteLine("ОК");
Console.ReadLine();
>
Возьмем в качестве исходного файла пример указанный выше, для простоты удалив комментарии.
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);
>
// Если у элемента есть атрибуты,
// то выводим их поочередно, каждый в квадратных скобках.
foreach(XmlAttribute attr in item.Attributes)
Console.Write($"[]");
>
if(child is XmlText text)
// Если зависимый элемент текст,
// то выводим его через тире.
Console.Write($"- ");
>
>
>
В результате получим следующий вывод на консоль
Для начала нам нужно определить классы модели данных, то есть указать свойства, которые хотим хранить в файле.
Phone.cs
namespace XML
/// <summary>
/// Телефонный контакт.
/// </summary>
public class Phone
/// <summary>
/// Имя.
/// </summary>
public string Name
/// <summary>
/// Телефонный номер.
/// </summary>
public int Number
/// <summary>
/// Заметка.
/// </summary>
public string Remark
/// <summary>
/// Важный контакт.
/// </summary>
public bool Important
/// <summary>
/// Приведение объекта к строке.
/// </summary>
/// <returns> Имя. </returns>
public override string ToString()
return Name;
>
>
>
Catalog.cs
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-данных мы возьмём слегка видоизмененный код из статьи о считывании XML-файла в программу. А именно будем создавать подобные записи:
Внешний вид
Выглядеть наша программа будет вот так:
У на нашей форме находятся следующие элементы: TextBox, NumericUpDown, ComboBox, а также кнопки и элемент DataGridView, разбитый на три столбца и занимающий большую часть формы.
В этом окне можно настроить имя, ширину и прочие свойства столбцов. Также стоит ознакомиться с некоторыми изменениями в свойствах данного элемента, которые мы внесли (в исходном файле, который можно скачать внизу статьи). Для удобства использования и избежания некоторых ошибок мы запретили в DataGridView добавлять строки, выбирать более одной строки, а также редактировать данные.
Добавление данных
Далее переходим к коду. Перво-наперво нам надо подключить библиотеку IO:
Данная библиотека отвечает за загрузку, запись и чтение файлов. Она нам понадобится, потом что мы в итоге будем сохранять наш файл на диск.
Для этого в коде кнопки пишем следующее:
private void button1_Click ( object sender , EventArgs e ) //Добавление данных в форму dataGridView1 . Rows [ n ] . Cells [ 0 ] . Value = textBox1 . Text ; // столбец Name dataGridView1 . Rows [ n ] . Cells [ 1 ] . Value = numericUpDown1 . Value ; // Age dataGridView1 . Rows [ n ] . Cells [ 2 ] . Value = comboBox1 . Text ; // ProgrammerСохранение XML-файла
Итак, мы можем добавить сколько угодно записей. Теперь надо их сохранить как один XML-файл.
private void button4_Click ( object sender , EventArgs e ) //сохранение данных из формы в XML DataSet ds = new DataSet ( ) ; // создаем пока что пустой кэш данных DataTable dt = new DataTable ( ) ; // создаем пока что пустую таблицу данных ds . Tables . Add ( dt ) ; //в ds создается таблица, с названием и колонками, созданными выше foreach ( DataGridViewRow r in dataGridView1 . Rows ) // пока в dataGridView1 есть строки DataRow row = ds . Tables [ "Employee" ] . NewRow ( ) ; // создаем новую строку в таблице, занесенной в ds row [ "Name" ] = r . Cells [ 0 ] . Value ; //в столбец этой строки заносим данные из первого столбца dataGridView1 row [ "Age" ] = r . Cells [ 1 ] . Value ; // то же самое со вторыми столбцами row [ "Programmer" ] = r . Cells [ 2 ] . Value ; //то же самое с третьими столбцами ds . Tables [ "Employee" ] . Rows . Add ( row ) ; //добавление всей этой строки в таблицу ds. MessageBox . Show ( "XML файл успешно сохранен." , "Выполнено." ) ; MessageBox . Show ( "Невозможно сохранить XML файл." , "Ошибка." ) ;По сути мы просто создаем кэш данных под названием ds, затем в этот кэш заносим таблицу со столбцами Name, Age и Programmer.
Затем при помощи оператора цикла foreach, который работает с группами объектов (например, со столбцами и строками таблицы) создаем строку с тремя столбцами, в каждый из которых записываем данные из соответствующих столбцов dataGridView.
В XML-файл данные из ds переводятся автоматически при помощи метода WriteXml.
DataRow row = ds . Tables [ "Employee" ] . NewRow ( ) ; // создаем новую строку в таблице, занесенной в dsКоличество таких тегов будет равно количеству строк в DataGridView и, соответственно, количеству строк в ds.
row [ "Name" ] = r . Cells [ 0 ] . Value ; //в столбец этой строки заносим данные из первого столбца dataGridView1 row [ "Age" ] = r . Cells [ 1 ] . Value ; // то же самое со вторыми столбцами row [ "Programmer" ] = r . Cells [ 2 ] . Value ; //то же самое с третьими столбцамиСохранение данного XML-файла будет произведено по пути, записанному в скобках следующей строки:
В данном случае файл сохраняется на диск G и имеет название Data.xml.
Важно: проверьте, имеет ли Visual Studio права для сохранения данных на выбранный вами диск. Если у него не будет для этого прав, то появится ошибка и файл не будет сохранен.
Мы научились добавлять и сохранять XML-файл при помощи класса DataSet и элемента DataGridView.
Загрузка XML-файла
private void button5_Click ( object sender , EventArgs e ) //загрузка файла XML в форму if ( dataGridView1 . Rows . Count > 0 ) //если в таблице больше нуля строк MessageBox . Show ( "Очистите поле перед загрузкой нового файла." , "Ошибка." ) ; if ( File . Exists ( "G:\\Data.xml" ) ) // если существует данный файл DataSet ds = new DataSet ( ) ; // создаем новый пустой кэш данных ds . ReadXml ( "G:\\Data.xml" ) ; // записываем в него XML-данные из файла foreach ( DataRow item in ds . Tables [ "Employee" ] . Rows ) int n = dataGridView1 . Rows . Add ( ) ; // добавляем новую сроку в dataGridView1 dataGridView1 . Rows [ n ] . Cells [ 0 ] . Value = item [ "Name" ] ; // заносим в первый столбец созданной строки данные из первого столбца таблицы ds. dataGridView1 . Rows [ n ] . Cells [ 1 ] . Value = item [ "Age" ] ; // то же самое со вторым столбцом dataGridView1 . Rows [ n ] . Cells [ 2 ] . Value = item [ "Programmer" ] ; // то же самое с третьим столбцомТаким образом происходит загрузка XML-файла.
Редактирование данных
Теперь сделаем возможность редактирования данных для XML-файла.
Итак, для начала мы переходим в события элемента DataGridView (значок молнии), ищем там MouseClick и щёлкаем на поле рядом с ним два раза:
Естественно, создание, модификация и удаление данных XML ничего не стоит, если нет возможности сохранять изменения. В этом разделе будет описано несколько способов вывода XML-разметки.
Сохранение с помощью XDocument.Save()
Сохранять XML-документ можно с использованием любого из нескольких методов XDocument.Save. Вот список его прототипов:
Ниже приведен пример сохранения XML-документа в файле, находящемся в папке проекта:
Обратите внимание, что метод Save вызывается на объекте типа XDocument. Причина в том, что методы Save являются методами экземпляра. Методы Load, которые рассматриваются в следующей статье "Ввод XML", являются статическими и должны вызываться на классе XDocument или XElement.
Ниже приведено содержимое сгенерированного файла employees.xml при просмотре его в простом текстовом редакторе:
Этот вывод XML-документа легко читается, поскольку вызванная версия метода Save форматирует вывод. То есть, если вызвать версию метода Save, принимающую строку имени файла и аргумент SaveOptions, передав в нем значение SaveOptions.None, то получится тот же результат, что и раньше. Но если вызвать метод Save следующим образом:
то результат в файле будет выглядеть так:
Это одна непрерывная строка текста. Результат необходимо просматривать в текстовом редакторе, потому что браузер сформатирует его.
Разумеется, для вывода документа можно использовать любой другой доступный метод — выбор исключительно за вами.
Сохранение с помощью XElement.Save()
Уже много раз говорилось, что в LINQ to XML создавать XML-документ не обязательно. Также не обязательно это делать для сохранения XML-файла. Класс XElement также имеет несколько методов Save, предназначенных для этой цели:
Ниже приведен пример, очень похожий на предыдущий, за исключением того, что XML-документ в нем не создается:
Сохраненный XML выглядит идентично предыдущему примеру, где в действительности существовал XML-документ.
Приветствую всех! Сегодня посмотрим классы и методы работы с файлами XML.
XML-eXtensible Markup Language-Текстовый формат, предназначенный для хранения структурированных данных для обмена информацией между программами, а
также для создания на его основе более специализированных языков разметки.
XML — это описанная в текстовом формате иерархическая структура, предназначенная для хранения любых структурированных данных. Визуально структура может быть представлена как дерево элементов. Элементы XML описываются тегами. Основан на принципах иерархии.
< firstElement attribute = "значения 1" attribute = "значение 2" > < ! -- Иерархия элемента второго уровня , подчиненная предыдущему -- >XML-классы в пространстве имен System.Xml образуют полнофункциональный интегрированный набор классов, позволяющий работать с XML-документами и данными. XML-классы поддерживают синтаксический анализ и запись XML-кода, изменение XML-данных в памяти, проверку данных и преобразование XSLT.
XmlAttribute : атрибут элемента.
XmlDeclaration: описание документа.
XmlDocument : документ XML.
XmlElement : элемент XML.
XmlNode: узел, может быть как весь документ, так и отдельные элемент.
Основным классом для работы с XML является XmlNode
Attributes -колекция атрибутов узла.
ChildNodes -коллекция дочерних узлов.
Value-получить значение
Классы для работы с XML
XmlDocument основные методы и свойство:
Load()-загрузает документ из внешнего источника.
LoadXml()-создает документ из строки с XML.
Greate()-создает соответствующий объект.
DocumentElement-корневой элемент документа.
XmlElement основные методы и свойство:
XmlElement-представляет собой элемент, может иметь атрибуты, а также может иметь дочерние элементы.
GetAttribute()-возвращает значения атрибута по его имени.
Name-имя текущего элемента.
Remove-удаляет соответствующий объект.
SetAttribute()-добавляет в элемент новый атрибут с именем и значением.
XML Path Language
XPath (XML Path Language) — язык запросов к элементам XML-документа.
Разработан для организации доступа к частям документа XML в файлах трансформации XSLT и является стандартом консорциума W3C. XPath призван реализовать навигацию по DOM в XML.
Пространство имен XPath
Пространство имен, позволяющее использовать возможности языка XPath (XML Path Language).
Содержит класс XPathDocument, позволяющий создавать экземпляры XPathNavigator.
XPathNavigator – предоставляет курсор-ориентированную модель для просмотра и редактирования XML данных.
Пространство имен System.Xml.XPath содержит классы, определяющие модель курсора для переходов и изменения элементов сведений XML и предназначено для обеспечения высокой скорости работы.
XPathDocument – представляет собой быстрое, доступное только для чтения, хранимое в памяти представление XML-документа с помощью модели данных XPath. Его единственной задачей является создание навигаторов XPathNavigator. Создавать класс XPathDocument можно несколькими способами. Можно передать его конструктору
экземпляр XmlReader, имя файла XML-документа или объект, основанный на Stream. Это обеспечивает значительную гибкость, например, можно сначала применить
XmlValidatingReader для проверки правильности XML-документа и затем воспользоваться этим же объектом для создания XPathDocument.
Читайте также: