Ватсон Карли
Шрифт:
// задайте форматирование с отступом
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. Мы не будем рассматривать каждый класс подробно, но разберем несколько примеров. Вот как выглядит диаграмма наследования:
Первый пример будет создавать объект
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);