Le premier site francophone dédié au développement Pocket PC

.NET Compact Framework et XML
Auteur
Laurent Nyffels
Date 18 novembre 2002
 
   


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 nœud 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 nœud 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 nœud par nœud. Quand un nœud 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 :

using 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 nœuds du document sont traité un par un à l'aide de la méthode "Read".

On vérifie ensuite le type de nœud 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 nœud à 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

 
   

Copyright 2001-2004 - Tous droits réservés
Toutes les autres marques et produits présents dans ces pages sont la propriété exclusive de leurs sociétés respectives.