Partager via


Requêtes et espaces de noms XPath

Les requêtes XPath reconnaissent les espaces de noms d’un document XML et peuvent utiliser les préfixes d’espace de noms pour qualifier des noms d’éléments et d’attributs. Le fait de qualifier des noms d’éléments et d’attributs avec un préfixe d’espace de noms permet de limiter les nœuds retournés par une requête XPath aux nœuds qui appartiennent à un espace de noms spécifique.

Par exemple, si le préfixe books correspond à l’espace de noms http://www.contoso.com/books, la requête XPath suivante /books:books/books:book sélectionne uniquement les éléments book se trouvant dans l’espace de noms http://www.contoso.com/books.

La classe XmlNamespaceManager

Pour qu'il soit possible d'utiliser des espaces de noms dans une requête XPath, un objet dérivé de l'interface IXmlNamespaceResolver comme la classe XmlNamespaceManager est construit avec l'URI d'espace de noms et le préfixe à utiliser dans la requête XPath.

L'objet XmlNamespaceManager peut être utilisé dans la requête de chacune des manières suivantes.

Voici les méthodes de la classe XPathNavigator qui acceptent comme paramètre un objet dérivé de l'interface IXmlNamespaceResolver.

L'espace de noms par défaut

Dans le document XML suivant, l'espace de noms par défaut, avec un préfixe vide, est utilisé pour déclarer l'espace de noms http://www.contoso.com/books.

<books xmlns="http://www.contoso.com/books">  
    <book>  
        <title>Title</title>  
        <author>Author Name</author>  
        <price>5.50</price>  
    </book>  
</books>  

XPath traite le préfixe vide comme l’espace de noms null. Autrement dit, seuls les préfixes mappés à des espaces de noms peuvent être utilisés dans des requêtes XPath. Cela signifie que si vous voulez appliquer une requête à un espace de noms d'un document XML, vous devez définir un préfixe pour cet espace de noms, même si c'est l'espace de noms par défaut.

Par exemple, si aucun préfixe n’est défini pour le document XML ci-dessus, la requête XPath /books/book ne retournera aucun résultat.

Un préfixe doit être lié afin d'éviter toute ambiguïté lors de l'interrogation de documents où certains nœuds ne sont pas dans un espace de noms et certains se trouvent dans un espace de noms par défaut.

Le code suivant définit un préfixe pour l'espace de noms par défaut et sélectionne tous les éléments book de l'espace de noms http://www.contoso.com/books.

Dim document As XPathDocument = New XPathDocument("books.xml")  
Dim navigator As XPathNavigator = document.CreateNavigator()  
Dim query As XPathExpression = navigator.Compile("/books:books/books:book")  
Dim manager As XmlNamespaceManager = New XmlNamespaceManager(navigator.NameTable)  
manager.AddNamespace("books", "http://www.contoso.com/books")  
query.SetContext(manager)  
Dim nodes As XPathNodeIterator = navigator.Select(query)  
XPathDocument document = new XPathDocument("books.xml");  
XPathNavigator navigator = document.CreateNavigator();  
XPathExpression query = navigator.Compile("/books:books/books:book");  
XmlNamespaceManager manager = new XmlNamespaceManager(navigator.NameTable);  
manager.AddNamespace("books", "http://www.contoso.com/books");  
query.SetContext(manager);  
XPathNodeIterator nodes = navigator.Select(query);  

Voir aussi