Query e spazi dei nomi XPath
Le query XPath tengono in considerazione gli spazi dei nomi in un documento XML e possono usare i prefissi degli spazi dei nomi per qualificare i nomi di elemento e di attributo. La qualifica dei nomi di elemento e di attributo con un prefisso dello spazio dei nomi limita i nodi restituiti da una query XPath ai soli nodi che appartengono a uno spazio dei nomi specifico.
Se ad esempio il mapping del prefisso books
è lo spazio dei nomi http://www.contoso.com/books
, la query XPath /books:books/books:book
seguente selezionerà solo quegli elementi book
nello spazio dei nomi http://www.contoso.com/books
.
XmlNamespaceManager
Per usare gli spazi dei nomi in una query XPath, un oggetto derivato dall'interfaccia IXmlNamespaceResolver come la classe XmlNamespaceManager viene costruito con l'URI e il prefisso dello spazio dei nomi da includere nella query XPath.
L'oggetto XmlNamespaceManager può essere usato nella query in ciascuno dei seguenti modi.
L'oggetto XmlNamespaceManager viene associato a un oggetto XPathExpression esistente mediante il metodo SetContext dell'oggetto XPathExpression. È anche possibile compilare un nuovo oggetto XPathExpression usando il metodo statico Compile, che accetta una stringa che rappresenta l'espressione XPath e un oggetto XmlNamespaceManager come parametri e restituisce un nuovo oggetto XPathExpression.
Lo stesso oggetto XmlNamespaceManager viene passato come parametro a un metodo della classe XPathNavigator che lo accetti assieme a una stringa che rappresenta l'espressione XPath.
Di seguito sono indicati i metodi della classe XPathNavigator che accettano come parametro un oggetto derivato dall'interfaccia IXmlNamespaceResolver.
Spazio dei nomi predefinito
Nel seguente documento XML lo spazio dei nomi predefinito con un prefisso vuoto viene usato per dichiarare lo spazio dei nomi 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 considera il prefisso vuoto come lo spazio dei nomi null
. In altre parole, nelle query XPath possono essere usati solo i prefissi il cui mapping corrisponde a uno spazio dei nomi. Ciò significa che, se si desidera eseguire una query relativa a uno spazio dei nomi in un documento XML, anche se si tratta dello spazio dei nomi predefinito, è necessario definire un prefisso per tale spazio dei nomi.
Ad esempio, se non si definisce un prefisso per il documento XML indicato sopra, la query XPath /books/book
non restituirà alcun risultato.
È necessario che sia associato un prefisso, per impedire ambiguità durante le operazioni di query su documenti con alcuni nodi che non rientrano in uno spazio dei nomi e alcuni nodi che rientrano in uno spazio dei nomi predefinito.
Il codice seguente definisce un prefisso per lo spazio dei nomi predefinito e seleziona tutti gli elementi book
dallo spazio dei nomi 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);