Чтение онлайн

на главную - закладки

Жанры

C# для профессионалов. Том II

Ватсон Карли

Шрифт:

Чтение и запись 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);

}

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

private XmlDocument doc=new XmlDocument;

Если бы это было все, что нужно делать, то использование

XmlReader
было бы значительно более эффективным способом загрузки окна списка. Причина в том, что мы прошли через документ один раз и затем закончили с ним работу. Однако, если желательно повторно посетить узел, то использование
XmlDocument
является лучшим для этого способом. Слегка расширим пример (новая версия находится в
DOMSample2
):

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 void listBox1_SelectedIndexChanged(object sender, System.EventArgs e) {

 // создать строку поиска XPath

 string srch="bookstore/book[title='" + listBox1.SelectedItem.ToString + "']";

 // поиск дополнительных данных

 XmlNode foundNode=doc.SelectSingleNode(srch);

 if (foundNode!=null) MessageBox.Show(foundNode.InnerText);

 else MessageBox.Show("Not found");

}

В этом примере

listbox
с заголовками загружается из документа
books.xml
. Когда мы щелкаем на окне списка, вызывая порождение события
SelectedIndexChange
(не забудьте добавить код, присоединяющий обработчик событий в функцию
InitializeComponent
), мы берем текст выбранного пункта в
listbox
, в данном случае заголовок книги, создаем оператор XPath и передаем его в метод
SelectSingleNode
объекта
doc
. Он возвращает элемент
book
, частью которого является title (foundNode). Выведем для наглядности InnerText узла в окне сообщения. Мы можем продолжать щелкать на элементах в
listbox
сколько угодно раз, так как документ загружен и остается загруженным, пока мы его не освободим.

Небольшой комментарий в отношении метода

SelectSingleNode
. Это реализация
XPath
в классе
XmlDocument
. Существуют методы
SelectSingleNode
и
SelectNodes
. Оба они определены в
XmlNode
, на котором основывается
XmlDocument
.
SelectSingleNode
возвращает
XmlNode
, и
SelectNodes
возвращает
XmlNodeList
. Пространство имен
System.Xml.XPath
содержит более насыщенную реализацию
XPath
(см. ниже).

Ранее рассматривался пример

XmlTextWriter
, который создает новый документ. Ограничение состояло в том, что он не вставлял узел в текущий документ. Это можно сделать с помощью класса
XmlDocument
. Если изменить
button1_Click
из предыдущего примера, то получим следующий код (
DOMSample3
):

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

 // изменить путь доступа, как требуется существующей структурой

Поделиться:
Популярные книги

Скандальная свадьба

Данич Дина
1. Такие разные свадьбы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Скандальная свадьба

Орден Багровой бури. Книга 5

Ермоленков Алексей
5. Орден Багровой бури
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Орден Багровой бури. Книга 5

Адвокат Империи 7

Карелин Сергей Витальевич
7. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Адвокат Империи 7

АН (цикл 11 книг)

Тарс Элиан
Аномальный наследник
Фантастика:
фэнтези
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
АН (цикл 11 книг)

Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Клеванский Кирилл Сергеевич
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.51
рейтинг книги
Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Вспоминай меня ночью

Рам Янка
Любовные романы:
современные любовные романы
эро литература
5.60
рейтинг книги
Вспоминай меня ночью

Адвокат вольного города 3

Кулабухов Тимофей
3. Адвокат
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Адвокат вольного города 3

На границе империй. Том 9. Часть 5

INDIGO
18. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 5

Адвокат вольного города 4

Кулабухов Тимофей
4. Адвокат
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Адвокат вольного города 4

Земная жена на экспорт

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.57
рейтинг книги
Земная жена на экспорт

Варлорд

Астахов Евгений Евгеньевич
3. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Варлорд

Баронесса. Эхо забытой цивилизации

Верескова Дарья
1. Проект «Фронтир Вита»
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Баронесса. Эхо забытой цивилизации

Неудержимый. Книга XVII

Боярский Андрей
17. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XVII

Чиновникъ Особых поручений

Кулаков Алексей Иванович
6. Александр Агренев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чиновникъ Особых поручений