представляется классом
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 . Делает текущей |