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:
Das XmlNamespaceManager-Objekt wird mithilfe der XPathExpression-Methode des SetContext-Objekts einem vorhandenen XPathExpression-Objekt zugeordnet. Sie können auch mithilfe der statischen XPathExpression-Methode ein neues Compile-Objekt kompilieren, das eine den XPath-Ausdruck darstellende Zeichenfolge und ein XmlNamespaceManager-Objekt als Parameter akzeptiert und ein neues XPathExpression-Objekt zurückgibt.
Das XmlNamespaceManager-Objekt selbst wird zusammen mit einer den XPath-Ausdruck darstellenden Zeichenfolge als Parameter an eine akzeptierende Methode der XPathNavigator-Klasse übergeben.
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);