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 :

Meilleure façon de faire de l'XML Data Binding


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut Meilleure façon de faire de l'XML Data Binding
    Bonjour,

    le but est de mapper des objets vers leur représentation XML et vice-versa.
    Par exemple la classe "A" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class A
    {
         public string s = null;
    }
    aura comme représentation XML :
    ou :
    La solution brute est d'utiliser des requêtes LINQ du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    from a in xmlDoc.Descendants("A")
    select new A
    {
        s = (string)a.Attribute("s")
    };
    Existe t'il un moyen d'automatiser ce processus : faire en sorte que la génération des objets à partir des entités dans le fichier XML soit directe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    from a in xmlDoc.Descendants("A") select a;
    et que l'objet de type "A" retourné contienne dans son champ "s" la valeur de l'attribut "s" du XML ?

    Merci.

  2. #2
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Salut,

    j'ai jamais bossé avec, mais c'est pas à ça que Linq To XML sert ?

  3. #3
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Le code du post précédent utilise en effet LINQ to XML mais effectue le mapping des données sans automatisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s = (string)a.Attribute("s")
    Si des propriétés sont ajoutées plus tard il faudra étendre ce code.
    Il faudrait donc déléguer cette charge de mapping à une autre classe qui doit sûrement exister en LINQ.

  4. #4
    Membre éprouvé

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2008
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 76
    Par défaut
    Salut,

    Si tu veux le minimum d'interaction, tu peux passer par l'utilisation de la classe Serializer. Tu indiques que ta classe A est serializable et ensuite ça roule. Voici un petit exemple 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
    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
    [Serializable]
    public class People
    {
     [System.Xml.Serialization.XmlAttributeAttribute()]
     public string nom;
     [System.Xml.Serialization.XmlAttributeAttribute()]
     public string prenom;
     
    
     public People()
     { 
     }
    }
     
    
    public class SerialWithLinq
    {
     static string xmlFile = @"<Peoples><People nom=""Alain"" prenom=""Terieur"" /><People nom=""Alex"" prenom=""Terieur"" /></Peoples>"; 
     
    
     public static void readFromXml()
     {
       XDocument sourceXml = XDocument.Parse(xmlFile);
     
       //Definir le serializer
       System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(People));
     
    
       var allPeoples = from curPeople in sourceXml.Descendants("People")
           select serializer.Deserialize(curPeople.CreateReader()) as People;
     
    
       List<People> myList = allPeoples.ToList();
     
       System.Console.WriteLine("End of readFromXml " + myList.Count());
     
     } 
    }
    
    J'espère que celà correspond à ce que tu recherches.

    A+

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 135
    Par défaut
    Pour ça personnellement j'utilise XmlSerializer

    Ecriture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     using(StreamWriter sw = new StreamWriter("file.xml"))
    {
            XmlSerializer w = new XmlSerializer(obj.GetType());
            w.Serialize(sw, obj);
    }
    Lecture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    using (StreamReader r = new StreamReader("file.xml"))
    {
                XmlSerializer s = new XmlSerializer(typeof(T));
                T variable = (T)s.Deserialize(r);
    }
    si tu veux écrire dans une chaine de caractère, et non un fichier, utilises StringReader et StringWriter à la place de StreamReader/StreamWriter

    [edit]
    avec, bien sûr, les références qui vont avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    using System.Xml.Serialization;
    using System.IO;

    [edit 2]
    tiens ? j'avais pas vu la réponse précédent (sensiblement la même que la mienne )

  6. #6
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Merci beaucoup à vous.

    C'est en effet exactement ça.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 16
    Dernier message: 18/08/2008, 18h29
  2. Réponses: 8
    Dernier message: 18/01/2008, 15h58
  3. Itération/recherche, meilleure façon de faire?
    Par Sallie dans le forum Langage
    Réponses: 34
    Dernier message: 16/01/2008, 10h00
  4. Réponses: 1
    Dernier message: 08/08/2007, 08h45
  5. Est ce bien la meilleure façon de faire un histogramme ?
    Par rvzip64 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 10/05/2005, 12h41

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