This article is currently in the process of being translated into French (~98% done).
Reading XML with the XmlReader class
Il existe principalement deux méthodes pour lire du XML avec C# : la classe XmlDocument et la classe XmlReader. XmlDocument lit le flux XML entier, le stocke en mémoire et vous permet de naviguer librement à l'intérieur, ou même de lui soumettre des requêtes en utilisant la technologie XPath.
La classe XmlReader est une alternative plus performante et consommant moins de mémoire. Elle vous permet de parcourir le flux XML élément par élément, tout en donnant accès à sa valeur, puis fait avancer la lecture à l'élément suivant. De cette manière, la consommation mémoire est extrêmement faible car seul l'élément courant y est stocké, et parce que les valeurs ne sont lues que si vous les interrogez explicitement, seuls les éléments pertinents seront interprétés, rendant l'exécution très rapide. Dans ce chapitre, nous nous concentrerons sur la classe XmlReader, et aborderons la classe XmlDocument dans le prochain chapitre.
Prenons un exemple simple où nous lisons un document XML contenant des taux de change. Heureusement pour nous, la Banque Centrale Européenne en publie un que nous pouvons utiliser. Nous pourrions le télécharger et le lire depuis le disque dur mais, en réalité, chacune des classes XmlReader et XmlDocument peut lire un flux XML depuis une URL distante aussi bien que depuis un fichier local. Vous pouvez consulter le flux XML ici (http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml) et voici quelques lignes de code accompagnées d'explications :
using System;
using System.Text;
using System.Xml;
namespace ParsingXml
{
class Program
{
static void Main(string[] args)
{
XmlReader xmlReader = XmlReader.Create("http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml");
while(xmlReader.Read())
{
if((xmlReader.NodeType == XmlNodeType.Element) && (xmlReader.Name == "Cube"))
{
if(xmlReader.HasAttributes)
Console.WriteLine(xmlReader.GetAttribute("currency") + ": " + xmlReader.GetAttribute("rate"));
}
}
Console.ReadKey();
}
}
}
On commence par créer une instance de la classe "XmlReader", avec la méthode statique "Create()" . Il y a plusieurs surcharges, mais la plus simple d'entre-elles ne requiert qu'une URL pointant sur le fichier. Ensuite, dans une boucle "while", on appelle la méthode "Read()" de l'instance du XmlReader, ce qui fait pointer celui-ci sur l'élément suivant et renvoie "true" tant qu'il reste quelque chose à lire. Dans la boucle, il suffit d'utiliser l'une ou l'autre des multiples propriétés et méthodes du XmlReader pour obtenir les données désirées de l'élément courant.
Dans notre cas, nous analysons le NodeType pour voir si nous avons un Element (la balise), et si son nom est "Cube". Comme vous pouvez le voir dans le document XML que nous avons utilisé, chaque taux de change est présent au sein d'un élément nommé Cube, donc c'est cela que nous recherchons - nous pouvons ignorer le reste. Une fois que nous avons un élément Cube, nous effectuons une vérification formelle pour voir s'il a des attributs (qu'il devrait avoir) et nous utilisons ensuite la méthode GetAttribute() pour lire la valeur des deux attributs "currency" (monnaie) et "rate" (taux). Nous les affichons à la Console et nous passons ensuite à l'élément suivant. Le résultat final devrait être une liste complète des monnaies et de leur taux de change actuel.
Comme vous pouvez le voir, c'est vraiment simple à faire, c'est surtout parce que nous récupérons les données dans l'ordre où elles sont lues, sans faire de chose sophistiquée. Dans le chapitre suivant, nous ferons la même chose en utilisant la classe XmlDocument, pour que vous remarquiez la différence.
Remarque : Vous devriez savoir que le code ci-dessus pourrait renvoyer une exception pour un certain nombre de raisons, que vous devriez bien entendu traiter. Regardez le chapitre sur les exceptions pour plus d'informations.