Lire un fichier .xml

Résolu
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 - 11 juil. 2007 à 20:12
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 - 15 juil. 2007 à 22:28
Bonjour à tous,

Etant un débutant je me posais la question suivante :
Est-il possible de lire des données dans un fichier xml à une endroit précis et de rentrer chaque valeur dans un textbox différent?

Mon fichier .xml :

<?xml version="1.0" encoding="utf-8" ?>
<Fournisseur>
  <Nom1>f1</Nom1>
  <Nom2>f2</Nom2>
  <Nom3>f3</Nom3>
</Forunisseur>

Je voudrais récuperer f1, f2 et f3 et les inscrire dans 3 textBox...

La source pour la lecture de fichier .xml : http://www.codyx.org/snippet_lire-fichier-xml_186.aspx

Merci d'avance à ceux qui prendront le temps de me répondre!

19 réponses

cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
15 juil. 2007 à 10:49
Donc Singleton ou champs/propriétés static. Dans le cas présent de simples statics devrait être suffisants.

-------------------------------
internal class Noms
{
   private static String _nom1;
   private static String _nom2;
   private static String _nom3;

   public static String Nom1
   {
      get
      {
         return Noms._nom1;
      }
      
      set
      {
         Noms._nom1 = value;
      }
   }

   public static String Nom2
   {
      get
      {
         return Noms._nom2;
      }
      
      set
      {
         Noms._nom2 = value;
      }
   }

   public static String Nom3
   {
      get
      {
         return Noms._nom3;
      }
      
      set
      {
         Noms._nom3 = value;
      }
   }
}
-------------------------------

XmlNode.SelectSingleNode

XmlNode nom1Node = doc.SelectSingleNode("Fournisseur/Nom1");
Noms._nom1 = nom1Node!=null ? nom1Node.InnerText : String.Empty;

etc etc

/*
coq
MVP Visual C#
CoqBlog
*/
3
iian2 Messages postés 103 Date d'inscription jeudi 10 novembre 2005 Statut Membre Dernière intervention 21 septembre 2007
11 juil. 2007 à 20:30
//recuperer element dun xml

   string fileName = @"Mon fichier.xml ";
   string file = System.IO.Path.Combine(System.Windows.Forms.Application.StartupPath, fileName);

   XmlDocument doc = new System.Xml.XmlDocument();
   doc.Load(file);


   XmlNodeList DbNamelist = doc.SelectNodes("Fournisseur/Nom");


   foreach (XmlNode node in DbNamelist)
   {
    listBox1.Items.Add(node.InnerText);
   }

Ton xml:

<?xml version="1.0" encoding="utf-8" ?>
<Fournisseur>
  <Nom>f1</Nom>
  <Nom>f2</Nom>
  <Nom>f3</Nom>
</Forunisseur>

Ian
0
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 1
11 juil. 2007 à 20:41
Merci pour cette réponse qui est très interessante, mais j'aurais aimé récuperer f1, f2 et f3 dans 3 textbox différents pour ensuite pouvoir réutiliser leurs valeurs autre part dans le code, est-ce possible (dans votre exemple on récupère tout le contenu et on l'affiche dans un listbox)?

Merci
0
iian2 Messages postés 103 Date d'inscription jeudi 10 novembre 2005 Statut Membre Dernière intervention 21 septembre 2007
11 juil. 2007 à 20:59
Oui je le mettais dans un listeBox

SelectNodes("Fournisseur/Nom1");

si tu met nom1 je crois que tu va avoir juste le f1.

met en vert si ca marche sinon redonne-moi des news

XmlDocument doc = new System.Xml.XmlDocument();
   doc.Load(file);
   XmlNodeList DbNamelist = doc.SelectNodes("Fournisseur/ Nom1 ");

   foreach (XmlNode node in DbNamelist)
   {
    Text1.text = Convert.ToString(node.InnerText);
   }

Ian
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 1
11 juil. 2007 à 21:44
Merci en tout cas, cela à l'air de fonctionner, j'ai une dernière question comment faire pour récuperer les 3 valeurs à la suite? Merci
0
iian2 Messages postés 103 Date d'inscription jeudi 10 novembre 2005 Statut Membre Dernière intervention 21 septembre 2007
11 juil. 2007 à 22:10
Allo,

 XmlNodeList DbNamelist = doc.SelectNodes("Fournisseur/ Nom1 ");


   foreach (XmlNode node in DbNamelist)
   {
    Text1.text = Convert.ToString(node.InnerText);
   }
XmlNodeList DbNamelist = doc.SelectNodes("Fournisseur/ Nom2 ");


   foreach (XmlNode node in DbNamelist)
   {
    Text1.text =  Text1.text + " " + Convert.ToString(node.InnerText);
   }


Si tu prends ma premiere methode ca va etre plus beau.
0
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 1
11 juil. 2007 à 22:18
Non car dans le deuxième je met "textBox2.Text =  Convert.ToString(node.InnerText);" donc ta deuxième solution est parfaite, par contre un erreur est survenue à la compilation :

"Une variable locale nommée 'DbNamelist' est déjà définie dans cette portée"

Merci beaucoup pour ton aide!
0
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
12 juil. 2007 à 08:06
Essaie comme ça pour les noeud après le premier :

DbNamelist = doc.SelectNodes("...");
De plus, inutile de faire le Convert, car InnerText est déjà un string.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
0
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
12 juil. 2007 à 19:05
Et par pitié par de concaténation de chaines de caractères dans des boucles : StringBuilder est votre ami.
En plus travailler directement sur la propriété Text du controle n'est pas forcément une bonne idée.

/*
coq
MVP Visual C#
CoqBlog
*/
0
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 1
12 juil. 2007 à 20:11
Merci pour ces réponses, pour SharpMao je ne vois pas ce que vous voulez dire, vous pouvez montrer le début en exemple?

Pour coq : je me renseigne sur StringBuilder, car il est vrai que utiliser des textbox juste pour garder une variable(string) ne doit pas être la meilleure solution...

Merci à tous
0
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 1
12 juil. 2007 à 20:37
J'ai fais ceci pour la réctification du code :

XmlNodeList DbNamelist = doc.SelectNodes("Fournisseur/ Nom1 ");
   foreach (XmlNode node in DbNamelist)
   {
    textBox1.Text = node.InnerText;
   }

DbNamelist = doc.SelectNodes("Fournisseur/ Nom2 ");

   foreach (XmlNode node in DbNamelist)
   {
    textBox2.Text =  node.InnerText;
   }

Est-ce correct?

Pour ce qui est du StringBuilder si quelqu'un aurait un exemple ou une explication détaillé je suis preneur! Un énorme merci à tous ceux qui m'ont permis d'avancer!
0
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
14 juil. 2007 à 09:35
Je ne vois pas trop le but des boucles vu que quoi qu'il arrive tu ne garde que la dernière valeur, autant n'en sélectionner qu'une seule et l'afficher directement.

"car il est vrai que utiliser des textbox juste pour garder une variable(string) ne doit pas être la meilleure solution"
? Comment ça ?

Si le but est vraiment d'afficher la liste des valeurs :

XmlNodeList DbNamelist = doc.SelectNodes("Fournisseur/Nom1");
if ( DbNamelist != null && DbNamelist.Count>0 )
{
   StringBuilder text = new StringBuilder();
   foreach (XmlNode node in DbNamelist)
   {
      text.Append(node.InnerText);
      text.Append(Environment.NewLine);
   }
   textBox1.Text = text.ToString();
}
else
{
   // ...
}

/*
coq
MVP Visual C#
CoqBlog
*/
0
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 1
14 juil. 2007 à 11:05
Je me réexplique, après avoir lu le fichier .xml je souheterais isoler chaque résultats du fichier .xml dans des variables que je pourrais par la suite réutiliser partout dans mon programme, et pour ce faire je n'ai pas trouvé mieux que la propriété "textBox.Text".

J'ai lu qu'on pouvait se servir d'un classe pour stocker les variables et faire du style "public static string Nom1" pour remplacer l'ecriture de chaque valeur dans un textBox, qui n'est pas très propre, est-ce cela dont vous me parliez?

Pour ce qui est des boucles je ne vois pas ce que vous voulez dire, pour faire simple mon code doit lire le fichier .xml, récupérer le Nom1 puis le mettre dans une variable, récupérer le Nom2 puis les mettre dans une variable, ect...

Si vous pensez que mon code n'est pas juste, n'hésitez pas...

Merci beaucoup!
0
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
14 juil. 2007 à 11:41
Oui, mais il n'y a qu'un seul Nom1, qu'un seul Nom2 et qu'un seul Nom3, non ?

Effectivement utiliser un champ de type String serait plus propre qu'instancier une instance de la classe TextBox juste pour se servir de sa propriété Text (qui obtient ou défini une instance de String)






/*
coq
MVP Visual C#
CoqBlog
*/
0
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 1
15 juil. 2007 à 00:39
Oui il n'y a qu'un seul Nom1, Nom2, Nom3, ect...

Pour mon cas que serait-il judicieux de faire en ce qui concerne les variables? utiliser un champ de type String dans une class pour qu'il soit accessible partout dans le programme?

Cordialement
0
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
15 juil. 2007 à 09:19
Pour ce qui est de la persistance, ça dépend du contexte : type d'application, durée de vie de l'information désirée etc etc
Mais en tout cas pour ce qui est de la lecture des informations, autant utiliser SelectSingleNode et ne pas utiliser de boucle.

/*
coq
MVP Visual C#
CoqBlog
*/
0
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 1
15 juil. 2007 à 10:33
Comment utiliser SelectSingleNode? Pouvez-vous me montrez avec l'exemple ci-dessous :

XmlNodeList DbNamelist = doc.SelectNodes("Fournisseur/ Nom1 ");


   foreach (XmlNode node in DbNamelist)
   {
    textBox1.Text = node.InnerText;
   }

DbNamelist = doc.SelectNodes("Fournisseur/ Nom2 ");


   foreach (XmlNode node in DbNamelist)
   {
    textBox2.Text =  node.InnerText;
   }

Pour ce qui est des variables, il faut qu'elles existent pendant toute la durée de vie du programme, pouriez-vous les inclures dans l'exemple aussi tout en expliquant? Un grand merci d'avance pour votre aide!

Cordialement
0
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 1
15 juil. 2007 à 20:17
Merci pour cette aide si précieuse, par contre j'ai mis la class dans un fichier Noms.cs, faut-il changer quelque chose à la class?

 Cependant il y a une erreur avec "XmlNode nom1Node", un point virgule est attendu, est-ce normal?

Cordialement
0
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 1
15 juil. 2007 à 22:28
J'ai corrigé l'erreur, mais maintenant j'ai deux erreurs distinctes :

La première :
Sur cette ligne : (XmlNode.SelectSingleNode;)
"Seuls une assignation, un appel, un incrément, un décrément et des expressions d'objet new peuvent être utilisés comme instruction"

La deuxième :
Sur cette ligne : (Noms._nom1 = nom1Node!=null ? nom1Node.InnerText : String.Empty;)
"'Noms._nom1' est inaccessible en raison de son niveau de protection"
(Sans doute du au fait que j'ai créer un fichier Noms.cs)

Avez-vous une idée? c'était ma dernière question à ce sujet, je vous remercie! J'ai tout ce dont j'ai besoin!
Cordialement
0
Rejoignez-nous