Paramètres simples d’application en XML

En dehors de l’utilisation de la section AppSettings d’un fichier de configuration standard de .NET, il m’arrive à l’occasion de devoir ajouter la gestion de paramètres dans une application. Pour des paramètres simples et facilement modifiables par un utilisateur, j’utilise habituellement une table de paramètres dans la base de données.

Cette table a une structure similaire à ceci :
image

http://www.draw.io

Lorsque je dois créer des structures complexes de paramètres, il arrive que je décide de ne pas créer d’élément de base de données pour les gérer. (Surtout si ces paramètres sont rarement modifiés)
Ceci dans le but d’éviter d’avoir une structure de tables complexe et non liée à la logique d’affaire dans la base de données.

Dans ce cas, je crée un fichier XML qui contiendra toutes les valeurs des paramètres.

Prenons l’exemple d’une application qui doit ouvrir des fichiers et selon un des 3 types de données dans ce fichier, doit faire un remplacement d’une valeur par une autre.
Dans cette situation, je pourrais utiliser une classe paramètre qui contient 3 liste d’objets.

  1. Une liste d’objet “RemplacementChaine” qui contient des chaînes de caractère et leur remplaçant.
  2. Une liste d’objet “RemplacementEntier” qui contient des valeurs de remplacements pour des nombres dans une certaine plage
  3. Une liste d’objet “RemplacementDate” qui contient des valeurs de remplacement pour certaines dates
public class RemplacementChaine
{
public string Valeur { get; set; }
public string Remplacement { get; set; }
}
public class RemplacementEntier
{
public int PlageMin { get; set; }
public int PlageMax { get; set; }
public int Remplacement { get; set; }
}
public class RemplacementDate
{
public DateTime Valeur { get; set; }
public DateTime Remplacement { get; set; }
}
public class Parametres
{
public List<RemplacementChaine> ListeRemplacementChaine { get; set; }
public List<RemplacementEntier> ListeRemplacementEntier { get; set; }
public List<RemplacementDate> ListeRemplacementDate { get; set; }

}

Comment générer le fichier XML qui permettra de contenir les informations ?
Vous pouvez essayer de le faire à la main ou utiliser le framework.Net !

La classe XmlSerializer permet justement de sérialiser en XML. (Comme son nom l’indique)

Pour créer mon fichier paramètre, je peux utiliser la méthode ci-dessous :

public static void Enregistrer(string cheminFichierXml,Parametres parametres)
{
XmlSerializer serializer = new XmlSerializer(typeof(Parametres));
FileStream fs = new FileStream(cheminFichierXml, FileMode.Create);
serializer.Serialize(fs, parametres);
fs.Close();
}

Pour lire le contenu du fichier, je peux utiliser la méthode ci-dessous :

public static Parametres Lire(string cheminFichierXml)
{
XmlSerializer serializer = new XmlSerializer(typeof(Parametres));
FileStream fs = new FileStream(cheminFichierXml, FileMode.Open);
var parametres = (Parametres)serializer.Deserialize(fs);
fs.Close();
return parametres;
}

De plus, le code de génération d’un fichier exemple peut être présent dans un test désactivé (avec l’attribut Ignore).
Pour créer le fichier, il suffit d’enlever l’attribut Ignore et exécuter le test.

[TestMethod]
[Ignore]
public void GenerationFichierParametres()
{
Parametres parametres = new Parametres();
parametres.ListeRemplacementChaine = new System.Collections.Generic.List<RemplacementChaine>();
parametres.ListeRemplacementChaine.Add(new RemplacementChaine { Valeur = "A", Remplacement = "B" });

parametres.ListeRemplacementEntier = new System.Collections.Generic.List<RemplacementEntier>();
parametres.ListeRemplacementEntier.Add(new RemplacementEntier { PlageMin = 1, PlageMax = 7, Remplacement = 4 });

parametres.ListeRemplacementDate = new System.Collections.Generic.List<RemplacementDate>();
parametres.ListeRemplacementDate.Add(new RemplacementDate
{
Valeur = new DateTime(1997, 1, 2),
Remplacement = new DateTime(1998, 1, 1)
});

Parametres.Enregistrer(@"c:\temp\parametres.xml", parametres);

}

Le fichier généré sera le suivant :

<?xml version="1.0"?>
<Parametres xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ListeRemplacementChaine>
<RemplacementChaine>
<Valeur>A</Valeur>
<Remplacement>B</Remplacement>
</RemplacementChaine>
</ListeRemplacementChaine>
<ListeRemplacementEntier>
<RemplacementEntier>
<PlageMin>1</PlageMin>
<PlageMax>7</PlageMax>
<Remplacement>4</Remplacement>
</RemplacementEntier>
</ListeRemplacementEntier>
<ListeRemplacementDate>
<RemplacementDate>
<Valeur>1997-01-02T00:00:00</Valeur>
<Remplacement>1998-01-01T00:00:00</Remplacement>
</RemplacementDate>
</ListeRemplacementDate>
</Parametres>