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

на главную

Жанры

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
):

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

Live-rpg. эволюция-3

Кронос Александр
3. Эволюция. Live-RPG
Фантастика:
боевая фантастика
6.59
рейтинг книги
Live-rpg. эволюция-3

Я – Орк

Лисицин Евгений
1. Я — Орк
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я – Орк

Беглец

Бубела Олег Николаевич
1. Совсем не герой
Фантастика:
фэнтези
попаданцы
8.94
рейтинг книги
Беглец

Корпулентные достоинства, или Знатный переполох. Дилогия

Цвик Катерина Александровна
Фантастика:
юмористическая фантастика
7.53
рейтинг книги
Корпулентные достоинства, или Знатный переполох. Дилогия

Князь Мещерский

Дроздов Анатолий Федорович
3. Зауряд-врач
Фантастика:
альтернативная история
8.35
рейтинг книги
Князь Мещерский

Генерал-адмирал. Тетралогия

Злотников Роман Валерьевич
Генерал-адмирал
Фантастика:
альтернативная история
8.71
рейтинг книги
Генерал-адмирал. Тетралогия

Идеальный мир для Лекаря 3

Сапфир Олег
3. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 3

Делегат

Астахов Евгений Евгеньевич
6. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Делегат

Болотник 2

Панченко Андрей Алексеевич
2. Болотник
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Болотник 2

Возвышение Меркурия. Книга 17

Кронос Александр
17. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 17

Курсант: Назад в СССР 11

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

Я – Орк. Том 4

Лисицин Евгений
4. Я — Орк
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я – Орк. Том 4

Восход. Солнцев. Книга XI

Скабер Артемий
11. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга XI

Мимик нового Мира 4

Северный Лис
3. Мимик!
Фантастика:
юмористическая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Мимик нового Мира 4