C# – Consommation d'un fichier XML

Ceci est un exemple implémentant un exemple de consommation de flux de données XML en C#. Vous pourrez comparer par vous-mêmes avec des programmes équivalents dans les langages que vous connaissez.

Notre programme consommera le contenu d'un flux XML et l'affichera avec une indentation en reflétant la structure. Remarquez le recours aux outils de l'espace nommé System.Xml. Cet espace nommé sert apparemment beaucoup dans les applications Silverlight.

Une classe représentant une indentation (ci-dessous) sera utilisée, et sera susceptible d'être initialisée avec un facteur d'indentation choisi par le code client. La classe IndentationIllégale (à droite) représente l'exception qui sera levée si le facteur choisi par le code client est incorrect (par exemple, s'il est négatif).

using System;
using System.Xml;

namespace ConsommerXML
{
   public class IndentationIllégale
      : Exception
   {
      public IndentationIllégale(int val)
         : base(string.Format("Indentation illégale: {0}", val))
      {
      }
   }

La classe Indentation représente un niveau d'indentation, le symbole à utiliser pour indenter (typiquement, des espaces) et le facteur par lequel indenter (de un symbole, deux symboles, trois, quatre...).

Pour fins d'optimisation, la représentation du texte à utiliser pour indenter ne sera générée que si le niveau d'indentation change. La propriété Valeur exposera ce texte.

On augmente le niveau d'indentation avec Augmenter() et on le réduit avec Réduire(). Ces appels encapsulent la reconstruction du texte servant de préfixe lors d'une indentation.

   public class Indentation
   {
      private const int INDENT_SIZE_DÉFAUT = 3;
      private const char INDENT_SYMBOL_DÉFAUT = ' ';
      private string rep;
      private int val;
      private int indentSize;
      private char indentSymbol;
      private string GénérerRep()
      {
         return new string(indentSymbol, val * indentSize);
      }
      public Indentation(int indSz, char indSym)
      {
         if (indSz < 0)
            throw new IndentationIllégale(indSz);
         val = 0;
         indentSymbol = indSym;
         indentSize = indSz;
         rep = GénérerRep();
      }
      public Indentation(int indSz)
         : this(indSz, INDENT_SYMBOL_DÉFAUT)
      {
      }
      public Indentation()
         : this(INDENT_SIZE_DÉFAUT, INDENT_SYMBOL_DÉFAUT)
      {
      }
      public void Augmenter()
      {
         ++val;
         rep = GénérerRep();
      }
      public void Réduire()
      {
         --val;
         rep = GénérerRep();
      }
      public string Valeur
      {
         get
         {
            return rep;
         }
      }
   }

Le programme à proprement dit instancie un XmlReader à partir d'une méthode de fabrication (Create()), prenant ici une URL menant vers un fichier XML. La classe XmlReader peut consommer de vastes quantités de données et utilise de manière sous-jacente des techniques susceptibles de provoquer des fuites de données; lisez attentivement la documentation en ligne avant de l'utiliser dans des projets commerciaux pour vous assurer d'en faire bon usage.

Nous itérons ici à l'aide d'une sorte d'énumérateur, puis nous posons des gestes en fonction du type de noeud XML consommé. Des techniques d'optimisation simples pourraient rendre ce code plus flexible et moins « au cas par cas ».

   class Program
   {
      static void Main(string[] args)
      {
         Indentation ind = new Indentation();
         try
         {
            XmlReader lecteur =
               XmlReader.Create("http://h-deb.clg.qc.ca/UdeS/EBD/Prof-00.xml");
            while (lecteur.Read())
            {
               switch (lecteur.NodeType)
               {
                  case XmlNodeType.Element:
                     ind.Augmenter();
                     Console.WriteLine("{0}Nom: {1}",
                                       ind.Valeur, lecteur.Name);
                     break;
                  case XmlNodeType.Text:
                     ind.augmenter();
                     Console.WriteLine("{0}Valeur: {1}",
                                       ind.Valeur, lecteur.Value);
                     ind.Réduire();
                     break;
                  case XmlNodeType.XmlDeclaration:
                  case XmlNodeType.ProcessingInstruction:
                     Console.WriteLine("{0}Nom: {1}, Valeur: {2}",
                                       ind.Valeur, lecteur.Name, lecteur.Value);
                     break;
                  case XmlNodeType.Comment:
                     Console.WriteLine("{0}Commentaire: \"{1}\"",
                                       ind.Valeur, lecteur.Value);
                     break;
                  case XmlNodeType.EndElement:
                     ind.Réduire();
                     break;
               }
            }
         }
         catch (XmlException e)
         {
            Console.WriteLine("Exception XML: {0}", e);
         }
      }
   }
}

Valid XHTML 1.0 Transitional

CSS Valide !