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



):

>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) {

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

> doc.Load("..\\..\\..\\books.xml");

> // создать новый элемент 'book'

> XmlElement newBook=doc.CreateElement("book");

> // задать некоторые атрибуты

> newBook.SetAttribute("genre", "Mystery");