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
,