Lire un fichier .xml [Résolu]

clubberzZ 89 Messages postés vendredi 29 octobre 2004Date d'inscription 3 décembre 2007 Dernière intervention - 11 juil. 2007 à 20:12 - Dernière réponse : clubberzZ 89 Messages postés vendredi 29 octobre 2004Date d'inscription 3 décembre 2007 Dernière intervention
- 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!
Afficher la suite 

Votre réponse

19 réponses

Meilleure réponse
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 15 juil. 2007 à 10:49
3
Merci
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
*/

Merci cs_coq 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 74 internautes ce mois-ci

Commenter la réponse de cs_coq
iian2 103 Messages postés jeudi 10 novembre 2005Date d'inscription 21 septembre 2007 Dernière intervention - 11 juil. 2007 à 20:30
0
Merci
//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
Commenter la réponse de iian2
clubberzZ 89 Messages postés vendredi 29 octobre 2004Date d'inscription 3 décembre 2007 Dernière intervention - 11 juil. 2007 à 20:41
0
Merci
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
Commenter la réponse de clubberzZ
iian2 103 Messages postés jeudi 10 novembre 2005Date d'inscription 21 septembre 2007 Dernière intervention - 11 juil. 2007 à 20:59
0
Merci
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
Commenter la réponse de iian2
clubberzZ 89 Messages postés vendredi 29 octobre 2004Date d'inscription 3 décembre 2007 Dernière intervention - 11 juil. 2007 à 21:44
0
Merci
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
Commenter la réponse de clubberzZ
iian2 103 Messages postés jeudi 10 novembre 2005Date d'inscription 21 septembre 2007 Dernière intervention - 11 juil. 2007 à 22:10
0
Merci
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.
Commenter la réponse de iian2
clubberzZ 89 Messages postés vendredi 29 octobre 2004Date d'inscription 3 décembre 2007 Dernière intervention - 11 juil. 2007 à 22:18
0
Merci
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!
Commenter la réponse de clubberzZ
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 12 juil. 2007 à 08:06
0
Merci
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)
Commenter la réponse de SharpMao
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 12 juil. 2007 à 19:05
0
Merci
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
*/
Commenter la réponse de cs_coq
clubberzZ 89 Messages postés vendredi 29 octobre 2004Date d'inscription 3 décembre 2007 Dernière intervention - 12 juil. 2007 à 20:11
0
Merci
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
Commenter la réponse de clubberzZ
clubberzZ 89 Messages postés vendredi 29 octobre 2004Date d'inscription 3 décembre 2007 Dernière intervention - 12 juil. 2007 à 20:37
0
Merci
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!
Commenter la réponse de clubberzZ
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 14 juil. 2007 à 09:35
0
Merci
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
*/
Commenter la réponse de cs_coq
clubberzZ 89 Messages postés vendredi 29 octobre 2004Date d'inscription 3 décembre 2007 Dernière intervention - 14 juil. 2007 à 11:05
0
Merci
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!
Commenter la réponse de clubberzZ
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 14 juil. 2007 à 11:41
0
Merci
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
*/
Commenter la réponse de cs_coq
clubberzZ 89 Messages postés vendredi 29 octobre 2004Date d'inscription 3 décembre 2007 Dernière intervention - 15 juil. 2007 à 00:39
0
Merci
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
Commenter la réponse de clubberzZ
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 15 juil. 2007 à 09:19
0
Merci
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
*/
Commenter la réponse de cs_coq
clubberzZ 89 Messages postés vendredi 29 octobre 2004Date d'inscription 3 décembre 2007 Dernière intervention - 15 juil. 2007 à 10:33
0
Merci
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
Commenter la réponse de clubberzZ
clubberzZ 89 Messages postés vendredi 29 octobre 2004Date d'inscription 3 décembre 2007 Dernière intervention - 15 juil. 2007 à 20:17
0
Merci
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
Commenter la réponse de clubberzZ
clubberzZ 89 Messages postés vendredi 29 octobre 2004Date d'inscription 3 décembre 2007 Dernière intervention - 15 juil. 2007 à 22:28
0
Merci
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
Commenter la réponse de clubberzZ

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.