Навигация по узлам атрибутов и пространств имен с помощью XPathNavigator
Класс XPathNavigator предоставляет два набора методов навигации. Методы первого набора, описанные в руководстве по навигации в наборах узлов с помощью XPathNavigator, используются для навигации в наборах узлов в объекте XPathDocument или XmlDocument. Методы второго набора, рассматриваемые в этом разделе, используются для навигации в узлах атрибутов и пространств имен в объекте XPathDocument или XmlDocument.
Навигация по узлам атрибутов
Атрибуты представляют собой свойства элементов. Они не являются дочерними объектами элементов. Это различие важно отметить, поскольку методы класса XPathNavigator используются для перемещения по узлам с общим родителем, по узлам-родителям и по дочерним узлам.
Так, методы MoveToPrevious и MoveToNext не используются для перемещения с элемента на атрибут или между атрибутами. Вместо этого атрибуты имеют собственные методы навигации.
Ниже перечислены методы перемещения по атрибутам класса XPathNavigator.
Если текущий узел является элементом, то можно с помощью свойства HasAttributes определить, существуют ли атрибуты, связанные с этим элементом. Если известно, что элемент имеет атрибуты, к этим атрибутам можно обратиться с помощью нескольких методов. Чтобы получить один атрибут из элемента, используйте метод GetAttribute. Для перемещения XPathNavigator к определенному атрибуту используйте метод MoveToAttribute. Кроме того, можно осуществить перебор всех атрибутов элемента с помощью метода MoveToFirstAttribute, после чего выполняется несколько вызовов метода MoveToNextAttribute.
Примечание.
При позиционировании объекта XPathNavigator на узле атрибута или пространства имен методы MoveToChild, MoveToFirst, MoveToFirstChild, MoveToFollowing, MoveToId, MoveToNext и MoveToPrevious всегда возвращают false
и не влияют на позицию XPathNavigator. Исключениями являются методы MoveTo, MoveToParent и MoveToRoot.
Перемещение по узлам пространств имен
С каждым элементом связан набор узлов пространств имен, по одному на каждый уникальный префикс пространства имен, привязанный к URI-коду пространства имен в области для этого элемента (включая префикс XML, привязанный к пространству имен http://www.w3.org/XML/1998/namespace
, который неявно объявляется в каждом XML-документе), а также один для пространства имен по умолчанию, если он находится в области для данного элемента. Элемент является родителем каждого из этих узлов пространства имен, однако узел пространства имен не является дочерним элементом своего родительского элемента.
Так же, как и в случае с атрибутами, методы MoveToPrevious и MoveToNext не используются для перемещения с элемента на узел пространства имен или между узлами пространств имен. Вместо этого узлы пространств имен имеют собственные методы навигации.
Ниже перечислены методы перемещения по пространствам имен класса XPathNavigator.
В XML-документе всегда имеется по меньшей мере один узел пространства имен в области для любого элемента. Это узел пространства имен с префиксом xml
и URI-кодом пространства имен http://www.w3.org/XML/1998/namespace
. Чтобы получить URI-код пространства имен в области с указанным префиксом, используйте метод GetNamespace. Для перемещения объекта XPathNavigator к определенному узлу пространства имен используйте метод MoveToNamespace. Кроме того, можно осуществить перебор всех узлов пространств имен в области для элемента с помощью метода MoveToFirstNamespace, после чего выполняется несколько вызовов метода MoveToNextNamespace.
Примечание.
При позиционировании объекта XPathNavigator на узле атрибута или пространства имен методы MoveToChild, MoveToFirst, MoveToFirstChild, MoveToFollowing, MoveToId, MoveToNext и MoveToPrevious всегда возвращают false
и не влияют на позицию XPathNavigator. Исключениями являются методы MoveTo, MoveToParent и MoveToRoot.
Перечисление XPathNamespaceScope
При навигации по узлам пространств имен можно вызывать методы MoveToFirstNamespace и MoveToNextNamespace с параметром XPathNamespaceScope. Эти методы функционируют иначе, чем в тех случаях, когда они вызываются без параметров. Перечисление XPathNamespaceScope имеет значения All, ExcludeXml или Local.
Следующие примеры показывают, что пространства имен возвращаются с помощью методов MoveToFirstNamespace и MoveToNextNamespace в различных областях XML-документа.
<root>
<element1 xmlns="http://www.contoso.com" xmlns:books="http://www.contoso.com/books">
<element2 />
</element1>
</root>
Последовательность пространств имен (пространство имен, в котором располагается объектXPathNavigator после вызова метода MoveToFirstNamespace и ряда вызовов метода MoveToNextNamespace) имеет следующий вид.
При позиционировании на
element2
:xmlns:books="http://www.contoso.com/books"
,xmlns="http://www.contoso.com"
иxmlns:xml="http://www.w3.org/XML/1998/namespace"
.При позиционировании на
element1
:xmlns:books="http://www.contoso.com/books"
,xmlns="http://www.contoso.com"
иxmlns:xml="http://www.w3.org/XML/1998/namespace"
.При позиционировании на
root
:xmlns:xml="http://www.w3.org/XML/1998/namespace".
Примечание.
Класс XPathNavigator возвращает узлы пространства имен в обратном порядке документа. Поэтому MoveToFirstNamespace существенно перемещается к последнему узлу пространства имен в текущей области видимости.
Следующие примеры показывают, что пространства имен возвращаются с помощью методов MoveToFirstNamespace и MoveToNextNamespace с использованием перечисления XPathNamespaceScope, указанного в различных областях XML-документа.
<root xmlns="http://www.contoso.com" xmlns:a="http://www.contoso.com/a" xmlns:b="http://www.contoso.com/b">
<child1 xmlns="" xmlns:a="urn:a">
<child2 xmlns:c="urn:c" />
</child1>
</root>
При размещении на объекте child2
последовательность пространств имен (пространство имен, в котором располагается объект XPathNavigator после вызова метода MoveToFirstNamespace и ряда вызовов метода MoveToNextNamespace) имеет следующий вид.
All:
xmlns:c="urn:c"
,xmlns:a="urn:a"
,xmlns=""
,xmlns:b="http://www.contoso.com/b"
,xmlns:a="http://www.contoso.com/a"
,xmlns="http://www.contoso.com"
иxmlns:xml="http://www.w3.org/XML/1998/namespace"
.ExcludeXml:
xmlns:c="urn:c"
,xmlns:a="urn:a"
,xmlns=""
,xmlns:b="http://www.contoso.com/b"
,xmlns:a="http://www.contoso.com/a"
иxmlns="http://www.contoso.com"
.Local:
xmlns:c="urn:c"
.
Примечание.
Класс XPathNavigator возвращает узлы пространства имен в обратном порядке документа. Поэтому MoveToFirstNamespace существенно перемещается к последнему узлу пространства имен в текущей области видимости.