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
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) {
// изменить путь доступа, как требуется существующей структурой
Поделиться:
Популярные книги
Кремлевские звезды
6. Цеховик
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Охота на эмиссара
1. Федерация Объединённых Миров
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Меняя маски
1. Унесенный ветром
Фантастика:
боевая фантастика
попаданцы
9.22
рейтинг книги
Возрождение Феникса. Том 2
2. Возрождение Феникса
Фантастика:
фэнтези
попаданцы
альтернативная история
6.92
рейтинг книги
Возвышение Меркурия. Книга 8
8. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Бальмануг. Студентка
2. Мир Десяти
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Аватар
6. Real-Rpg
Фантастика:
боевая фантастика
5.33
рейтинг книги
Паладин из прошлого тысячелетия
1. Соприкосновение миров
Фантастика:
боевая фантастика
попаданцы
6.25
рейтинг книги
Последний попаданец
1. Последний попаданец
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Сила рода. Том 3
2. Претендент
Фантастика:
фэнтези
боевая фантастика
6.17
рейтинг книги
Para bellum
4. Фрунзе
Фантастика:
попаданцы
альтернативная история
6.60
рейтинг книги
Вечная Война. Книга VIII
8. Вечная Война
Фантастика:
боевая фантастика
юмористическая фантастика
космическая фантастика
7.09
рейтинг книги
Скрываясь в тени
2. Теневой путь
Фантастика:
боевая фантастика
7.84
рейтинг книги
Я же бать, или Как найти мать
Любовные романы:
современные любовные романы
6.44