Udostępnij za pośrednictwem


Nawigowanie po dokumentach XML za pomocą klasy XPathNavigator za pomocą języka Visual C#

W tym artykule opisano sposób nawigowania po dokumentach XML za pomocą XPathNavigator obiektu utworzonego XPathDocument na podstawie obiektu.

Oryginalna wersja produktu: Visual C#
Oryginalny numer KB: 308343

Podsumowanie

Ten przykład ładuje XPathDocument obiekt z danymi XML, tworzy XPathNavigator obiekt jako widok na dane i wyświetla kod XML przez przejście przez dokument.

W tym artykule opisano następujące przestrzenie nazw biblioteki klas programu Microsoft .NET Framework:

  • System.Xml
  • System.Xml.XPath

Aby zapoznać się z wersją platformy .NET języka Microsoft Visual Basic w tym artykule, zobacz How to navigate XML with the XPathNavigator class by using Visual Basic (Jak nawigować po kodzie XML za pomocą klasy XPathNavigator przy użyciu języka Visual Basic).

Wymagania

W tym artykule założono, że znasz następujące tematy:

  • Visual C#
  • Terminologia XML
  • Tworzenie i odczytywanie pliku XML
  • Składnia języka ścieżki XML (XPath)

Jak używać klasy XPathNavigator do nawigowania po xml

  1. Utwórz nową aplikację konsolową Visual C# w programie Visual Studio.

    Uwaga 16.

    W tym przykładzie użyto pliku o nazwie Books.xml. Możesz utworzyć własny plik Books.xml lub użyć przykładu dołączonego do przewodnika Szybki start zestawu .NET Software Development Kit (SDK). Jeśli nie masz zainstalowanych przewodników Szybki start i nie chcesz ich instalować, zobacz sekcję Odwołania dla lokalizacji pobierania Books.xml . Jeśli masz zainstalowane przewodniki Szybki start, Books.xml znajduje się w następującym folderze:
    \Program Files\Microsoft.NET\FrameworkSDK\Samples\Quickstart\Howto\Samples\Xml\Transformxml\VB

    Możesz skopiować Books.xml do folderu znajdującego \Bin\Debug się w folderze, w którym utworzono ten projekt.

  2. Upewnij się, że projekt odwołuje się do System.Xml przestrzeni nazw.

  3. Użyj instrukcji using w Xml przestrzeniach nazw i XPath , aby nie trzeba było kwalifikować deklaracji w tych przestrzeniach nazw w dalszej części kodu. Instrukcję using można użyć przed innymi deklaracjami w następujący sposób:

    using System.Xml;
    using System.Xml.XPath;
    
  4. Zadeklaruj odpowiednie zmienne. Zadeklaruj XPathDocument obiekt do przechowywania dokumentu XML i XPathNavigator obiektu w celu oceny XPath wyrażeń i przechodzenia przez dokument. Zadeklaruj String obiekt do przechowywania XPath wyrażenia. Dodaj kod deklaracji w procedurze Main w module Module1.

    XPathNavigator nav;
    XPathDocument docNav;
    
  5. Załaduj XPathDocument obiekt przy użyciu przykładowego pliku Books.xml. Klasa XPathDocument używa rozszerzalnych przekształceń języka arkusza stylów (XSLT) w celu zapewnienia szybkiej i zorientowanej na wydajność pamięci podręcznej na potrzeby przetwarzania dokumentów XML. Jest on podobny do modelu DOM (XML Document Object Model), ale jest wysoce zoptymalizowany pod kątem przetwarzania XSLT i modelu danych XPath.

    // Open the XML.
    docNav = new XPathDocument(@"c:\books.xml");
    
  6. XPathNavigator Utwórz obiekt na podstawie dokumentu. XPathNavigator Umożliwia przechodzenie zarówno przez węzły atrybutów, jak i węzły przestrzeni nazw w dokumencie XML.

    // Create a navigator to query with XPath.
    nav = docNav.CreateNavigator();
    
  7. Przejdź do katalogu głównego dokumentu za pomocą MoveToRoot metody . MoveToRoot Ustawia nawigator do węzła dokumentu, który zawiera całe drzewo węzłów.

    //Initial XPathNavigator to start at the root.
    nav.MoveToRoot();
    
  8. MoveToFirstChild Użyj metody , aby przejść do elementów podrzędnych dokumentu XML. Metoda MoveToFirstChild przenosi się do pierwszego elementu podrzędnego bieżącego węzła. Jeśli istnieje źródło Books.xml , odejdziesz od dokumentu głównego do elementów podrzędnych, sekcji Komentarz i węzła Księgarnia.

    //Move to the first child node (comment field).
    nav.MoveToFirstChild();
    
  9. MoveToNext Użyj metody , aby iterować węzły na poziomie równorzędnym. Metoda MoveToNext przechodzi do następnego elementu równorzędnego bieżącego węzła.

    //Loop through all of the root nodes.
    do
    {
    } while (nav.MoveToNext());
    
  10. NodeType Użyj właściwości , aby upewnić się, że przetwarzasz tylko węzły elementów i użyj Value właściwości , aby wyświetlić reprezentację tekstu elementu.

    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. HasAttributes Użyj właściwości , aby określić, czy węzeł ma jakiekolwiek atrybuty. Możesz również użyć innych metod, takich jak MoveToNextAttribute, aby przejść do atrybutu i sprawdzić jego wartość.

    Uwaga 16.

    Ten segment kodu przechodzi tylko przez malejąco węzła głównego, a nie przez całe drzewo.

    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. ReadLine Użyj metody Console obiektu, aby dodać pauzę na końcu ekranu konsoli, aby bardziej łatwo wyświetlić powyższe wyniki.

    //Pause.
    Console.ReadLine();
    
  13. Skompiluj i uruchom projekt Visual C#.

Kompletna lista kodu

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

Rozwiązywanie problemów

Podczas testowania kodu może zostać wyświetlony następujący komunikat o błędzie wyjątku:

Wystąpił nieobsługiwany wyjątek typu System.Xml.XmlException w system.xml.dll
Dodatkowe informacje: Nieoczekiwana deklaracja XML. Deklaracja XML musi być pierwszym węzłem w dokumencie i przed nim nie mogą być wyświetlane żadne znaki odstępu. Wiersz 1, pozycja

Błąd wyjątku występuje w następującym wierszu kodu:

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

Aby rozwiązać ten problem, usuń znaki odstępu, które poprzedzają pierwszy węzeł w dokumencie books.xml.

Informacje