
- •Лекция 5. Создание xml-документов в .Net
- •1. Использование класса XmlWriter - запись потоков данных Xml
- •2. Использование dom в .Net
- •2.1. Чтение xml-документа с помощью XmlNodeList
- •2.2. Вставка элементов (узлов) в xml- документ
- •3. Обработка атрибутов
- •3.1. Извлечение атрибутов с помощью XmlReader
- •3.2. Вставка атрибутов в документ с помощью XmlWriter
2.1. Чтение xml-документа с помощью XmlNodeList
Создадим новое приложение WinXML-DOM WindowsApplication, которое будет читать данные книжного каталога и загружать названия книг в окно списка.
Для разнообразия данные будем выводить в Listbox. Это аналогично примеру применения XmlReader. Отличие заключается в том, что осуществляется выбор, с какими узлами мы хотим работать, вместо того чтобы использовать весь документ. Вот код для выполнения этого примера в среде XmlNode.
Добавим на форму список и две кнопки. Кроме того, добавим текстовые поля для следующей версии программы.
При нажатии кнопки Чтение в список выводим названия книг. Обработчик кнопки:
private void btmReadXML_Click(object sender, EventArgs e)
{
// изменить путь доступа в соответствии со структурой путей доступа
doc.Load("book2.xml");
// получить только те узлы, которые нужны
XmlNodeList nodeLst=doc.GetElementsByTagName("TITLE");
// итерации по списку XmlNodeList
foreach(XmlNode node in nodeLst) listBox1.Items.Add(node.InnerText);
}
Обратите внимание, что мы добавили следующее объявление на уровне модуля:
public partial class Form1 : Form
{
public XmlDocument doc = new XmlDocument();
public Form1()
{
InitializeComponent();
}
Если бы это было все, что нужно делать, то использование XmlReader было бы значительно более эффективным способом загрузки окна списка. Причина в том, что мы прошли через документ один раз и затем закончили с ним работу. Однако, если желательно повторно посетить узел, то использование XmlDocument является лучшим для этого способом.
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
// создать строку поиска XPath
string srch = "INVENTORY/BOOK[TITLE='" + listBox1.SelectedItem.ToString() + "']";
// поиск дополнительных данных
XmlNode foundNode = doc.SelectSingleNode(srch);
if (foundNode != null) MessageBox.Show(foundNode.InnerText);
else MessageBox.Show("Not found");
}
В этом примере listbox с заголовками загружается из документа book2.xml. Когда мы щелкаем на окне списка, вызывая порождение события SelectedIndexChange, мы берем текст выбранного пункта в listbox, в данном случае заголовок книги, создаем оператор XPath и передаем его в метод SelectSingleNode объекта doc. Он возвращает элемент book, частью которого является TITLE (foundNode). Выведем для наглядности InnerText узла в окне сообщения. Мы можем продолжать щелкать на элементах в listbox сколько угодно раз, так как документ загружен и остается загруженным, пока мы его не освободим.
Небольшой комментарий в отношении метода SelectSingleNode. Это реализация XPath в классе XmlDocument. Существуют методы SelectSingleNode и SelectNodes. Оба они определены в XmlNode, на котором основывается XmlDocument. SelectSingleNode возвращает XmlNode, и SelectNodes возвращает XmlNodeList.