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 :

[Sérialisation XML] Sérialiser une Propriété comme Attribut d'une autre Propriété ? [Fait]


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 24
    Par défaut [Sérialisation XML] Sérialiser une Propriété comme Attribut d'une autre Propriété ?
    Bonjour.

    Je souhaite sérialiser en XML une classe du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class Voiture
    {
    public string Modele;
     
    public string Constructeur;
     
    public string Cylindree;
    }
    ...de façon à ce que, avec une instance du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Voiture maVoiture = new Voiture();
     
    maVoiture.Modele = "Pipo";
     
    maVoiture.Constructeur = "Citronault";
     
    maVoiture.Cylindree = "4CV";
    ...le fichier .xml créé soit de ce type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?xml version="1.0" encoding="utf-8"?>
    <Voiture>
    <Modele Constructeur="Citronault">Pipo</Modele>
    <Cylindree>4CV</Cylindree>
    </Voiture>
    Dans mon xml, 'Constructeur' serait un attribut de l'élément 'Modele'.
    Je n'ai pas trouvé les attributs qui permettent d'expliquer ça au XmlSerializer...

    Auriez-vous des pistes ?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    [XmlAttribute]
    public string Constructeur;
    ...

  3. #3
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 24
    Par défaut
    Salut Tomlev.

    Malheureusement j'ai essayé ce que tu proposes mais le champ 'Constructeur' est alors un attribut de l'élément <Voiture>, i.e. :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?xml version="1.0" encoding="utf-8"?>
    <Voiture Constructeur="Citronault">
    <Modele >Pipo</Modele>
    <Cylindree>4CV</Cylindree>
    </Voiture>
    rajouter [XmlAttribute] à un champ définit ce champ comme attribut de la racine (il me semble) qui ici est <Voiture>.
    Or je veux justement pouvoir définir un champ comme attribut d'un autre champ, qui lui deviendra un élément dans le .xml (en l'occurrence, en ajoutant l'attribut [XmlAttribute] à ce dernier champ).Voir le xml dans mon 1er post.

    edit: pour être plus précis [XmlAttribute] sur un champ d'une classe UneClasse signifie que ce champ sera un attribut de l'élément <UneClasse> dans le fichier xml.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Ben ça n'a pas vraiment de sens... dans ta classe Voiture, Constructeur n'est pas un attribut de Modele. Si tu veux obtenir le résultat que tu as indiqué, il faut que tu modifies la structure de Voiture : par exemple en créant une classe Modele, qui a une propriété Constructeur.

    Au fait : rien à voir, mais 4CV c'est pas une cylindrée, c'est une puissance (puissance fiscale pour être exact)

  5. #5
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 24
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Ben ça n'a pas vraiment de sens... dans ta classe Voiture, Constructeur n'est pas un attribut de Modele. Si tu veux obtenir le résultat que tu as indiqué, il faut que tu modifies la structure de Voiture : par exemple en créant une classe Modele, qui a une propriété Constructeur.

    Au fait : rien à voir, mais 4CV c'est pas une cylindrée, c'est une puissance (puissance fiscale pour être exact)
    je suis pas vraiment convaincu...tu fais comme si la structure du xml devait forcément refléter celle de la classe, bon, mettons.
    Mais alors je vois pas vraiment la logique ici.
    suppose que ma classe voiture soit définie comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Voiture
    {
    [XmlAttribute]
    public string Marque;
     
    [XmlElement]
    public int Kilometrage;
    }
    avec les attributs que j'ai mis, le xml sera du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <Voiture Marque="Citronault">
    <Kilometrage>50000</Kilometrage>
    </Voiture>
    Dans cet exemple je pense pas que Marque et Kilometrage aient une quelconque relation en dehors d'être des champs de Voiture, et pourtant dans le xml 'Marque' devient un attribut de <Voiture> alors que 'Kilometrage' devient un élément à part entière. Y a pas vraiment de logique non plus.

    Le truc c'est que c'est surtout la déserialisation qui m'intéresse: un utilisateur crée un fichier voiture.xml et je le désérialise en une instance de ma classe. Dans cette situation, puisque le xml va être créé à la main par mon utilisateur, je vois pas pourquoi sa structure devrait forcément refléter celle de ma classe. Pour l'utilisateur, la structure du xml doit être simple à se rappeler, tandis que celle de ma classe doit être pratique pour moi quand je m'en sers dans mon programme...

    Ceci dit je vois ce que tu veux dire, et ce que tu vas me dire():
    - "t'as qu'à te créer un xml à toi et le parser pour récupérer les infos"
    -"t'as qu'à changer la structure de la classe pour refléter celle du xml (et vice versa)"

    Je vais me débrouiller avec ça (à moins que quelqu'un ait une autre idée?)...

    merci.

  6. #6
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Par défaut
    Si tu veux contrôler exactement ta sérialisation Xml, tu peux faire implémenter l'interface IXmlSerializable à ta classe.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par pequatre Voir le message
    je suis pas vraiment convaincu...tu fais comme si la structure du xml devait forcément refléter celle de la classe, bon, mettons.
    ...
    Dans cette situation, puisque le xml va être créé à la main par mon utilisateur, je vois pas pourquoi sa structure devrait forcément refléter celle de ma classe.
    Ben c'est une contrainte de la sérialisation XML... C'est assez flexible, mais tu peux pas faire n'importe quoi non plus

    Citation Envoyé par pequatre Voir le message
    Pour l'utilisateur, la structure du xml doit être simple à se rappeler, tandis que celle de ma classe doit être pratique pour moi quand je m'en sers dans mon programme...
    Personnellement je ne trouve pas particulièrement logique (et donc facile à se rappeler) que Constructeur soit un attribut de Modele... En plus, c'est pas en mélangeant éléments et attributs que tu vas avoir un schéma facile à retenir : il vaut mieux que tout soit sous forme d'éléments, ça évite de se demander "et ça, c'est un attribut ou un élément ?"

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

Discussions similaires

  1. Classe comme attribut d'une classe parente
    Par tamerla dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 15/12/2014, 22h41
  2. Passer un objet comme attribut d'une classe
    Par Leduc08 dans le forum Ext JS / Sencha
    Réponses: 1
    Dernier message: 05/04/2011, 11h54
  3. [C#/XML] Sérialiser XML
    Par Nelieru dans le forum Windows Forms
    Réponses: 3
    Dernier message: 16/06/2009, 18h40
  4. Réponses: 4
    Dernier message: 24/04/2007, 12h14
  5. [XSLT]Mettre une variable comme attribut
    Par Oberown dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 29/09/2006, 10h47

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