Работа с 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() вставляет комментарий.