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
рейтинг книги
Я – Орк
1. Я — Орк
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Беглец
1. Совсем не герой
Фантастика:
фэнтези
попаданцы
8.94
рейтинг книги
Корпулентные достоинства, или Знатный переполох. Дилогия
Фантастика:
юмористическая фантастика
7.53
рейтинг книги
Князь Мещерский
3. Зауряд-врач
Фантастика:
альтернативная история
8.35
рейтинг книги
Генерал-адмирал. Тетралогия
Генерал-адмирал
Фантастика:
альтернативная история
8.71
рейтинг книги
Идеальный мир для Лекаря 3
3. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Делегат
6. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Болотник 2
2. Болотник
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Возвышение Меркурия. Книга 17
17. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Курсант: Назад в СССР 11
11. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Я – Орк. Том 4
4. Я — Орк
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга XI
11. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Мимик нового Мира 4
3. Мимик!
Фантастика:
юмористическая фантастика
постапокалипсис
рпг
5.00