Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Um XPath-Abfragen mit XML-Dokumenten zu verwenden, müssen Sie XML-Namespaces und die in Namespaces enthaltenen Elemente richtig adressieren. Namespaces verhindern Mehrdeutigkeiten, die auftreten können, wenn Namen in mehr als einem Kontext verwendet werden; Beispielsweise kann der Name ID auf mehrere Bezeichner verweisen, die verschiedenen Elementen eines XML-Dokuments zugeordnet sind. Die Namespacesyntax gibt URIs, Namen und Präfixe an, die die Elemente eines XML-Dokuments unterscheiden.
Das Beispiel in diesem Thema veranschaulicht die Verwendung von Präfixen beim Navigieren in einem XML-Dokument mit XPathNavigator. Weitere Informationen zu Namespaces und Syntax finden Sie unter XML-Dateien: Grundlegendes zu XML-Namespaces.
Namespacedeklarationen
Namespace-Deklarationen machen die Elemente eines XML-Dokuments unterscheidbar und adressierbar bei Verwendung einer Instanz von XPathNavigator. Namespacepräfixe stellen eine kurze Syntax für die Adressierung von Namespaces bereit.
Präfixe werden durch das Formular definiert: <e:Envelope xmlns:e=http://schemas.xmlsoap.org/soap/envelope/>. In dieser Syntax ist das Präfix "e" eine Abkürzung für den formalen URI des Namespace. Sie können das Body Element als Mitglied des Envelope Namespaces identifizieren, indem Sie die Syntax verwenden: e:Body.
Auf das folgende XML-Dokument wird wie response.xml im Navigationsbeispiel im nächsten Abschnitt verwiesen.
<?xml version="1.0" encoding="utf-8" ?>
<e:Envelope xmlns:e="http://schemas.xmlsoap.org/soap/envelope/">
<e:Body>
<s:Search xmlns:s="http://schemas.microsoft.com/v1/Search">
<r:request xmlns:r="http://schemas.microsoft.com/v1/Search/metadata"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
</r:request>
</s:Search>
</e:Body>
</e:Envelope>
Navigation nach dem Namespace-Präfix
Der Code in diesem Abschnitt verwendet XPathNavigator und XmlNamespaceManager Objekte, um das Search Element aus dem XML-Dokument im vorherigen Abschnitt auszuwählen. Die Abfrage xpath enthält Namespacepräfixe für jedes Element im Pfad. Durch Angeben der genauen Identität der Namespaces, die jedes Element enthalten, wird die korrekte Navigation zum Search Element durch die SelectSingleNode Methode sichergestellt.
using (XmlReader reader = XmlReader.Create("response.xml"))
{
XPathDocument doc = new XPathDocument(reader);
XPathNavigator nav = doc.CreateNavigator();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(nav.NameTable);
nsmgr.AddNamespace("e", @"http://schemas.xmlsoap.org/soap/envelope/");
nsmgr.AddNamespace("s", @"http://schemas.microsoft.com/v1/Search");
nsmgr.AddNamespace("r", @"http://schemas.microsoft.com/v1/Search/metadata");
nsmgr.AddNamespace("i", @"http://www.w3.org/2001/XMLSchema-instance");
string xpath = "/e:Envelope/e:Body/s:Search";
XPathNavigator element = nav.SelectSingleNode(xpath, nsmgr);
Console.WriteLine("Element Prefix:" + element.Prefix +
" Local name:" + element.LocalName);
Console.WriteLine("Namespace URI: " + element.NamespaceURI);
}
Die Präzision vollqualifizierter Namespaces und Namen dient nicht nur der Bequemlichkeit. Ein kleines Experiment mit der Dokumentdefinition und dem Code in den vorherigen Beispielen überprüft, ob die Navigation ohne vollqualifizierte Elementnamen Ausnahmen auslöst. Beispielsweise gibt die Elementdefinition: <Search xmlns="http://schemas.microsoft.com/v1/Search"> und die Abfrage: String xpath = "/s:Envelope/s:Body/Search"; ohne das Namespacepräfix auf dem Search Element null anstelle des Search Elements zurück.