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

на главную - закладки

Жанры

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

Ватсон Карли

Шрифт:

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
. Делает текущей позицию, которая указана в
XPathNavigator
.
MoveToAttribute
Перемещает к именованному атрибуту. Получает имя атрибута и пространство имен как параметры.
MoveToFirstAttribute
Перемещает
к первому атрибуту текущего элемента. Возвращает
true
, если выполняется успешно.
MoveToNextAttribute
Перемещает к следующему атрибуту текущего элемента. Возвращает
true
, если выполняется успешно.
MoveToFirst
Перемещает к первому
sibling
текущего узла. Возвращает
true
, если выполняется успешно, в противном случае возвращает
false
.
MoveToLast
Перемещает к последнему
sibling
текущего узла. Возвращает
true
, если выполняется успешно.
MoveToNext
Перемещает к следующему
sibling
текущего узла. Возвращает
true
, если выполняется успешно.
MoveToPrevious
Перемещает к предыдущему
sibling
текущего узла. Возвращает
true
, если выполняется успешно.
MoveToFirstChild
Перемещает к первому потомку текущего элемента. Возвращает
true
, если выполняется успешно.
MoveToId
Перемещает к элементу с идентификатором ID, предоставленным в виде параметра. Должна существовать схема документа и данные элемента типа ID.
MoveToParent
Перемещает к предку текущего узла. Возвращает
true
, если выполняется успешно.
MoveToRoot
Перемещает к корневому узлу документа.

Существует также несколько методов

Select
выбора подмножества узлов для работы. Все методы
Select
возвращают объект
XPathNodeIterator
.
XPathNodeIterator
можно считать эквивалентом
NodeList
или
NodeSet
в
XPath
. Этот объект имеет три свойства и два метода:

□ 

Clone
— создает новую копию себя

□ 

Count
— число узлов в объекте
XPathNodeIterator

□ 

Current
— возвращает
XPathNavigator
, указывающий на текущий узел

□ 

CurrentPosition
— возвращает целое число, соответствующее текущей позиции

□ 

MoveNext
— перемещает в следующий узел, соответствующий выражению
Xpath
, которое создало
XPathNodeIterator

Можно использовать также существующие методы

SelectAncestors
и
SelectChildren
. Они возвращают
XPathNodelterator
. В то время, как
Select
получает выражение
XPath
в качестве параметра, другие методы выбора получают в качестве параметра
XPathNodeType
. В рассматриваемом примере мы выбираем все узлы
XPathNodeType.Element
.

Вот как выглядит экран после выполнения кода. Обратите внимание, что все перечисленные книги являются романами (novel).

Для добавления стоимости книг

XPathNavigator
содержит метод
Evaluate
.
Evaluate
имеет три перегружаемые версии. Первая из них содержит строку, которая является вызовом функции
XPath
. Вторая перегружаемая версия Evaluate использует в качестве параметра объект
XPathExpression
, третья —
XPathExpression
и
XPathNodeIterator
. Сделаем следующие изменения в примере (эту версию кода можно найти в
XPathXSLSample2
):

Поделиться:
Популярные книги

Как я строил магическую империю 3

Зубов Константин
3. Как я строил магическую империю
Фантастика:
попаданцы
постапокалипсис
аниме
фэнтези
5.00
рейтинг книги
Как я строил магическую империю 3

Ритуал для призыва профессора

Лунёва Мария
Любовные романы:
любовно-фантастические романы
7.00
рейтинг книги
Ритуал для призыва профессора

Невеста снежного демона

Ардова Алиса
Зимний бал в академии
Фантастика:
фэнтези
6.80
рейтинг книги
Невеста снежного демона

Прорвемся, опера! Книга 3

Киров Никита
3. Опер
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прорвемся, опера! Книга 3

Леди Малиновой пустоши

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Леди Малиновой пустоши

Мымра!

Фад Диана
1. Мымрики
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Мымра!

Матабар

Клеванский Кирилл Сергеевич
1. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар

Офицер Красной Армии

Поселягин Владимир Геннадьевич
2. Командир Красной Армии
Фантастика:
попаданцы
8.51
рейтинг книги
Офицер Красной Армии

Волхв пятого разряда

Дроздов Анатолий Федорович
2. Ледащий
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Волхв пятого разряда

Вамп

Парсиев Дмитрий
3. История одного эволюционера
Фантастика:
рпг
городское фэнтези
постапокалипсис
5.00
рейтинг книги
Вамп

Младший сын князя. Том 3

Ткачев Андрей Юрьевич
3. Аналитик
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Младший сын князя. Том 3

Шахта Шепчущих Глубин, Том II

Астахов Евгений Евгеньевич
3. Виашерон
Фантастика:
фэнтези
7.19
рейтинг книги
Шахта Шепчущих Глубин, Том II

Наследник пепла. Книга I

Дубов Дмитрий
1. Пламя и месть
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Наследник пепла. Книга I

Газлайтер. Том 9

Володин Григорий
9. История Телепата
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Газлайтер. Том 9