Freigeben über


XPath-Abfragen und Namespaces

XPath-Abfragen unterstützen Namespaces in einem XML-Dokument und können Namespacepräfixe zum Kennzeichnen von Element- und Attributnamen verwenden. Durch das Kennzeichnen von Element- und Attributnamen mit einem Namespacepräfix wird die Anzahl der von einer XPath-Abfrage zurückgegebenen Knoten auf die Knoten beschränkt, die zu einem bestimmten Namespace gehören.

Wenn z. B. das Präfix books dem Namespace http://www.contoso.com/books zugeordnet ist, wählt die folgende XPath-Abfrage /books:books/books:book nur die book-Elemente im Namespace http://www.contoso.com/books aus.

Der XmlNamespaceManager

Um Namespaces in einer XPath-Abfrage zu verwenden, wird ein von der IXmlNamespaceResolver-Schnittstelle abgeleitetes Objekt wie die XmlNamespaceManager-Klasse mit dem Namespace-URI und -präfix erstellt, die in die XPath-Abfrage eingefügt werden sollen.

Das XmlNamespaceManager-Objekt kann in der Abfrage auf eine der folgenden Arten verwendet werden:

Im Folgenden finden Sie eine Auflistung der Methoden der XPathNavigator-Klasse, die ein von der IXmlNamespaceResolver-Schnittstelle abgeleitetes Objekt als Parameter akzeptieren.

Der Standardnamespace

Im folgenden XML-Dokument wird der Standardnamespace mit einem leeren Präfix für die Deklaration des http://www.contoso.com/books-Namespaces verwendet.

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

XPath behandelt das leere Präfix als null-Namespace. Mit anderen Worten: In XPath-Abfragen können nur Präfixe verwendet werden, die Namespaces zugeordnet sind. Das bedeutet, dass Sie ein Präfix definieren müssen, wenn Sie einen Namespace in einem XML-Dokument abfragen möchten, auch wenn es sich um den Standardnamespace handelt.

Ohne die Definition eines Präfixes für das obige XML-Dokument gibt z. B. die XPath-Abfrage /books/book kein Ergebnis zurück.

Ein Präfix muss gebunden sein, um Mehrdeutigkeit beim Abfragen von Dokumenten zu vermeiden, die einige Knoten außerhalb der Namespaces sowie einige Knoten in einem Standardnamespace enthalten.

Im folgenden Code wird ein Präfix für den Standardnamespace definiert, und alle book-Elemente aus dem http://www.contoso.com/books-Namespace werden ausgewählt.

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);  

Siehe auch