Partager via


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

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

Version du produit d’origine : Visual C#
Numéro de 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 qu’affichage 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 Comment naviguer en XML avec la classe XPathNavigator à l’aide de Visual Basic.

Spécifications

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.

    Note

    Cet exemple utilise un fichier nommé Books.xml. Vous pouvez créer votre propre fichier Books.xml , ou vous pouvez utiliser l’exemple inclus dans les guides de démarrage rapide 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échargement Books.xml . Si les démarrages rapides 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 situé sous le dossier dans lequel vous avez créé ce projet.

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

  3. Utilisez l’instruction using sur les espaces de noms et XPath les Xml espaces de noms afin que vous ne soyez pas obligé de qualifier les déclarations dans ces espaces de noms plus loin 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 XPath les 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 fichier Books.xml. La XPathDocument classe utilise des transformations XSLT (Extensible Stylesheet Language Transformations) pour fournir un cache rapide et orienté performances pour le traitement des 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 passer aux enfants du document XML. La MoveToFirstChild méthode passe au premier enfant du nœud actuel. S’il existe la source Books.xml , vous vous éloignez du document racine vers les enfants, la section Commentaires 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 niveau 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.

    Note

    Ce segment de code décrit uniquement les descendants du nœud racine et non 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 pour afficher plus facilement les résultats ci-dessus.

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

Listing du code complet

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

Dépannage

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

Une exception non gérée 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 avant 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 caractères d’espace blanc qui précèdent le premier nœud du document books.xml.

References