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 :

[XML Serial.] Eviter les "short end tags"


Sujet :

C#

  1. #1
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 24
    Par défaut [XML Serial.] Eviter les "short end tags"
    Salut à tous,

    Alors voilà je rencontre un petit problème dans une sérialisation XML. J'utilise XmlWriter et XmlSerializer.

    J'ai un objet, qui peut contenir des propriétés de type chaines de caractères, vides.

    Lors de la sérialisation, je récupère:
    <MaPropriete />

    Or le système avec lequel je communique en XML, ne comprend pas cette syntaxe, il veut :
    <MaPropriete></MaPropriete>

    Apparement ça s'appelle "full/short end tag", mais je n'ai rien trouvé sur la manière comment forcer cela.

    Avez vous des pistes ?

    Merci par avance

    Flo.

  2. #2
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Salut,
    J'ai vu passer une solution que je n'ai pas testée. Elle consisterai à dériver XmlTextWriter de la manière suivante :
    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class MyXmlTextWriter : XmlTextWriter
    {
        public MyXmlTextWriterEE( TextWriter tw) : base(tw)
        {}
     
        public override void WriteEndElement()
        {
            base.WriteFullEndElement();
        }
    }
    De cette manière, en utilisant un MyXmlTextWriter au lieu d'un XmlTextWriter classique, l'écriture du end tag est forcément faite avec le full end tag.

  3. #3
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 24
    Par défaut
    Salut et merci

    J'ai effectivement vu cette solution également, mais le problème c'est que je ne vois pas comment l'intégrer à mon projet, étant donné que j'utilise XmlSerializer pour sérialiser, c'est pas moi qui le fait à la main.
    Une idée ?

    Merci

  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 : 48
    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
    Tu peux implémenter IXmlSerializable, afin d'indiquer comment doit être sérialisé/désérialisé l'objet (cf. cet article).

    Tu peux aussi modifier le flux XML après génération. L'idée c'est de remplacer les <balise /> par <balise></balise> dans le texte.

    Par exemple avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string input = "<balise />";
    string output = Regex.Replace(input, @"<(\w+) />", "<$1></$1>");
    output sera égal à <balise></balise>.

  5. #5
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Ou utiliser la solution donnée :
    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    MaClasse obj = new MaClasse(); // L'objet à sérialiser
    XmlSerializer ser = new XmlSerializer(typeof(MaClasse));
    MyXmlTextWriter xtw = new MyXmlTextWriter("c:\monfichier.xml");
    ser.Serialize(xtw, obj);

    Tu peux également dériver XmlSerializer et sa méthode CreateWriter afin qu'elle retourne un MyXmlTextWriter.

  6. #6
    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 : 45
    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 FloBaoti Voir le message
    Or le système avec lequel je communique en XML, ne comprend pas cette syntaxe, il veut :
    <MaPropriete></MaPropriete>
    Ben je sais pas qui développe ce système, mais il faudrait leur dire que leur implémentation est un peu (complètement) foireuse

    Citation Envoyé par StormimOn Voir le message
    Tu peux implémenter IXmlSerializable, afin d'indiquer comment doit être sérialisé/désérialisé l'objet (cf. cet article).
    Merci pour la pub
    Mais à mon avis dans son cas ce serait un peu comme utiliser un bulldozer pour écraser une mouche

    Je pense que la solution de ctxnop est la plus simple

    Citation Envoyé par FloBaoti Voir le message
    je ne vois pas comment l'intégrer à mon projet, étant donné que j'utilise XmlSerializer pour sérialiser, c'est pas moi qui le fait à la main.
    Non, mais le XmlSerializer peut écrire, entre autres, dans un XmlWriter... il suffit que tu fournisses au XmlSerializer une instance de MyXmlTextWriter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    XmlSerializer xs = ...
     
    using (StreamWriter wr = new StreamWriter("fichier.xml"))
    {
        using (MyXmlTextWriter xmlWriter = new MyXmlTextWriter(wr))
        {
            xs.Serialize(xmlWriter, unObject);
        }
    }

  7. #7
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 24
    Par défaut
    Ah ok je pensais pas que ça fonctionnait comme ça, je pensais que la sérialisation en elle-même était faite à l'intérieur de XmlSerializer!
    J'essaye ça et je met résolu si c'est bon

    Merci beaucoup

  8. #8
    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 : 45
    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 FloBaoti Voir le message
    je pensais que la sérialisation en elle-même était faite à l'intérieur de XmlSerializer!
    Oui et non... en fait, le principal boulot du XmlSerializer est de générer dynamiquement du code de sérialisation pour la classe, donc ce n'est jamais XmlSerializer lui-même qui sérialise (plus d'infos à ce sujet dans mon dernier tuto).
    Mais de toutes façons, l'écriture du XML se fait toujours via un XmlWriter (ou XmlTextWriter) : soit tu le passes directementen paramètre, soit il est créé en interne sur le Stream ou le TextWriter que tu passes en paramètre.

  9. #9
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 24
    Par défaut
    ok merci des infos !!

    Donc voilà je pense avoir réussi à mettre ce système en place :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class MyXmlTextWriter : XmlTextWriter
            {
                public MyXmlTextWriter(Stream stream, Encoding encoding) : base(stream, encoding) { }
     
                public override void WriteEndElement()
                {
                    this.WriteFullEndElement();
                }
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    using (MyXmlTextWriter writer = new MyXmlTextWriter(myOutputStream, Encoding.GetEncoding("utf-8")))
                {
                            // ...
                }

    Par contre, pourquoi je ne peux faire ceci qu'avec XmlTextWriter ? Et non pas avec XmlWriter ? J'ai énormément d'erreurs si j'essaye de dériver XmlWriter (des méthodes abstraites à réimplémenter...).
    Ca ne me dérange pas, mais bon...

  10. #10
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Parce que XmlWriter est une classe abstraite.
    Dans le XmlSerializer, une variable de type XmlWriter existe et c'est elle qui est utilisée. Mais ce n'est pas une classe instanciable. Pour la simple et bonne raison qu'il y a du code qui ne peux être générique suivant où et comment tu veux écrire ton Xml.
    Ils fournissent alors un XmlTextWriter qui dérive de XmlWriter et qui implémente toutes les méthodes abstraite de ce dernier et qui sera utilisé dans 90% des cas, mais si un jour tu dois écrire ton Xml sur un support où d'une manière non supportée par XmlTextWriter, il te faudra dériver XmlWriter pour implémenter tes propres méthodes.

    Dans ton cas, tu n'a besoin que de changer légèrement le comportement du XmlTextWriter, donc tu dérives de lui et pas d'autre chose.

  11. #11
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 24
    Par défaut
    Ok très bien, merci beaucoup

  12. #12
    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 : 45
    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 FloBaoti Voir le message
    Par contre, pourquoi je ne peux faire ceci qu'avec XmlTextWriter ? Et non pas avec XmlWriter ? J'ai énormément d'erreurs si j'essaye de dériver XmlWriter (des méthodes abstraites à réimplémenter...).
    Parce que la classe XmlWriter est abstraite. Plutôt que de tout implémenter manuellement, autant partir d'une implémentation existante, comme XmlTextWriter

  13. #13
    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 : 48
    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 ctxnop Voir le message
    Ou utiliser la solution donnée :
    ...
    Effectivement. J'apprendrais à lire pour la prochaine fois

  14. #14
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Citation Envoyé par StormimOn Voir le message
    Effectivement. J'apprendrais à lire pour la prochaine fois
    Ca arrive a tout le monde, on va mettre ca sur le coup de la fatigue comme d'hab

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/04/2009, 09h35
  2. XML.Serialize : pb avec les booléan
    Par MayOL69bg dans le forum Windows Forms
    Réponses: 6
    Dernier message: 14/11/2007, 11h26
  3. [XML Serializer] Comment enlever les propriétés vides ?
    Par BillGates12345 dans le forum EDI/Outils
    Réponses: 5
    Dernier message: 02/08/2006, 11h49

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