Verwenden von Visual C# zum Navigieren in XML-Dokumenten mit der XPathNavigator-Klasse

In diesem Artikel wird beschrieben, wie Sie in XML-Dokumenten mit einem XPathNavigator Objekt navigieren, das aus einem XPathDocument Objekt erstellt wird.

Originalversion des Produkts:   Visual C #
Ursprüngliche KB-Nummer:   308343

Zusammenfassung

In diesem Beispiel wird ein XPathDocument Objekt mit XML-Daten geladen, ein XPathNavigator Objekt als Ansicht der Daten erstellt und der XML-Code durch durchlaufen.

Dieser Artikel bezieht sich auf die folgenden Namespaces der Microsoft .NET Framework-Klassenbibliothek:

  • System.Xml
  • System.Xml.XPath

Eine Microsoft Visual Basic .NET-Version dieses Artikels finden Sie unter So wird's gemacht: Navigieren in XML mit der XPathNavigator-Klasse mithilfe von Visual Basic.

Anforderungen

In diesem Artikel wird davon ausgegangen, dass Sie mit den folgenden Themen vertraut sind:

  • Visual C #
  • XML-Terminologie
  • Erstellen und Lesen einer XML-Datei
  • XPath-Syntax (XML Path Language)

Verwenden der XPathNavigator-Klasse zum Navigieren in XML

  1. Erstellen Sie eine neue Visual C#-Konsolenanwendung in Visual Studio.

    Hinweis

    In diesem Beispiel wird eine Datei mit dem Namen Books.xml verwendet. Sie können eine eigene Books.xml-Datei erstellen oder das Beispiel verwenden, das in den Schnellstarts des .NET Software Development Kit (SDK) enthalten ist. Wenn Sie die Schnellstarts nicht installiert haben und sie nicht installieren möchten, finden Sie im Abschnitt "Verweise " den Books.xml Downloadspeicherort. Wenn Sie die Schnellstarts installiert haben, befindet sich Books.xml im folgenden Ordner:
    \Program Files\Microsoft.NET\FrameworkSDK\Samples\Quickstart\Howto\Samples\Xml\Transformxml\VB

    Sie können Books.xml in den Ordner kopieren, der \Bin\Debug sich unter dem Ordner befindet, in dem Sie dieses Projekt erstellt haben.

  2. Stellen Sie sicher, dass das Projekt auf den System.Xml Namespace verweist.

  3. Verwenden Sie die using Anweisung für die Xml Und-Namespaces XPath , damit Sie Deklarationen in diesen Namespaces später im Code nicht qualifizieren müssen. Sie können die using Anweisung wie folgt vor anderen Deklarationen verwenden:

    using System.Xml;
    using System.Xml.XPath;
    
  4. Deklarieren Sie die entsprechenden Variablen. Deklarieren Sie ein XPathDocument Objekt, das das XML-Dokument enthält, und ein XPathNavigator Objekt, um Ausdrücke auszuwerten XPath und durch das Dokument zu navigieren. Deklarieren Sie ein String Objekt, das den XPath Ausdruck enthalten soll. Fügen Sie den Deklarationscode in der Main Prozedur in Modul1 hinzu.

    XPathNavigator nav;
    XPathDocument docNav;
    
  5. Laden Sie ein XPathDocument Objekt mit der Beispieldatei Books.xml. Die XPathDocument Klasse verwendet XSLT (Extensible Stylesheet Language Transformations), um einen schnellen und leistungsorientierten Cache für die XML-Dokumentverarbeitung bereitzustellen. Es ähnelt dem XML-Dom (Document Object Model), ist jedoch für die XSLT-Verarbeitung und das XPath-Datenmodell stark optimiert.

    // Open the XML.
    docNav = new XPathDocument(@"c:\books.xml");
    
  6. Erstellen Sie ein XPathNavigator Objekt aus dem Dokument. XPathNavigator ermöglicht es Ihnen, sowohl die Attributknoten als auch die Namespaceknoten in einem XML-Dokument zu durchlaufen.

    // Create a navigator to query with XPath.
    nav = docNav.CreateNavigator();
    
  7. Wechseln zum Stamm des Dokuments mit der MoveToRoot Methode. MoveToRoot legt den Navigator auf den Dokumentknoten fest, der die gesamte Struktur von Knoten enthält.

    //Initial XPathNavigator to start at the root.
    nav.MoveToRoot();
    
  8. Verwenden Sie die MoveToFirstChild Methode, um zu den untergeordneten Elementen des XML-Dokuments zu wechseln. Die MoveToFirstChild Methode wird zum ersten untergeordneten Element des aktuellen Knotens verschoben. Wenn die Books.xml Quelle vorhanden ist, wechseln Sie vom Stammdokument in die untergeordneten Elemente, den Kommentarabschnitt und den Bookstore-Knoten.

    //Move to the first child node (comment field).
    nav.MoveToFirstChild();
    
  9. Verwenden Sie die MoveToNext Methode, um Knoten auf gleichgeordneter Ebene zu durchlaufen. Die MoveToNext Methode wechselt zum nächsten gleichgeordneten Knoten des aktuellen Knotens.

    //Loop through all of the root nodes.
    do
    {
    } while (nav.MoveToNext());
    
  10. Verwenden Sie die NodeType Eigenschaft, um sicherzustellen, dass Sie nur Elementknoten verarbeiten, und verwenden Sie die Value Eigenschaft, um die Textdarstellung des Elements anzuzeigen.

    do
    {
       //Find the first element.
       if (nav.NodeType == XPathNodeType.Element)
       {
            //Determine whether children exist.
            if (nav.HasChildren == true)
            {
                //Move to the first child.
                nav.MoveToFirstChild();
    
                //Loop through all the children.
                do
                {
                    //Display the data.
                    Console.Write("The XML string for this child ");
                    Console.WriteLine("is '{0}'", nav.Value);
                } while (nav.MoveToNext());
            }
        }
    } while (nav.MoveToNext());
    
  11. Verwenden Sie die HasAttributes Eigenschaft, um zu bestimmen, ob ein Knoten Attribute aufweist. Sie können auch andere Methoden verwenden, z MoveToNextAttribute. B. , um zu einem Attribut zu wechseln und dessen Wert zu überprüfen.

    Hinweis

    Dieses Codesegment durchläuft nur die untergeordneten Elemente des Stammknotens und nicht die gesamte Struktur.

    do
    {
       //Find the first element.
       if (nav.NodeType == XPathNodeType.Element)
       {
            //if children exist
            if (nav.HasChildren == true)
            {
                //Move to the first child.
                nav.MoveToFirstChild();
                //Loop through all the children.
                do
                {
                    //Display the data.
                    Console.Write("The XML string for this child ");
                    Console.WriteLine("is '{0}'", nav.Value);
    
                    //Check for attributes.
                    if (nav.HasAttributes == true)
                    {
                        Console.WriteLine("This node has attributes");
                    }
                } while (nav.MoveToNext());
            }
        }
    } while (nav.MoveToNext());
    
  12. Verwenden Sie die ReadLine Methode des Console Objekts, um eine Pause am Ende der Konsolenanzeige hinzuzufügen, um die oben genannten Ergebnisse besser anzuzeigen.

    //Pause.
    Console.ReadLine();
    
  13. Erstellen sie das Visual C#-Projekt, und führen Sie es aus.

Vollständige Codeauflistung

using System;
using System.Xml;
using System.Xml.XPath;

namespace q308343
{
    class Class1
    {
        static void Main(string[] args)
        {
            XPathNavigator nav;
            XPathDocument docNav;

            docNav = new XPathDocument(@"c:\books.xml");
            nav = docNav.CreateNavigator();
            nav.MoveToRoot();

            //Move to the first child node (comment field).
            nav.MoveToFirstChild();

            do
            {
                //Find the first element.
                if (nav.NodeType == XPathNodeType.Element)
                {
                    //Determine whether children exist.
                    if (nav.HasChildren == true)
                    {
                        //Move to the first child.
                        nav.MoveToFirstChild();
                        //Loop through all of the children.
                        do
                        {
                            //Display the data.
                            Console.Write("The XML string for this child ");
                            Console.WriteLine("is '{0}'", nav.Value);
                            //Check for attributes.
                            if (nav.HasAttributes == true)
                            {
                                Console.WriteLine("This node has attributes");
                            }
                        } while (nav.MoveToNext());
                    }
                }
            } while (nav.MoveToNext());
            //Pause.
            Console.ReadLine();
        }
    }
}

Problembehandlung

Wenn Sie den Code testen, wird möglicherweise die folgende Ausnahmefehlermeldung angezeigt:

Eine unbehandelte Ausnahme vom Typ System.Xml. XmlException in system.xml.dll
Zusätzliche Informationen: Unerwartete XML-Deklaration. Die XML-Deklaration muss der erste Knoten im Dokument sein, und es dürfen keine Leerzeichen vor dem Dokument angezeigt werden. Zeile 1, Position

Der Ausnahmefehler tritt in der folgenden Codezeile auf:

docNav = new XPathDocument("c:\\books.xml");

Entfernen Sie zum Beheben des Fehlers die Leerzeichen, die dem ersten Knoten im books.xml Dokument vorangestellt sind.

References