Partager via


Requêtes et espaces de noms XPath

Les requêtes XPath sont conscientes des espaces de noms dans un document XML et peuvent utiliser des préfixes d’espace de noms pour qualifier les noms d’éléments et d’attributs. Les noms d’éléments et d’attributs éligibles avec un préfixe d’espace de noms limitent les nœuds retournés par une requête XPath à ceux qui appartiennent à un espace de noms spécifique.

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

The XmlNamespaceManager

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

L’objet XmlNamespaceManager peut être utilisé dans la requête de chacune des façons suivantes.

Voici les méthodes de la XPathNavigator classe qui acceptent un objet dérivé de l’interface IXmlNamespaceResolver en tant que paramètre.

L'espace de noms par défaut

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

<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. En d’autres termes, seuls les préfixes mappés aux espaces de noms peuvent être utilisés dans les requêtes XPath. Cela signifie que si vous souhaitez interroger un espace de noms dans un document XML, même s’il s’agit de l’espace de noms par défaut, vous devez définir un préfixe pour celui-ci.

Par exemple, sans définir de préfixe pour le document XML ci-dessus, la requête /books/book XPath ne retournerait aucun résultat.

Un préfixe doit être lié pour prévenir toute ambiguïté lors de l’interrogation de documents avec certains nœuds qui ne se trouvent pas dans un espace de noms, alors que d’autres sont 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 book éléments de l’espace http://www.contoso.com/books de noms.

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