Работа с XML в .NET - Создание XML-документов
ОГЛАВЛЕНИЕ
Создание XML-документов
Для создания новых XML-документов применяется класс XmlTextWriter. Он обеспечивает быстрое небуферизованное создание XML-документов и их запись в файлы, потоки, на консоль и пр. Рассмотрим функцию для сохранения в файл данных о заказах.
private void menuItemSave_Click(object sender, System.EventArgs e)
{
SaveFileDialog saveDlg = new SaveFileDialog();
saveDlg.FileName = "заказы";
saveDlg.DefaultExt = "xml";
saveDlg.Filter = "Файлы XML (*.xml)|*.xml";
if (saveDlg.ShowDialog() != DialogResult.OK)
return;
XmlTextWriter writer = null;
try
{
writer = new XmlTextWriter(saveDlg.FileName, System.Text.Encoding.Unicode);
writer.WriteStartDocument();
writer.WriteStartElement("Заказы");
// сохраняем заказы
foreach (Order order in orders)
{
writer.WriteStartElement("Заказ");
writer.WriteAttributeString("Адрес", order.Address);
writer.WriteAttributeString("Дата", order.Date.ToShortDateString());
// сохраняем товар
foreach (Good good in order.Goods)
{
writer.WriteStartElement("Товар");
writer.WriteAttributeString("Название", good.Name);
writer.WriteAttributeString("Цена", good.Price.ToString());
writer.WriteEndElement();
}
writer.WriteEndElement();
}
writer.WriteEndElement();
writer.WriteEndDocument();
}
catch (Exception ex)
{
MessageBox.Show("Ошибка: " + ex.Message);
}
finally
{
if (writer != null)
writer.Close();
}
}
Создавая объект XmlTextWriter в его конструктор мы передали имя файла, в который будут сохраняться XML-данные и кодировку. Перегруженная версия конструктора принимает вместо имени файла объект Stream. Таким образом, в конструктор можно передать, например, объект MemoryStream, а потом сохранить XML-данные в БД. Вызов метода WriteStartDocument() записывает строку с объявлением версии XML и типом кодировки. В нашем случаем это будет
<?xml version="1.0" encoding="utf-16" ?> .
Пары функций WriteStartElement() и WriteEndElement() записывают начало и конец тега с указанным названием. В массиве orders хранятся объекты Order, инкапсулирующие заказы. В цикле мы перебираем все заказы и для каждого заказа вызываем метод WriteStartElement с параметром "Заказ". Для создания корректного XML-документа каждому вызову функции WriteStartElement() должен соответствовать вызов WriteEndElement(). Перегруженные версии функции WriteStartElement() позволяют указать для тега пространство имен и префикс. Для указания атрибута тега применяется функция WriteAttributeString(). С помощью перегруженных версий функции также можно указать префикс и пространство имен для атрибута. Функция WriteEndDocument() применяется для защиты от случайных ошибок создания XML-документа - она закрывает все открытые теги и атрибуты и переводит writer в начальное состояние. Сохраним следующие заказы.
В результате у нас получается документ такого вида
<?xml version="1.0" encoding="utf-16" ?>
<Заказы>
<Заказ Адрес="Уфа" Дата="21.04.2004">
<Товар Название="Товар_А" Цена="100" />
<Товар Название="Товар_Б" Цена="150" />
<Товар Название="Товар_В" Цена="370" />
</Заказ>
<Заказ Адрес="Москва" Дата="24.04.2004">
<Товар Название="Товар_Г" Цена="400" />
</Заказ>
<Заказ Адрес="Омск" Дата="28.04.2004">
<Товар Название="Товар_Д" Цена="255" />
</Заказ>
</Заказы>
Класс XmlTextWriter предоставляет большое количество методов для создания XML-документов. Например, функция WriteElementString() создает элемент, содержащий одно текстовое значение, такое как <Дата>01.05.04</Дата>. Функция WriteBinHex() массив байтов в шеснадцатиричном виде, а функция WriteComment() вставляет комментарий.