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
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.Assurez-vous que le projet fait référence à l’espace de
System.Xml
noms .Utilisez l’instruction
using
sur lesXml
espaces de noms etXPath
afin de ne pas avoir à qualifier les déclarations dans ces espaces de noms ultérieurement dans votre code. Vous pouvez utiliser l’instructionusing
avant toute autre déclaration, comme suit :using System.Xml; using System.Xml.XPath;
Déclarez les variables appropriées. Déclarez un
XPathDocument
objet pour contenir le document XML et unXPathNavigator
objet pour évaluer desXPath
expressions et parcourir le document. Déclarez unString
objet pour contenir l’expressionXPath
. Ajoutez le code de déclaration dans laMain
procédure dans Module1.XPathNavigator nav; XPathDocument docNav;
Chargez un
XPathDocument
objet avec l’exemple de fichierBooks.xml. LaXPathDocument
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");
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();
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();
Utilisez la
MoveToFirstChild
méthode pour accéder aux enfants du document XML. LaMoveToFirstChild
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();
Utilisez la
MoveToNext
méthode pour itérer au sein des nœuds au niveau frère. LaMoveToNext
méthode passe au frère suivant du nœud actuel.//Loop through all of the root nodes. do { } while (nav.MoveToNext());
Utilisez la
NodeType
propriété pour vous assurer que vous traitez uniquement les nœuds d’élément et utilisez laValue
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());
Utilisez la
HasAttributes
propriété pour déterminer si un nœud a des attributs. Vous pouvez également utiliser d’autres méthodes, telles queMoveToNextAttribute
, 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());
Utilisez la
ReadLine
méthode de l’objetConsole
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();
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
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour