使用 XPathNavigator 的属性和命名空间节点定位

XPathNavigator 类提供两组导航方法,第一组如使用 XPathNavigator 的节点集定位主题中所述,用于浏览 XPathDocumentXmlDocument 对象中的节点集。 第二组如本主题中所述,用于浏览 XPathDocumentXmlDocument 对象中的属性和命名空间节点。

浏览属性节点

属性是元素的属性,不是元素的子级。 这一区别很重要,因为用来浏览同级节点、父节点和子节点的 XPathNavigator 类的方法不同。

例如,MoveToPreviousMoveToNext 方法不用来从元素浏览到属性或在属性间浏览。 属性采用不同的浏览方法。

以下是 XPathNavigator 类的属性浏览方法。

在当前节点是元素时,可以使用 HasAttributes 方法查看是否存在任何与此元素关联的属性。 如果已知元素具有属性,有多种方法可以访问这些属性。 要从元素中检索单个属性,请使用 GetAttribute 方法。 若要将 XPathNavigator 移动到特定属性,请使用 MoveToAttribute 方法。 还可以循环访问元素的每个属性,方法是先使用 MoveToFirstAttribute 方法,然后多次调用 MoveToNextAttribute 方法。

注意

XPathNavigator 对象位于某个属性或命名空间节点上时,MoveToChildMoveToFirstMoveToFirstChildMoveToFollowingMoveToIdMoveToNextMoveToPrevious 方法始终返回 false,并对 XPathNavigator 的位置没有影响。 MoveToMoveToParentMoveToRoot 方法例外。

浏览命名空间节点

每个元素都有一组关联的命名空间节点,一个命名空间节点用于元素范围内绑定到某个命名空间 URI 的每个不同的命名空间前缀(包括绑定到 http://www.w3.org/XML/1998/namespace 命名空间的 XML 前缀,该前缀在每个 XML 文档中隐式声明),一个命名空间节点用于默认命名空间(如果处于元素范围内)。 元素是每个命名空间节点的父级;但是,命名空间节点不是其父元素的子级。

与属性相同,MoveToPreviousMoveToNext 方法不用来从元素浏览到命名空间节点或在命名空间节点间浏览。 命名空间节点采用不同的浏览方法。

以下是 XPathNavigator 类的命名空间浏览方法。

在 XML 文档中任何元素的范围内,始终至少存在一个命名空间节点。 此命名空间节点的前缀为 xml,命名空间 URI 为 http://www.w3.org/XML/1998/namespace。 要在给定特定前缀的情况下在范围内检索命名空间 URI,请使用 GetNamespace 方法。 要将 XPathNavigator 对象移至特定命名空间节点,请使用 MoveToNamespace 方法。 还可以循环访问元素范围中的每个命名空间节点,方法是先使用 MoveToFirstNamespace 方法,然后多次调用 MoveToNextNamespace 方法。

注意

XPathNavigator 对象位于某个属性或命名空间节点上时,MoveToChildMoveToFirstMoveToFirstChildMoveToFollowingMoveToIdMoveToNextMoveToPrevious 方法始终返回 false,并对 XPathNavigator 的位置没有影响。 MoveToMoveToParentMoveToRoot 方法例外。

XPathNamespaceScope 枚举

在浏览命名空间节点时,MoveToFirstNamespaceMoveToNextNamespace 方法可以使用 XPathNamespaceScope 参数调用。 这些方法的行为与未使用任何参数调用的对应方法不同。 XPathNamespaceScope 枚举包含值 AllExcludeXmlLocal

下列示例显示 MoveToFirstNamespaceMoveToNextNamespace 方法在 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 实质上移到当前在范围内的最后一个命名空间节点。

下列示例显示 MoveToFirstNamespaceMoveToNextNamespace 方法使用在 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 所处的命名空间)如下所示。

  • Allxmlns: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"

  • ExcludeXmlxmlns: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 实质上移到当前在范围内的最后一个命名空间节点。

请参阅