|
Partie 1
Sources de l'article
Objectifs
Le framework .NET dispose d'une classe
" ConfigurationSettings " dans l'espace de noms "System.Configuration"
qui permet de récupérer des paramètres de configuration
dans un fichier nommé "App.Config", lorsqu'il s'agit
d'une application Windows ou "Web.Config" pour une application
Web.
Dans ce fichier au format XML, on ajoute des clés et des valeurs
dans le but de les récupérer au travers de l'objet "ConfigurationSettings"
et de sa propriété AppSettings.
Exemple :
AppConfig
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="dossier_exercices" value="C:\exo\questions"/>
<add key="dossier_corrections" value="C:\exo\corrections"/>
</appSettings>
</configuration>
|
| using System.Configuration;
// Récupération des valeurs des clés du fichier
app.config en C#
String strFolderExo = ConfigurationSettings.AppSettings["dossier_exercices"];
String strFolderRep = ConfigurationSettings.AppSettings["dossier_corrections"];
|
Ce fichier de paramétrage et cet objet sont très
pratique et malheureusement le .Net Compact Framework n'en dispose pas.
Qu'à cela ne tienne nous allons recréé un fichier
XML de configuration et une classe CommonAppManager afin de combler ce
manque.
Cet exercice nous permettra d'aborder l'espace de nom System.Xml et l'utilisation
de la classe XmlTextReader.
L'exercice consiste à utiliser la base de données SQL Server
CE "prospect.sdf" générée à l'aide
de l'application de l'article
précédent (ADO.NET et SQLServer CE) et de lire les données
de la table contact en s'appuyant sur un fichier de configuration au format
XML nommé "AppManager.config".
Dans ce fichier XML, nous allons intégrer
la chaîne de connexion à la base de données et une
requête en base. Chaque balise est constituée d'un nom et
de deux attributs (name et value).
Constitution
du fichier AppManager.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<strConnectionString name="client" value="prospect.sdf"/>
<sqlRequest>
<clientRequest name="select_from_contact" value="select * from contact" />
</sqlRequest>
</configuration>
|
Manipuler
du XML avec le .NET Compact Framework
Pourquoi utiliser XmlTextReader plutôt que DOM
?
Le support de l'API DOM (Document Object Model) est
assuré, mais son utilisation peut s'avérer dangereuse pour
les performances. DOM est basé sur le concept de l'arbre généalogique.
Chaque nud du document XML représente une branche de l'arbre
et est chargé en mémoire. Le parcours du document se fait
ensuite en navigant entre les nud père et fils dans les 2
sens de l'arbre (en remontant ou en descendant). L'approche est simple
et efficace mais présente l'inconvénient d'être très
consommatrice en ressource mémoire, puisque l'ensemble du document
XML est chargée en mémoire. De plus, les requêtes
Xpath ne sont pas supportés par le .Net Compact Framework.
Dans notre cas, le fichier XML est petit, mais lorsque celui-ci atteint
plusieurs dizaines de Ko, la mémoire du Pocket PC commence à
être sollicitée
Pour résoudre ce problème, on peut utiliser la classe XMLTextReader
de l'espace de nom System.Xml qui est également fourni dans le
.NET Compact Framework. L'approche est différente car la lecture
ce fait nud par nud. Quand un nud fils est atteint ses
ancêtres ont été analysés mais ne sont pas
chargés en mémoire. Le gain en ressource mémoire
par rapport à l'approche DOM est considérable.
Manipuler
la classe XmlTextReader
Pour simuler le comportement de App.config, l'idée
est de construire une classe CommonAppManager qui comporte 2 méthodes
publiques permettant de récupérer des données du
fichier XML "AppManager.Config"
GetConnectionString
Cette méthode prend en paramètre la valeur de l'attribut
" name " et renvoi la valeur de l'attribut " value ",
correspondant à la chaîne de connexion à la base de
données SQL Server CE.
GetClientRequestValue
Cette méthode prend en paramètre la valeur de l'attribut
" name ", et renvoi la valeur de l'attribut " value ",
correspondant à une requête à passer.
Pour travailler avec la classe XmlTextReader, il faut
utiliser l'espace de nom System.Xml :
Ensuite, il faut instancier la classe XmlTextReader,
en passant le fichier AppManager.Config (FileStream) en paramètre
du constructeur.
XmlTextReader txtReader = null;
FileStream fic = null;
fic = new FileStream(configFile, FileMode.Open,
FileAccess.ReadWrite, FileShare.ReadWrite);
txtReader = new XmlTextReader(fic);
|
Une fois l'objet créé l'analyse du document
XML peut commencer. Les nuds du document sont traité un par
un à l'aide de la méthode "Read".
On vérifie ensuite le type de nud et s'il
s'agit d'un élement, on vérifie son nom et le nom de son
attribut name pour savoir s'il correspond au nud à traiter.
Si c'est le cas on récupère grâce à la méthode
"GetAttribute", la valeur de l'attribut "value".
while (txtReader.Read())
{
XmlNodeType nType = txtReader.NodeType;
if( nType == XmlNodeType.Element)
{
if (txtReader.Name.Equals(nodeName) &&
txtReader.GetAttribute("name").Equals(elementName))
{
strValue = txtReader.GetAttribute("value");
txtReader.Close();
return strValue;
}
}
}
|
Laurent
Nyffels
|