Страница 2 из 7 Создание 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() вставляет комментарий. |