Как сохранить xml файл c

Обновлено: 07.07.2024

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.

Читайте также: