Utiliser Visual C# pour parcourir des documents XML avec la classe XPathNavigator

Cet article explique comment naviguer dans des documents XML avec un XPathNavigator objet créé à partir d’un XPathDocument objet .

Version d’origine du produit : Visual C#
Numéro de la base de connaissances d’origine : 308343

Résumé

Cet exemple charge un XPathDocument objet avec des données XML, crée un XPathNavigator objet en tant que vue sur les données et affiche le code XML en parcourant le document.

Cet article fait référence aux espaces de noms de bibliothèque de classes Microsoft .NET Framework suivants :

  • System.Xml
  • System.Xml.XPath

Pour obtenir une version Microsoft Visual Basic .NET de cet article, consultez Guide pratique pour naviguer dans XML avec la classe XPathNavigator à l’aide de Visual Basic.

Configuration requise

Cet article suppose que vous êtes familiarisé avec les rubriques suivantes :

  • Visual C#
  • Terminologie XML
  • Création et lecture d’un fichier XML
  • Syntaxe XPath (XML Path Language)

Comment utiliser la classe XPathNavigator pour naviguer dans XML

  1. Créez une application console Visual C# dans Visual Studio.

    Remarque

    Cet exemple utilise un fichier nommé Books.xml. Vous pouvez créer votre propre fichier Books.xml ou utiliser l’exemple inclus dans les démarrages rapides du Kit de développement logiciel (SDK) .NET. Si vous n’avez pas installé les guides de démarrage rapide et que vous ne souhaitez pas les installer, consultez la section Références pour l’emplacement de téléchargementBooks.xml . Si les guides de démarrage rapide sont installés, Books.xml se trouve dans le dossier suivant :
    \Program Files\Microsoft.NET\FrameworkSDK\Samples\Quickstart\Howto\Samples\Xml\Transformxml\VB

    Vous pouvez copier Books.xml dans le \Bin\Debug dossier qui se trouve sous le dossier dans lequel vous avez créé ce projet.

  2. Assurez-vous que le projet fait référence à l’espace de System.Xml noms .

  3. Utilisez l’instruction using sur les Xml espaces de noms et XPath afin de ne pas avoir à qualifier les déclarations dans ces espaces de noms ultérieurement dans votre code. Vous pouvez utiliser l’instruction using avant toute autre déclaration, comme suit :

    using System.Xml;
    using System.Xml.XPath;
    
  4. Déclarez les variables appropriées. Déclarez un XPathDocument objet pour contenir le document XML et un XPathNavigator objet pour évaluer des XPath expressions et parcourir le document. Déclarez un String objet pour contenir l’expression XPath . Ajoutez le code de déclaration dans la Main procédure dans Module1.

    XPathNavigator nav;
    XPathDocument docNav;
    
  5. Chargez un XPathDocument objet avec l’exemple de fichierBooks.xml. La XPathDocument classe utilise XSLT (Extensible Stylesheet Language Transformations) pour fournir un cache rapide et orienté performances pour le traitement de documents XML. Il est similaire au modèle DOM (Document Object Model) XML, mais est hautement optimisé pour le traitement XSLT et le modèle de données XPath.

    // Open the XML.
    docNav = new XPathDocument(@"c:\books.xml");
    
  6. Créez un XPathNavigator objet à partir du document. XPathNavigator vous permet de parcourir les nœuds d’attributs et les nœuds d’espace de noms dans un document XML.

    // Create a navigator to query with XPath.
    nav = docNav.CreateNavigator();
    
  7. Accédez à la racine du document avec la MoveToRoot méthode . MoveToRoot définit le navigateur sur le nœud de document qui contient l’arborescence entière des nœuds.

    //Initial XPathNavigator to start at the root.
    nav.MoveToRoot();
    
  8. Utilisez la MoveToFirstChild méthode pour accéder aux enfants du document XML. La MoveToFirstChild méthode se déplace vers le premier enfant du nœud actuel. S’il existe la sourceBooks.xml , vous quittez le document racine pour les enfants, la section Commentaire et le nœud Bookstore.

    //Move to the first child node (comment field).
    nav.MoveToFirstChild();
    
  9. Utilisez la MoveToNext méthode pour itérer au sein des nœuds au niveau frère. La MoveToNext méthode passe au frère suivant du nœud actuel.

    //Loop through all of the root nodes.
    do
    {
    } while (nav.MoveToNext());
    
  10. Utilisez la NodeType propriété pour vous assurer que vous traitez uniquement les nœuds d’élément et utilisez la Value propriété pour afficher la représentation textuelle de l’élément.

    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. Utilisez la HasAttributes propriété pour déterminer si un nœud a des attributs. Vous pouvez également utiliser d’autres méthodes, telles que MoveToNextAttribute, pour passer à un attribut et inspecter sa valeur.

    Remarque

    Ce segment de code passe uniquement par les descendants du nœud racine et non par l’arborescence entière.

    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. Utilisez la ReadLine méthode de l’objet Console pour ajouter une pause à la fin de l’affichage de la console afin d’afficher plus facilement les résultats ci-dessus.

    //Pause.
    Console.ReadLine();
    
  13. Générez et exécutez le projet Visual C#.

Liste complète du code

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

Résolution des problèmes

Lorsque vous testez le code, vous pouvez recevoir le message d’erreur d’exception suivant :

Exception non prise en charge de type System.Xml. XmlException s’est produite dans system.xml.dll
Informations supplémentaires : Déclaration XML inattendue. La déclaration XML doit être le premier nœud du document et aucun espace blanc n’est autorisé à apparaître devant celui-ci. Ligne 1, position

L’erreur d’exception se produit sur la ligne de code suivante :

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

Pour résoudre l’erreur, supprimez les espaces blancs qui précèdent le premier nœud du document books.xml.

References