Чтение онлайн

ЖАНРЫ

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

Ватсон Карли

Шрифт:

}

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

 newBook.SetAttribute("publicationdate", "2001");

 newBook.SetAttricute("ISBN", "123456789");

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

 XmlElement newTitle=doc.CreateElement("title");

 newTitle.InnerText="Case of the Missing cookie";

 newBook.AppendChild(newTitle);

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

 XmlElement newAuthor=doc.CreateElement("author");

 newBook.AppendChild(newAuthor);

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

 XmlElement newName=doc.CreateElement("name");

 newName.InnerText="С. Monster";

 newAuthor.AppendChild(newName);

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

 XmlElement newPrice=doc.CreateElement("price");

 newPrice.innerText="9.95";

 newBook.AppendChild(newPrice);

 // добавить к текущему документу

 doc.DocumenElement.AppendChild(newBook);

 // записать doc на диск

 XmlTextWriter tr=new XmlTextWriter("..\\..\\..\\booksEdit.xml", null);

 tr.Formatting=Formatting.Indented;

 doc.WriteContentTo(tr);

 tr.Close;

 // загрузить listBox1 со всеми заголовками, включая новый

 XmlNodeList nodeLst=doc.GetElementsByTagName("title");

 foreach(XmlNode node in nodeLst) listBox1.Items.Add(node.InnerText);

}

private void listBox1_SelectedIndexChanged(object sender, System.EventArgs e) {

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

}

При выполнении этого кода будет получена функциональность предыдущего примера, но в окне списка появилась одна дополнительная книга "The Case of Missing Cookie". Щелчок мыши на заголовке этой книги приведет к выводу такой же информации, как и для других книг. Анализируя код, можно увидеть, что это достаточно простой процесс. Прежде всего создается новый элемент

book
:

XmlElement newBook = doc.CreateElement("book);

Метод

CreateElement
имеет три перегружаемые версии, которые позволяют определить имя элемента, имя и пространство имен URI, и, наконец,
prefix
(префикс),
lоcalname
(локальное имя) и
namespace
(пространство имен). Когда элемент создан, необходимо добавить атрибуты

newBook.setAttribute("genre", "Mystery");

newBook.SetAttribute("publicationdate", "2001");

newBook.SetAttribute("ISBN", "123456789");

Напомним, что класс

XmlAttribute
расширяет класс
XmlNode
, поэтому нам доступны все свойства и методы
XmlNode
. Даже если имеется очень сложная структура, то при ее размещении никаких проблем возникать не должно.

Теперь, когда атрибуты созданы и необходимо добавить другие элементы книги:

XmlElement newTitle=doc.CreateElement("title");

newTitle.InnerText="Case of the Missing Cookie";

Поделиться с друзьями: