Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
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.Upewnij się, że projekt odwołuje się do
System.Xml
przestrzeni nazw.Użyj instrukcji
using
wXml
przestrzeniach nazw iXPath
, 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;
Zadeklaruj odpowiednie zmienne. Zadeklaruj
XPathDocument
obiekt do przechowywania dokumentu XML iXPathNavigator
obiektu w celu ocenyXPath
wyrażeń i przechodzenia przez dokument. ZadeklarujString
obiekt do przechowywaniaXPath
wyrażenia. Dodaj kod deklaracji w procedurzeMain
w module Module1.XPathNavigator nav; XPathDocument docNav;
Załaduj
XPathDocument
obiekt przy użyciu przykładowego pliku Books.xml. KlasaXPathDocument
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");
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();
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();
MoveToFirstChild
Użyj metody , aby przejść do elementów podrzędnych dokumentu XML. MetodaMoveToFirstChild
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();
MoveToNext
Użyj metody , aby iterować węzły na poziomie równorzędnym. MetodaMoveToNext
przechodzi do następnego elementu równorzędnego bieżącego węzła.//Loop through all of the root nodes. do { } while (nav.MoveToNext());
NodeType
Użyj właściwości , aby upewnić się, że przetwarzasz tylko węzły elementów i użyjValue
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());
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 jakMoveToNextAttribute
, 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());
ReadLine
Użyj metodyConsole
obiektu, aby dodać pauzę na końcu ekranu konsoli, aby bardziej łatwo wyświetlić powyższe wyniki.//Pause. Console.ReadLine();
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.