使用 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 的每个不同的命名空间前缀(包括绑定到 http://www.w3.org/XML/1998/namespace
命名空间的 XML 前缀,该前缀在每个 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 方法使用在 XML 文档中的不同范围内指定的 XPathNamespaceScope 枚举返回的命名空间。
<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 实质上移到当前在范围内的最后一个命名空间节点。