представляется классом XPathNavigator. Этот класс может использоваться вместо XmlDocument, XmlDataDocument и XPathDocument. Если требуются средства редактирования, то следует выбрать XmlDocument; при работе с ADO.NET будет использоваться класс XmlDataDocument (мы увидим его позже в этой главе). Если имеет значение скорость, то применяйте в качестве хранилища XPathDocument. Можно расширить XPathNavigator для таких вещей, как файловая система или реестр в качестве хранилища. В следующей таблице перечислены классы XPath с кратким описанием назначения каждого класса:
| Имя класса | Описание |
|---|---|
XPathDocument | Представление всего документа XML. Только для чтения. |
XPathNavigator | Предоставляет навигационные возможности для XPathDocument. |
XPathNodeIterator | Обеспечивает итерацию по множеству узлов. Является эквивалентом для множества узлов в Xpath. |
XPathExpression | Компилированное выражение Xpath. Используется SelectNodes, SelectSingleNodes, Evaluate и Matches. |
XPathException | Класс исключений XPath. |
XPathDocument не предлагает никакой функциональности класса XmlDocument. Он имеет четыре перегружаемые версии, позволяющие открывать документ XML из файла или строки пути доступа, объекта TextReader, объекта XmlReader или объекта на основе Stream.
Загрузим документ books.xml и поработаем с ним, чтобы можно было понять, как действует навигация. Чтобы использовать эти примеры, необходимо добавить ссылки на пространства имен System.Xml.Xsl и System.Xml.XPath следующим образом:
using System.Xml.XPath;
using System.Xml.Xsl;
Для данного примера воспользуемся файлом bookspath.xml. Он аналогичен books.xml, за исключением того, что добавлены дополнительные книги. Вот код формы, который находится в папке XPathXSLSample1:
private void button1_Click(object sender, System.EventArgs e) {
// изменить в соответствии с используемой структурой путей доступа
XPathDocument doc=new XPathDocument('..\..\..\booksxpath.xml');
// создать XPathNavigator
XPathNavigator nav=((IXPathNavigable)doc).CreateNavigator();
// создать XPathNodeIterator узлов книг
// который имеют значение атрибута genre, совпадающее с novel
XPathNodeIterator iter=nav.Select('/bookstore/book[@genre='novel']');
while(iter.MoveNext()) {
LoadBook(iter.Current);
}
}
private void LoadBook(XPathNavigator lstNav) {
// Нам передали XPathNavigator определенного узла book,
// мы выберем всех прямых потомков и
// загрузим окно списка с именами и значениями
XPathNodeIterator iterBook=lstNav.SelectDescendants(XPathNodeType.Element, false);
while(iterBook.MoveNext())
listBox1.Items.Add(iterBook.Current.Name + ': ' + iterBook.Current.Value);
}
Здесь сначала создается XPathDocument, передавая строку файла и пути доступа документа, который будет открыт. В следующей строке кода создается XPathNavigator:
XPathNavigator nav=((IXPathNavigable)doc).CreateNavigator();
Отметим, что здесь происходит преобразование типа интерфейса IXPathNavigable в только что созданный XPathNavigator, что вызывает метод CreateNavigator. После создания объекта XPathNavigator можно начать навигацию в документе.
Этот пример показывает, как применяются методы Select для получения множества узлов, которые имеют novel в качестве значения атрибута genre. Затем мы используем цикл MoveNext() для итераций по всем novels в списке книг.
Для загрузки данных в listbox используется свойство XPathNodeIterator.Current. При этом создается новый объект XPathNavigator на основе узла, на который указывает XPathNodeIterator. В данном случае создается XPathNavigator для одного узла book (книги) в документе. LoadBook создает другой XPathNodeIterator, вызывая иной тип метода выбора — метод SelectDescendants. Это даст нам XPathNodeIterator всех узлов- потомков и потомков узлов-потомков узла book (книга), переданного в метод LoadBook. Мы делаем другой цикл MoveNext() на этом XPathNodeIterator и загружаем окно списка именами и значениями элементов.
XPathNavigator содержит все методы для перемещения и выбора элементов, которые могут понадобиться. Приведем некоторые из методов перемещения:
| Имя метода | Описание |
|---|---|
| MoveTo | Получает в качестве параметра XPathNavigator. Делает текущей |
