Freigeben über


XPath-Abfragen und Namespaces

XPath-Abfragen kennen Namespaces in einem XML-Dokument und können Namespacepräfixe verwenden, um Element- und Attributnamen zu qualifizieren. Qualifizierende Element- und Attributnamen mit einem Namespacepräfix beschränken die von einer XPath-Abfrage zurückgegebenen Knoten auf nur die Knoten, die zu einem bestimmten Namespace gehören.

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

The 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 dem Präfix erstellt, das in die XPath-Abfrage eingeschlossen werden soll.

Das XmlNamespaceManager Objekt kann in der Abfrage auf jede der folgenden Arten verwendet werden.

Im Folgenden sind die Methoden der XPathNavigator Klasse aufgeführt, 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 verwendet, um den http://www.contoso.com/books Namespace zu deklarieren.

<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, nur Präfixe, die Namespaces zugeordnet sind, können in XPath-Abfragen verwendet werden. Dies bedeutet: Wenn Sie einen Namespace in einem XML-Dokument abfragen möchten, auch wenn es sich um den Standardnamespace handelt, müssen Sie dafür ein Präfix definieren.

Ohne z. B. ein Präfix für das oben genannte XML-Dokument zu definieren, gibt die XPath-Abfrage /books/book keine Ergebnisse zurück.

Ein Präfix muss gebunden werden, um Mehrdeutigkeiten zu vermeiden, wenn Dokumente abgefragt werden, bei denen einige Knoten nicht in einem Namespace sind und andere in einem Standard-Namespace.

Der folgende Code definiert ein Präfix für den Standardnamespace und wählt alle book Elemente aus dem http://www.contoso.com/books Namespace aus.

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