IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Lecture et Écriture dans un fichier xml et affichage dans un DataGridView


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Architecte système
    Inscrit en
    Avril 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte système

    Informations forums :
    Inscription : Avril 2010
    Messages : 28
    Points : 34
    Points
    34
    Par défaut Lecture et Écriture dans un fichier xml et affichage dans un DataGridView
    Bonjour,

    J'ai un fichier xml sous cette forme la :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    <standard_set name="NIST Standards">
       <standard name="NIST SRM 610">
         <concentration compound="Li" units="ppm">484.6</concentration> 
         <concentration compound="Be" units="ppm">465.6</concentration> 
         <concentration compound="B" units="ppm">356.4</concentration> 
         <concentration compound="C" units="ppm">0.1</concentration> 
         <concentration compound="Na" units="ppm">99052.840104</concentration> 
         <concentration compound="Mg" units="ppm">465.3</concentration> 
         <concentration compound="Al" units="ppm">10791.413617</concentration> 
         <concentration compound="Si" units="ppm">327090.72015</concentration> 
         <concentration compound="P" units="ppm">342.5</concentration>
         ....
       </standard>
       <standard name="NIST SRM 610 (Pearce et al, 1997)">
         <concentration compound="Li" units="ppm">482.20</concentration> 
         <concentration compound="Be" units="ppm">460.70</concentration> 
         <concentration compound="B" units="ppm">357.60</concentration> 
         <concentration compound="Na" units="ppm">97190.21</concentration> 
         <concentration compound="Mg" units="ppm">455.00</concentration> 
         <concentration compound="Al" units="ppm">10053.47</concentration>
          ...
       </standard>
       <standard name="NIST SRM 612">
       .....
    et je souhaiterais pourvoir afficher le contenu de celui-ci (compound, units et valeurs) dans un tableau et permettre par la suite l'ajout, la suppression et la modification des valeurs de ce fichiers, qui seront ensuite enregistrées. J'ai donc opté pour un datagridview.

    Pour afficher dans le datagridview, j'ai ce code la qui fonctionne correctement et qui me permet d'afficher seulement certains noeuds :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
            private void XML()
            {            
                XmlDataDocument xmlDatadoc = new XmlDataDocument();
     
                xmlDatadoc.DataSet.ReadXml(file_Name);
     
                DataSet ds = new DataSet();
     
                ds = xmlDatadoc.DataSet;
     
                dataGridView1.DataSource = ds;
     
                dataGridView1.DataMember = "standard";
            }
    Cependant cela me renvoie tout les noeuds du type demandé et je n'ai pas réussis à récupérer simplement les valeurs des noeuds enfants d'un noeud standard choisis.

    Après recherches, je me suis donc tourné vers Xpath. Ceci m'as permis de récupérer le contenu des noeuds que je désirais ainsi que des noeuds enfants concernés.

    En revanche, je n'arrive pas à trouver comment récupérer les valeurs des attributs "compound" et "units".

    J'utilise ces expressions XPath pour parcourir mon fichier xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // Expression pour parcourir le noeud donné
    ExpXPath = "//standard[@name='" + standard + "']";
     
    // Expression pour récupérer le nombre de noeuds enfants contenu dans le noeud donné
    ExpXCount = "//standard[@name='" + standard + "']/concentration";
     
    // Expression pour récupérer les valeurs de compound
    ExpXName = "//standard/concentration./@compound";
    Mais en utilisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Name = Navigator_Name.Select(Navigator_Name.Compile(ExpXName));
    Console.WriteLine(Name.Current.Value);
    cela me renvoie les valeurs de tout les noeuds enfants du noeud actuel.

    Si quelqu'un a une idée/solution, je suis preneur.

    Merci d'avance.

  2. #2
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 50
    Points : 54
    Points
    54
    Par défaut
    peut etre ici tu trouve ce que tu cherche

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Architecte système
    Inscrit en
    Avril 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte système

    Informations forums :
    Inscription : Avril 2010
    Messages : 28
    Points : 34
    Points
    34
    Par défaut
    Merci
    Cependant j'ai déjà parcouru ce topic, c'est d'ailleurs dans celui-ci que j'ai pris ce bout de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            private void XML()
            {            
                XmlDataDocument xmlDatadoc = new XmlDataDocument();
     
                xmlDatadoc.DataSet.ReadXml(file_Name);
     
                DataSet ds = new DataSet();
     
                ds = xmlDatadoc.DataSet;
     
                dataGridView1.DataSource = ds;
     
                dataGridView1.DataMember = "standard";
            }
    Mais ce code ne permet que d'afficher le contenu du fichier xml, en choisissant éventuellement les champs à afficher, dans le datagridview.

    Ce que je recherche est comment récupérer les attributs "compound" et "units", étant donné que je ne réussis à récupérer que la valeur des noeuds.

    Tout cela pour permettre une modification (ou un ajout/suppression) par l'utilisateur des valeurs contenu dans ce fichier depuis le datagridview et les enregistrer dans le fichier xml une fois ces modifications terminé.

    Pour récupérer les attributs "compound" et "units", j'ai utilisé ce code avec XPath, mais cela ne fonctionne que sur le premier noeud enfant. Après la première boucle je récupère seulement la valeur de "units".


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    // Expression pour récupérer les valeurs de compound
    ExpXPath = "//standard[@name='" + standard + "']";
     
    Nodes = Navigator.Select(Navigator.Compile(ExpXPath));
     
    Nodes.MoveNext(); // NOTE: Necéssaire pour se placer sur le noeud recherché
     
    Nodes.Current.MoveToFirstChild(); // On se déplace sur le premier noeud enfant "concentration" 
     
    for(int i = 0; i < Nbre_Nodes.Count; i++)
    {
          Concentration[i] = Nodes.Current.Value;
          Console.WriteLine(Concentration[i]);
     
          Nodes.Current.MoveToFirstAttribute();
          Console.WriteLine(Nodes.Current.Value);
     
          Nodes.Current.MoveToNextAttribute();
          Console.WriteLine(Nodes.Current.Value);
     
          Nodes.Current.MoveToNext(); // On se déplace sur le noeud suivant "concentration"
    }

    Du coup je pensais faire 2 navigateur XPath utilisant la même expression (ExpXPath), l'un récupérant les attributs et l'autre récupérant les valeurs des noeuds enfants, mais n'y a-t-il pas un moyen de le faire avec un seul navigateur ?

  4. #4
    Responsable .NET

    Avatar de Hinault Romaric
    Homme Profil pro
    Consultant
    Inscrit en
    Janvier 2007
    Messages
    4 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 4 570
    Points : 252 372
    Points
    252 372
    Billets dans le blog
    121
    Par défaut
    Tu peu utiliser la méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Nodes.Current.GetAttribute()
    Et dans ta boucle au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Nodes.Current.MoveToNext();
    je crois que c'est plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Nodes.MoveToNext();
    @++
    Vous souhaitez participer aux rubriques .NET ? Contactez-moi

    Si déboguer est l’art de corriger les bugs, alors programmer est l’art d’en faire
    Mon blog, Mes articles, Me suivre sur Twitter
    En posant correctement votre problème, on trouve la moitié de la solution

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Architecte système
    Inscrit en
    Avril 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte système

    Informations forums :
    Inscription : Avril 2010
    Messages : 28
    Points : 34
    Points
    34
    Par défaut
    Merci pour ta réponse

    J'avais déjà testé avec cette méthode mais je n'avais pas réussis à récupérer la valeurs des attributs à cause du namespaceURI demandé, mais au final je viens de remarquer qu'il y avait une méthode pour cela, ce qui me donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Elements[i] = Nodes.Current.GetAttribute("compound", Nodes.Current.NamespaceURI);
    Console.WriteLine(Elements[i]);
    et me renvoie bien la valeur de l'attribut demandé à chaque boucle .


    Par contre je ne comprend toujours pas pourquoi ma boucle précédente restait bloqué sur la valeur de "units" ...


    D'ailleurs en utilisant

    le navigateur reste toujours sur le premier noeud enfant alors que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Nodes.Current.MoveToNext();
    m'envoie bien au noeud enfant suivant


    J'ai également un problème avec mon DataGridView, lorsque je lui envoie l'un de mes tableaux en DataSource pour l'afficher, la colonne qui apparait est nommé "Lenght" et contient des valeurs qui ne correspondent pas (au vu du nom du tableau je pense qu'il récupère la longueur de chaque ligne du tableau).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dataGridView1.DataSource = Concentration;
    J'ai donc voulu créer un colonne à la main pour ensuite lui envoyer les valeurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dataGridView1.Columns.Add("concentration", "colonne1");
    cela me crée bien une colonne nommé "colonne1" mais ensuite je ne vois pas comment ajouter les valeurs de mon tableau dans cette colonne, sachant que le premier paramètre est "string columnName" je suppose qu'il faudrait se référer a celui-ci quelque part pour indiquer que l'ont veut ajouter des valeurs dans cette colonne.

    Si quelqu'un connait la méthode pour ajouter des tableaux dans un DataGridView (j'ai majoritairement trouvé des exemples de bases de données utilisées avec un DataGridView), je ne dirais pas non à une petite explication.

    Merci d'avance.

  6. #6
    Responsable .NET

    Avatar de Hinault Romaric
    Homme Profil pro
    Consultant
    Inscrit en
    Janvier 2007
    Messages
    4 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 4 570
    Points : 252 372
    Points
    252 372
    Billets dans le blog
    121
    Par défaut
    Par contre je ne comprend toujours pas pourquoi ma boucle précédente restait bloqué sur la valeur de "units" ...
    Moi pour parcourir mes documents XML j'utilise toujours un XmlNodeList()

    cela me crée bien une colonne nommé "colonne1" mais ensuite je ne vois pas comment ajouter les valeurs de mon tableau dans cette colonne, sachant que le premier paramètre est "string columnName" je suppose qu'il faudrait se référer a celui-ci quelque part pour indiquer que l'ont veut ajouter des valeurs dans cette colonne.
    dans ce cas tu na plus besoin de binder ton DGV sur le tableau, tu peu le remplir a la main .
    dans une boucle tu parcours ton tableau et tu fait un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dataGridView1.rows.Add(Elements[i]);
    @++
    Vous souhaitez participer aux rubriques .NET ? Contactez-moi

    Si déboguer est l’art de corriger les bugs, alors programmer est l’art d’en faire
    Mon blog, Mes articles, Me suivre sur Twitter
    En posant correctement votre problème, on trouve la moitié de la solution

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Architecte système
    Inscrit en
    Avril 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte système

    Informations forums :
    Inscription : Avril 2010
    Messages : 28
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par lilroma Voir le message
    dans une boucle tu parcours ton tableau et tu fait un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dataGridView1.rows.Add(Elements[i]);
    @++
    Tout simplement, merci

    Mon problème maintenant est l'écriture d'attributs dans les nouveaux noeuds enfants.

    Pour la modification des valeurs et attributs des noeuds enfants, je ne rencontre pas de problèmes ni lorsque je veux créer un nouveau noeud enfant en lui donnant une valeur.

    Cependant lorsque je veux ajouter des attributs aux noeuds enfants crée, le premier noeud enfant reçois bien les attributs qu'il doit mais ceux du noeud suivant sont également ajouter au premier noeud enfant ce qui me renvoie l'erreur

    'compound' est un nom d'attribut dupliqué.
    Pour mieux s'en rendre compte j'ai donc changé le nom des attributs du second noeud et en sortie cela me donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <standard name="NIST PERSO">
      <concentration compound="abc" units="ABC" _compound="_def" _units="_DEF">Blabla</concentration> 
      <concentration>Bouh</concentration> 
    </standard>
    Voici le code que j'utilise pour cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
                    /* On crée le noeud principal */
                    Nodes.Current.InsertElementAfter("", "standard", "", "");
     
                    /* On se place sur le noeud ainsi créé */
                    Nodes.Current.MoveToNext(XPathNodeType.Element);
     
                    /* Encodage des données */
                    /* Création de l'attribut du noeud principal */
                    Nodes.Current.CreateAttribute("", "name", "", "NIST PERSO");
     
                    /* Création des noeuds enfants */
                    /* Création du premier noeud enfant */
                    Nodes.Current.AppendChildElement("", "concentration", "", "Blabla");
                    Nodes.Current.MoveToChild(XPathNodeType.Element);
                    Nodes.Current.CreateAttribute("", "compound", "", "abc");
                    Nodes.Current.CreateAttribute("", "units", "", "ABC");
     
                    /* Retour au noeud parent */
                    Nodes.Current.MoveToParent();
     
                    /* Création du second noeud enfant */
                    Nodes.Current.AppendChildElement("", "concentration", "", "Bouh");
                    Nodes.Current.MoveToChild(XPathNodeType.Element);
                    Nodes.Current.CreateAttribute("", "compound", "", "_def");
                    Nodes.Current.CreateAttribute("", "units", "", "_DEF");
    je pense que le problème se situe au niveau du

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Nodes.Current.MoveToChild(XPathNodeType.Element);
    du 2ème noeud enfant, puisque normalement il devrait déplacer le navigateur sur l'élément crée précédemment, à moins que je n'ai raté autre chose ...

    Si quelqu'un voit l'erreur ou ce qu'il manque, je suis preneur

  8. #8
    Responsable .NET

    Avatar de Hinault Romaric
    Homme Profil pro
    Consultant
    Inscrit en
    Janvier 2007
    Messages
    4 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 4 570
    Points : 252 372
    Points
    252 372
    Billets dans le blog
    121
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Nodes.Current.MoveToChild(XPathNodeType.Element);
    Va toujours se placer sur le premier nœud enfant de <standart>.

    A mon avis tu peut te placer sur le dernier enfant de <standart>
    ensuite tu fait ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Nodes.Current.InsertElementAfter("", "concentration", "", "bouh");
    //on se place sur le nouveau noeud
    Nodes.Current.MoveToNext(XPathNodeType.Element);
    //on ajoute un attribut a celui ci 
    Nodes.Current.CreateAttribute("", "compound", "", "abc");
    @++
    Vous souhaitez participer aux rubriques .NET ? Contactez-moi

    Si déboguer est l’art de corriger les bugs, alors programmer est l’art d’en faire
    Mon blog, Mes articles, Me suivre sur Twitter
    En posant correctement votre problème, on trouve la moitié de la solution

Discussions similaires

  1. [XML::Twig] Commentaires dans le fichier XML réécrit
    Par knarf87 dans le forum Modules
    Réponses: 2
    Dernier message: 07/05/2008, 09h24
  2. Problème d'écriture dans un fichier xml
    Par vanoou dans le forum C++Builder
    Réponses: 1
    Dernier message: 13/07/2005, 02h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo