Litvek - онлайн библиотека >> Кристиан Нагель и др. >> C, C++, C# и др. >> C# для профессионалов. Том II >> страница 5
использоваться класс TextWriter(пример находится в папке XMLWriterSample1):

private void button1_Click(object sender, System.EventArgs e) {

 // измените в соответствии с используемой структурой путей доступа

 string fileName="..\\..\\..\\booknew.xml";

 //создайте XmlTextWriter

 XmlTextWriter tw=new XmlTextWriter(fileName, null);

 // задайте форматирование с отступом

 tw.Formatting=Formatting.Indented;

 tw.WriteStartDocument();

 //Начать создание элементов и атрибутов

 tw.WriteStartElement("book");

 tw.WriteAttributeString("genre", "Mystery");

 tw.WriteAttributeString("publicationdate", "2001");

 tw.WriteAttributeString("ISBN", "123456789");

 tw.WriteElementString("title", "Case of the Missing Cookie");

 tw.WriteStartElement("author");

 tw.WriteElementString("name", "Cookie Monster");

 tw.WriteEndElement();

 tw.WriteElementString("price", "9.99");

 tw.WriteEndElement();

 tw.WriteEndDocument();

 // очистить

 tw.Flush();

 tw.Close();

}

Создадим новый файл booknew.xml и добавим новую книгу. Объект XmlTextWriter заменит существующий файл. Вставку нового элемента или узла в существующий документ рассмотрим позже. Экземпляр объекта XmlTextWriter создается с помощью объекта FileStream в качестве параметра. Можно также передать строку с именем файла и путем доступа или объект на основе TextWriter. При задании свойства Indenting узлы-потомки будут автоматически делать отступ от предка. Метод WriteStartDocument() помещает объявление документа. Начинаем запись данных. Сначала идет элемент book. Затем добавляем атрибуты genre, publicationdate и ISBN. После чего записываем элементы title, author, и price. Отметим, что элемент author имеет элемент-потомок name.

После нажатия на кнопку будет создан следующий файл booknew.xml:

<?xml version="1 .0"?>

<book genre= "Mystery" publicationdate="2001" ISBN="123456789">

 <title>Case of the Missing Cookie</title>

 <author>

  <name>Cookie Monster</name>

 </author>

 <price>9,99</price>

</book>

Так же как в документе XML, здесь имеются начальный метод и конечный метод (WriteStartElement и WriteEndElement). Вложенность контролируется отслеживанием начала и окончания записи элементов и атрибутов. Это можно видеть при добавлении элемента потомка name к элементу authors. Отметим, как организуются вызовы методов WriteStartElement и WriteEndElement и как это связывается с выведенным документом XML.

В дополнение к WriteElementString и WriteAtributeString имеется несколько других специализированных методов записи. Метод WriteCDate будет выводить раздел CDate (<!CDATE[...]]>), взяв текст для записи из параметра. WriteComment записывает комментарий в подходящем формате XML. WriteChars записывает содержимое символьного буфера. Это работает аналогично методу ReadChars, который был рассмотрен ранее. Оба они используют один и тот же тип параметров. Методу WriteChar нужен буфер (массив символов), начальная позиция для записи (целое значение) и число символов для записи (целое значение).

Чтение и запись XML с помощью классов, основанных на XMLReader и XMLWriter, осуществляются очень просто. Далее мы рассмотрим реализацию DOM пространства имен System.Xml. Это классы на основе XmlDocument и XmlNode.

Объектная модель документа в .NET

Реализация объектной модели документа (DOM, Document Object Model) в .NET поддерживает спецификации W3C DOM Level 1 и Core DOM Level 2. DOM реализуется с помощью класса XmlNode. XmlNode является абстрактным классом, который представляет узел документа XML. XmlNodeList является упорядоченным списком узлов. Это живой список узлов, и любые изменения в любом узле немедленно отражаются в списке. XmlNodeList поддерживает индексный доступ или итеративный доступ. Эти два класса составляют основу реализации DOM на платформе .NET. Вот список классов, которые основываются на XmlNode.

Имя класса Описание XmlLinkedNode Расширяет XmlNode. Возвращает узел непосредственно перед или после текущего узла. Добавляет свойства NextSibling и PreviousSibling в XmlNode. XmlDocument Расширяет XmlNode. Представляет весь документ. Реализует спецификации DOM Level 1 и Level 2. XmlAttribute Расширяет XmlNode. Объект атрибута объекта XmlElement. XmlCDataSection Расширяет XmlCharacterData. Объект, который представляет раздел документа CData. XmlCharacterData Абстрактный класс, который предоставляет методы манипуляции с текстом для других классов. Расширяет XmlLinkedNode. XmlComment Расширяет XmlCharacterData. Представляет объект комментария XML. XmlDeclaration Расширяет XmlLinkedNode. Представляет узел объявления (<?xml version='1.0' ...>) XmlDocumentFragment Расширяет XmlNode. Представляет фрагмент дерева документа. XmlDocumentType Расширяет XmlLinkedNode. Данные, связанные с объявлением типа документа. XmlElement Расширяет XmlLinkedNode. Объект элемента XML. XmlEntity Расширяет XmlNode. Синтаксически разобранный или неразобранный узел сущности. XmlEntityReferenceNode Расширяет XmlLinkedNode. Представляет ссылочный узел сущности XmlNotation Расширяет XmlNode. Содержит нотацию, объявленную в DTD или в схеме. XmlProcessingInstruction Расширяет XmlLinkedNode. Содержит инструкцию обработки XML. XmlSignificantWhitespace Расширяет XmlCharacterData. Представляет узел с разделителем. Узлы создаются, только если флаг PreserveWhiteSpace задан как true. XmlWhitespace Расширяет XmlCharacterData. Представляет разделитель в содержимом элемента. Узлы создаются, только если флаг PreserveWhiteSpace задан как true. XmlText Расширяет XmlCharacterData. Текстовое содержимое элемента или атрибута. Как можно видеть .NET делает доступным класс, соответствующий почти любому типу XML. Мы не будем рассматривать каждый класс подробно, но разберем несколько примеров. Вот как выглядит диаграмма наследования:

C# для профессионалов. Том II. Иллюстрация № 7 Первый пример будет создавать объект XmlDocument, загружать документ с диска и загружать окно списка с данными из элементов title. Это аналогично одному из примеров, которые были выполнены в разделе XmlReader. Отличие заключается в том, что осуществляется выбор, с какими узлами мы хотим работать, вместо того чтобы использовать весь документ. Вот код для выполнения этого в среде XmlNode. Посмотрите, как просто он выглядит при сравнении (файл можно найти в папке DOMSample1 загруженного архива):

private void button1_Click(object sender. System.EventArgs e) {

 // doc объявлен на уровне модуля

 // изменить путь доступа в соответствии со структурой путей доступа

 doc.Load("..\\..\\..\\books.xml")

 // получить только те узлы, которые нужны

 XmlNodeList nodeLst=doc.GetElementsByTagName("title");

 // итерации по списку XmlNodeList

 foreach(XmlNode node in nodeLst) listBox1.Items.Add(node, InnerText);

}

Обратите внимание, что мы добавили следующее объявление на уровне модуля:

private XmlDocument doc=new XmlDocument();

Если бы это было все, что нужно делать, то использование XmlReader было бы значительно более эффективным способом загрузки окна списка. Причина в том, что мы прошли через документ один раз и затем
Litvek: лучшие книги месяца
Топ книга - Семь смертей Эвелины Хардкасл [Стюарт Тёртон] - читаем полностью в LitvekТоп книга - Новая власть. Какие силы управляют миром – и как заставить их работать на вас [Джереми Хейманс] - читаем полностью в LitvekТоп книга - Небесный почтальон Федя Булкин [Александра Вадимовна Николаенко] - читаем полностью в LitvekТоп книга - От Руси до России. Иллюстрированная история [Лев Николаевич Гумилёв] - читаем полностью в LitvekТоп книга - Тысяча сияющих солнц [Халед Хоссейни] - читаем полностью в LitvekТоп книга - Тонкое искусство пофигизма [Марк Мэнсон] - читаем полностью в LitvekТоп книга - Узник [Anne Dar] - читаем полностью в LitvekТоп книга - Металлический турнир [Anne Dar] - читаем полностью в Litvek