Le XML pour fichier de configuration?

[Résolu]
Signaler
Messages postés
339
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
25 mars 2009
-
Messages postés
339
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
25 mars 2009
-
Comme je viens de me mettre à .NET, je me suis dit que j'allais laisser tomber les vieux fichiers ini pour la configuration au profit du XML. 3 points m'ont poussé à me diriger vers le XML :
 - Le XML, c'est in
 - Le XML, c'est branché
 - Le XML, c'est la classe
Partant avec tous ces arguments -vous conviendrez- fortemment convaincants, mon application .NET doit donc utiliser un xml en guise de fichier de configuration.

Mais voilà, avec mes vieux fichiers INI, Pour écrire une valeur, il suffisait de faire f(header,variable,valeur,fichier) avec la fonction adéquate, et pour lire une valeur f(header,variable,fichier). Je pensais donc que Microsoft qui a beaucoup fait pour promouvoir ce format nous avait concocté des fonctions du même genre.

Que neni ! C'est quoi ce bordel ? Y'a 35610 façons d'ouvrir un fichier XML et 28418451 façons d'écrire dedans...

Tout ça pour en venir à ma question, si je veux utiliser le XML pour fichier de configuration, je fais comment pour récupérer la valeur d'une rubrique précise ?

(pour l'instant j'ai trouvé la méthode :
            XmlDocument config = new XmlDocument();
            config.Load(Application.StartupPath + "\\configuration.xml");

            XmlNodeList elemList = config.GetElementsByTagName("ma_rubrique");
            variable = elemList[0].InnerText;
mais ça à pas l'air très propre)

Et surtout, comment je fais pour écrire une valeur précise dans ce µ%$ de XML sans écraser tout le fichier ?

Merci

7 réponses

Messages postés
495
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
9 novembre 2007
1
en gros, tu peux faire ca, si tu veux, a mon avis c'est la facon la plus simple d'acceder a un element.

XmlDocument doc = new XmlDocument();
doc.Load(fichier_xml);

XmlNode section = doc.SelectSingleNode("root/ma_section/ma_sous_section");
// modification de la XmlNode, genre section.Name = "truc" ou autre...

doc.Save(fichier_xml);
Messages postés
495
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
9 novembre 2007
1
Oula oula, biensure que non... tu recupère un XmlNode, donc il faut faire comme ca :

XmlAttribute attr = section.Attributes["propriete1"];
if (attr != null)
val = attr.Value;

attr = section.Attributes["propriete2"];
if (attr != null)
val = attr.Value;

tu peux aussi faire :

foreach (XmlAttribute current_attr in section.Attributes)
// traitement de l'attribut current_attr

Si tu utilise un IDE qui te permet de voir le contenu d'un objet lorsque tu tappe . (point)
(VisualStudio, Eclipse, SharpDevelop, etc...) dans ce cas je te conseil de bien regarde le contenu de la class XmlNode, elle recèlle plusieurs trucs très interessant :)
Messages postés
231
Date d'inscription
lundi 27 novembre 2000
Statut
Membre
Dernière intervention
7 juillet 2008
3
Salut cher ami
essaye ce bout de code


XmlDocument xmlDoc= new XmlDocument();


xmlDoc.Load(Application.StartupPath +"\\Configuration.xml");


XmlNodeReader xnr= new XmlNodeReader(xmlDoc);


ds=new DataSet() ;


ds.ReadXml(xnr); // à ce stade votre DataSet est rempli et ainsi vous pouvez effectuer vos modification
                                // soit ajouter ou modifier ou supprimer
                                // Exemple 
 ds.Tables["Numero du DataTable"].Rows["Numéro de ligne"][
"Nom Colonne"]= "Visual Studio 2005";
                               
                                //Numéro de ligne signifie le numero de la ligne dans la table
                                // il faut savoire que le DataSet contient des DataTable



 
String

 Chaine=  ds.Tables["Numero du DataTable"].Rows["Numéro de ligne"][
"Nom Colonne"].ToString():
 
Messages postés
339
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
25 mars 2009
5
Ta fonction marche seb.

Par contre, doc.Load charge tout le fichier XML en mémoire non ? Là ca va parceque j'ai un ptit XML de configuration, mais pour les grosses applis, ca ne pose pas de problème?

Quant aux Datasets, je ne vais pas y toucher pour le moment, m'ai j'essayerai quand meme la deuxième solution proposée par curiosité ;o

Merci :>
Messages postés
495
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
9 novembre 2007
1
quand tu ouvre un fichier XML de plusieurs Mega avec Internet Explorer (pour le visualiser) il faut bien qu'il charge tout. Parfois c'est un peu lent si le fichier est vraiment massif, mais je ne vois pas en quoi ca pose un probleme :)
Messages postés
339
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
25 mars 2009
5
Non, ce que je veux dire, c'est qu'il pourrait lire le fichier XML au fur et à mesure sans tout charger dans la RAM. Bon ok je chipotte :p

Un autre truc me chagrine, c'est le OuterXml. En gros, avec ta méthode, c'est super je peux récupérer simplement la string entre les balises via

XmlNode section = doc.SelectSingleNode("root/ma_section/ma_sous_section");
section.InnerText

Mais si j'ai une balise de type

<hello propriete1="ok" propriete2="ko"/>

La seule façon que j'ai trouvé de récupérer les attributs ok et ko, c'est d'utiliser
XMLNode.OuterXml et de traiter toute la chaine de caractère "hello propriete1="ok" propriete2="ko"" à grands coups de splits et autres. Bref, c'est pas joli joli. Y'a t-il une autre méthode?
Messages postés
339
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
25 mars 2009
5
Ah c'est donc planqué dans Attributes ^^

Merci :>

Effectivement j'utilise un IDE et j'avais tenté de trouvé moi meme ou se trouvaient ces données avec le debugger de Visual Studio. Et le seul endroit où j'ai trouvé qu'on pouvait récupérer les données, c'était dans OuterXml. Je devais pas être bien reveillé/