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 :

Serialisation XML : comment sérialiser sous des noms d'éléments différent


Sujet :

C#

  1. #1
    Membre habitué Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Moselle (Lorraine)

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Points : 174
    Points
    174
    Par défaut Serialisation XML : comment sérialiser sous des noms d'éléments différent
    Bonjour,

    J'ai essayé de trouver un intitulé de post "explicite". Je ne le trouve pas clair mais je ne sais pas comment le dire "rapidement".

    Bref,

    Je dois générer un fichier XML basé sur un XSD. Jusque là rien d'anormal.
    Je m'appuie souvent sur le "tuto" de Thomas Levesque sur la sérialisation XML mais la je ne trouve pas de solution.

    Voici ce qui me pose problème:
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <xs:complexType name="Period_Type">
        <xs:sequence>
    	<xs:element name="Year" type="enoss:Year_Type"/>
    	<xs:choice>
    		<xs:element name="Quarter" type="Quarter_Type"/>
    		<xs:element name="Month" type="Month_Type"/>
    	</xs:choice>
        </xs:sequence>
    </xs:complexType>

    Ou Quarter_Type et Month_Type sont des énumérations que voici:
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <xs:simpleType name="Quarter_Type">
    	<xs:restriction base="xs:int">
    		<xs:enumeration value="1"/>
    		<xs:enumeration value="2"/>
    		<xs:enumeration value="3"/>
    		<xs:enumeration value="4"/>
    	</xs:restriction>
    </xs:simpleType>

    Code XML : 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
    <xs:simpleType name="Month_Type">
    	<xs:restriction base="xs:string">
    		<xs:enumeration value="01"/>
    		<xs:enumeration value="02"/>
    		<xs:enumeration value="03"/>
    		<xs:enumeration value="04"/>
    		<xs:enumeration value="05"/>
    		<xs:enumeration value="06"/>
    		<xs:enumeration value="07"/>
    		<xs:enumeration value="08"/>
    		<xs:enumeration value="09"/>
    		<xs:enumeration value="10"/>
    		<xs:enumeration value="11"/>
    		<xs:enumeration value="12"/>
    	</xs:restriction>
    </xs:simpleType>

    Ceci doit donner soit ceci:
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <Period>
        <Year>2022</Year>
        <Quarter>2</Quarter>
    </Period>

    Soit ceci:
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <Period>
        <Year>2022</Year>
        <Month>02</Month>
    </Period>

    Je voulais partir vers un classe abstraite telle que ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public abstract class AbstractPeriodKind
    {
    }
     
    public class QuarterPeriodKind:AbstractPeriodKind
    {
        public Quarter_Type Quarter //Désolé pour l'absence des get set sinon je ne pouvais pas créer la discussion
    }
     
    public class MonthPeriodKind:AbstractPeriodKind
    {
        public Month_Type Month //Désolé pour l'absence des get set sinon je ne pouvais pas créer la discussion
    }
    Que j'utilisais dans la classe de Period

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Period
    {
        public int Year //Désolé pour l'absence des get set sinon je ne pouvais pas créer la discussion
     
            [XmlElement("Month", typeof(MonthPeriodKind))]
            [XmlElement("Quarter", typeof(QuarterPeriodKind))]
        public AbstractPeriodKind PeriodKind //Désolé pour l'absence des get set sinon je ne pouvais pas créer la discussion
    }
    Mais à la sérialisation cela ne donne pas le résultat attendu puisque les éléments étaient doublés et imbriqués.

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <Period>
        <Year>2022</Year>
        <Quarter>    
             <Quarter>2</Quarter>
        </Quarter>
    </Period>

    Je ne vois pas trop comment écrire une valeur directement dans la balise "conteneur".

    Comment feriez-vous ce genre de sérialisation?

    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 667
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 667
    Points : 5 235
    Points
    5 235
    Par défaut
    Déjà, si tu as des enum, pourquoi créer des classes ?

    Pour moi, il faut enlever le membre AbstractPeriodKind de la classe Period.
    Puis créer deux classes QuarterPeriod et MonthPeriod qui héritent toutes deux de Period.
    Dans QuarterPeriod, tu ajoute un propériété Quarter de type Enum
    Dans MounthPeriod tu rajoute un propriété Mounth de type Enum et sur l'enum en question tu rajoutes un XmlEnumAttribute

    Et du coup, tu sérialises soit un objet de type QuarterPeriod, soit un objet de type MounthPeriod

    Edit : le type Enum en question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public enum Mounths 
        {
            [XmlEnum("01")]
            January = 1,
            [XmlEnum("02")]
            February = 2,
            [XmlEnum("03")]
            March = 3 
     
           etc.
        };

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/01/2020, 10h27
  2. Réponses: 2
    Dernier message: 05/02/2018, 18h40
  3. [AJAX] Ajax mais sur des nom de domaine différent
    Par Are-no dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 20/09/2008, 13h42
  4. Comment avoir des noms d'objets différents ?
    Par adn013 dans le forum Langage
    Réponses: 6
    Dernier message: 11/06/2007, 15h46
  5. [ODBC] Comment mettre à jour 2 bases ayant des noms de champs différents ???
    Par Alexlesilex dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 11/05/2006, 17h08

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