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");