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

ЖАНРЫ

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

Ватсон Карли

Шрифт:
XPath

Пространство имен

XPath
создается для скорости. Оно позволяет только читать документы XML без возможностей редактирования.
XPath
создается для поверхностного выполнения быстрых итераций и выбора в документе XML. Функциональность
XPath
представляется классом
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
. Делает текущей позицию, которая указана в
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
.

Поделиться с друзьями: