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 :

Désérialisation d'un fichier XML


Sujet :

C#

  1. #1
    Membre confirmé Avatar de Bathou
    Inscrit en
    Mars 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2007
    Messages : 179
    Par défaut Désérialisation d'un fichier XML
    Bonjour !

    Alors euh, je me suis lancée dans la désérialisation du fichier XML suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?xml version="1.0"?>
    <Lapins>
      <Lapin>
        <Nom>LAP1</Nom>
        <Prenom>lapinou</Prenom>
      </Lapin>
      <Lapin>
        <Nom>LAP2</Nom>
        <Prenom>lapinou2</Prenom>
      </Lapin>
    </Lapins>
    Donc pour commencer, j'ai fait simple, j'ai modifié mon fichier XML en un truc super simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?xml version="1.0"?>
    <Lapin>
        <Nom>LAP1</Nom>
    <Lapin>
    et j'ai utilisé le code suivant qui fonctionne parfaitement:

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    using System;
    using System.Collections.Generic;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Xml.Serialization;
    using System.Configuration;
    using System.IO;
    using System.Xml;
     
    namespace Lapin.Service
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
     
               label1.Text = DeserializeObject(@"C:\Lapin\fichier.xml");
            }
     
            public string DeserializeObject(string filename)
            {
                XmlSerializer xs = new XmlSerializer(typeof(Lapin));
                using (StreamReader rd = new StreamReader(filename))
                {
                    Lapin L = new Lapin();
                    L = xs.Deserialize(rd) as Lapin;
                    return L.Nom;
                }
             }
          }
     
        public partial class Lapin
        {
            public string Nom;
        }
    }
    Seulement voilà, le-dit code ne fonctionne pas quand je change le fichier... (ce qui est logique, je le concoit tout a fait !!)

    Donc j'ai tenté d'utiliser une List<Lapin> mais euh, sans grand succès...

    Voilà ce que ça a donné :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    using System;
    using System.Collections.Generic;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Xml.Serialization;
    using System.Configuration;
    using System.IO;
    using System.Xml;
     
    namespace Lapin.Service
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
     
               label1.Text = DeserializeObject(@"C:\Lapin\fichier.xml");
            }
     
            public string DeserializeObject(string filename)
            {
                 XmlSerializer xs = new XmlSerializer(typeof(List<Lapin>));
                using (StreamReader rd = new StreamReader(filename))
                {
                    List<Lapin> L ;
                    L = xs.Deserialize(rd) as List<Lapin>;
                    return ??????;// aussi une question, comment accéder aux valeurs de la liste du coup...?
                }
             }
          }
     
        public partial class Lapin
        {
            public string Nom;
        }
    }
    Donc si qqn pouvait m'éclairer, ça ne serait pas de refus =)

    (désolée pour la longueur de ce post...)

    Par avance, je vous remercie !

  2. #2
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Le problème est dans le XML.
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?xml version="1.0"?>
    <Lapin>
        <Nom>LAP1</Nom>
    <Lapin>
    Tu ne fermes pas la balise <Lapin>

    Ca devrait être mieux avec
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?xml version="1.0"?>
    <Lapin>
        <Nom>LAP1</Nom>
    </Lapin>

  3. #3
    Membre confirmé Avatar de Bathou
    Inscrit en
    Mars 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2007
    Messages : 179
    Par défaut
    Oups pardon, c'est une erreur de recopie... Je l'avais bien fermée...

  4. #4
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Pour les collections c'est un peu particulier et le mieux c'est encore que tu lises cet article, et par la suite cet autre article. La sérialisation des collections y est abordée

  5. #5
    Membre confirmé Avatar de Bathou
    Inscrit en
    Mars 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2007
    Messages : 179
    Par défaut
    Donc si j'ai bien compris ma lecture, il faudrait que dans ce code là:
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    using System;
    using System.Collections.Generic;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Xml.Serialization;
    using System.Configuration;
    using System.IO;
    using System.Xml;
     
    namespace Lapin.Service
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
     
               label1.Text = DeserializeObject(@"C:\Lapin\fichier.xml");
            }
     
            public string DeserializeObject(string filename)
            {
                 XmlSerializer xs = new XmlSerializer(typeof(List<Lapin>));
                using (StreamReader rd = new StreamReader(filename))
                {
                    List<Lapin> L ;
                    L = xs.Deserialize(rd) as List<Lapin>;
                    return ??????;// aussi une question, comment accéder aux valeurs de la liste du coup...?
                }
             }
          }
     
        public partial class Lapin
        {
            public string Nom;
        }
    }
    Je rajoute ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public List<Lapin> Lapins { get; set; }
    Mais par contre, je ne comprends pas ça:
    La valeur actuelle de la propriété est lue à l'aide de l'accesseur get

  6. #6
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Citation Envoyé par Bathou
    comment accéder aux valeurs de la liste du coup...?
    J'aurais tendance à te conseiller de lire le cours C# du site ou de faire une recherche sur la manipulation des collections en général, car c'est une base du langage qu'il faudrait acquérir

    Sinon pour te répondre mieux il faudrait d'abord que tu précises ce que tu veux faire exactement. Parce que je ne comprends pas le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    label1.Text = DeserializeObject(@"C:\Lapin\fichier.xml");
    Ca n'a absolument aucun sens si tu désérialises une collection, tu seras d'accord je pense. Le fait que la méthode DeserializeObject renvoie un objet de type string (i.e. le prototype de la méthode) est donc très étrange

    Et pour aller plus loin, si la structure de ton fichier XML est toujours le même qu'a début alors ton code ne fonctionnera pas. Tu as raté toute la partie sur les attributs qui servent à indiquer comment sérialiser (et donc désérialiser) l'information. A ce moment reprend le premier article sur la sérialisation, chapitre 2.

    Citation Envoyé par Bathou
    Mais par contre, je ne comprends pas ça: ...
    Cela veut juste dire que l'on va récupérer la collection via la propriété associée, tout simplement. Exactement ce qui est écrit donc ^^

  7. #7
    Membre confirmé Avatar de Bathou
    Inscrit en
    Mars 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2007
    Messages : 179
    Par défaut
    Citation Envoyé par StormimOn Voir le message
    Sinon pour te répondre mieux il faudrait d'abord que tu précises ce que tu veux faire exactement.
    Euh bah en clair, j'ai un fichier XML et je voudrais récupérer les informations dedans... d'où la désérialisation... En fait, en sortie, c'est plus un tableau de string qu'il me faudrait d'ailleurs...

    Je potasse la doc de manière plus sérieuse et je reviens si j'ai des questions...

    Merci...

  8. #8
    Invité
    Invité(e)
    Par défaut
    Euh bah en clair, j'ai un fichier XML et je voudrais récupérer les informations dedans... d'où la désérialisation
    Pourquoi "d'où la désérialisation" ? Tu veux juste lire un fichier xml en fait.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    XDocument doc = XDocument.Load("C:\\Lapin\\fichier.xml");
    var mesLapins = (from lapin in doc.Descendants("Lapin")
    select new {Name = lapin.Element("Nom").Value}).ToList();
    Ta variable mesLapins contiendra une liste de classes anonymes, qui auront un membre Name de type string contenant le contenu de tes balises Lapin/Nom.
    C'est pas plus compliqué que ça. Ces deux lignes de codes utilisent des fonctionnalités plutôt récentes de C# : Linq, les classes anonymes, le type var. Mais comme j'ai vu un using System.Linq dans ton code, je suppose que tu as la version du framework requise.

    T'es pas obligé d'utiliser une classe anonyme et var. Si tu as déjà déclaré une classe Lapin avec un membre Name :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    List<Lapin> mesLapins = (from lapin in doc.Descendants("Lapin")
    select new Lapin(){Name = lapin.Element("Nom").Value}).ToList();
    Si tu veux un tableau de string avec les noms des lapins :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string[] mesLapins = (from lapin in doc.Descendants("Lapin")
    select lapin.Element("Nom").Value).ToArray();
    Attention : pour que ça marche il manque dans ton fichier xml une balise racine qui englobe tout, par exemple une balise Lapins :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?xml version="1.0"?>
    <Lapins>
      <Lapin>
          <Nom>LAP1</Nom>
      </Lapin>
    </Lapins>
    Pour Linq et le Xml, tu peux jeter un oeil à ce mini tuto :
    http://www.switchonthecode.com/tutor...le-xml-parsing

Discussions similaires

  1. [Débutant] Désérialisation d'un fichier XML complexe
    Par Gugoo dans le forum VB.NET
    Réponses: 3
    Dernier message: 31/07/2014, 10h43
  2. Sérialisation et désérialisation de fichier XML en objet
    Par marooned dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 01/08/2012, 10h55
  3. [XStream] problème avec la désérialisation d'un fichier xml
    Par sidoumghar dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 25/11/2008, 12h23
  4. [Kylix] Composant IBM pour fichiers XML
    Par Mister Nono dans le forum EDI
    Réponses: 1
    Dernier message: 29/09/2002, 20h28
  5. Balises HTML dans un fichier XML
    Par Bastet79 dans le forum XML/XSL et SOAP
    Réponses: 12
    Dernier message: 04/09/2002, 15h29

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