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 :

Obtenir un XML Encodé UTF-8 ?


Sujet :

C#

  1. #1
    CUCARACHA
    Invité(e)
    Par défaut Obtenir un XML Encodé UTF-8 ?
    Bonjour,

    Je me suis fait une petite XML Factory

    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
     
        public class XMLFactory
        {
     
            public XDocument CurrentDocument { get; set; }
     
            public XMLFactory(string xmlDocumentString)
            {
                this.CurrentDocument = XDocument.Load(new StringReader(xmlDocumentString));
            }
     
     
            public string SaveToString()
            {
                string toReturn = string.Empty;
                XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
                xmlWriterSettings.Encoding = new UTF8Encoding();            
                StringBuilder sb = new StringBuilder();
                using (XmlWriter writer = XmlWriter.Create(sb,xmlWriterSettings))
                {
                    this.CurrentDocument.Save(writer);
                }
                toReturn = sb.ToString();
                return toReturn;
            }
        }
    Lorsque je passe la chaine XML au constructeur, elle arrive en utf-8.
    Lorsque j'utilise le this.CurrentDocument.Save(writer); elle ressort en utf-16 malgré le

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
    xmlWriterSettings.Encoding = new UTF8Encoding();
    Vous pourriez m'aider à faire en sorte que l'encodage ne change pas ?

    D'avance merci

    Laurent
    Dernière modification par Deepin ; 26/03/2012 à 11h38.

  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
    Points : 39 753
    Points
    39 753
    Par défaut
    Tu crées ton XmlWriter avec un StringBuilder, ce qui en coulisse utilise en fait un StringWriter (dérivé de TextWriter). Et quand tu crées un XmlWriter sur un TextWriter, ça utilise toujours l'encodage spécifié par le TextWriter (même si tu mets autre chose dans les settings), donc UTF-16 dans le cas de StringWriter (puisque les chaines .NET en mémoire sont dans cet encodage).

    Si tu veux choisir l'encodage, il faut donc s'y prendre autrement. Par exemple tu peux utiliser un MemoryStream :

    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
            public string SaveToString()
            {
                string toReturn = string.Empty;
                XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
                xmlWriterSettings.Encoding = new UTF8Encoding();            
                using (var stream = new MemoryStream())
                {
                    using (XmlWriter writer = XmlWriter.Create(stream, xmlWriterSettings))
                    {
                        this.CurrentDocument.Save(writer);
                    }
                    toReturn = Encoding.UTF8.GetString(stream.ToArray());
                }
                return toReturn;
            }
    Soit dit en passant, évite de manipuler ton document XML sous forme de chaine, sinon tu vas tout le temps rencontrer ce genre d'obstacle... garde le plutôt sous forme de XDocument, et enregistre le au dernier moment vers le flux que tu veux.

  3. #3
    CUCARACHA
    Invité(e)
    Par défaut
    Merci pour ton aide...

    En fait, je consomme un web service SOAP qui prend des chaines XML en entrée et qui produit des XML en sortie mais je pense que les développeurs du service ont du se taper toute la partie XML à la main car lorsque je me conforme aux xsd, ça ne passe pas toujours, je dois faire des retouches de la chaine de caracètres comme retirer les CRLF et les LF, bref, dans le meilleur des mondes je te rejoins sur le fait de rester en XML mais dans ce contexte, je n'ai pas trop le choix...

    ++

    Laurent

  4. #4
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Citation Envoyé par Laurent Jordi Voir le message
    je dois faire des retouches de la chaine de caracètres comme retirer les CRLF et les LF
    Euh? Je doute qu'un retour chariot fasse échouer une validation xsd

  5. #5
    CUCARACHA
    Invité(e)
    Par défaut
    Ben si... je crois qu'ils ont du faire un parseur à l'ancienne...

  6. #6
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Citation Envoyé par Laurent Jordi Voir le message
    Ben si... je crois qu'ils ont du faire un parseur à l'ancienne...
    L'erreur est chez toi ou chez eux?

  7. #7
    CUCARACHA
    Invité(e)
    Par défaut
    Etant donné que lorsque je passe un XML Correctement formaté et indenté, qu'il ne passe pas alors que le même XML sans espace ni saut de ligne entre les balises fonctionne, je dis que c'est chez eux qu'il y a un problème... Mais là n'est pas le débat, je ne cherche pas une excuse mais juste une solution. Je testerais ta suggestion lundi.
    Merci

    ++

  8. #8
    CUCARACHA
    Invité(e)
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Tu crées ton XmlWriter avec un StringBuilder...
    Ça marche nikel, merci

    ++

    Laurent

Discussions similaires

  1. XML Encoding UTF-8 problème de majuscule
    Par rj450 dans le forum C#
    Réponses: 2
    Dernier message: 20/03/2013, 16h25
  2. Lire XML encodé UTF-8 sans noeud
    Par Bobdelariege dans le forum VB.NET
    Réponses: 1
    Dernier message: 23/06/2010, 11h13
  3. Apache/PHP, xml encoding=UTF-8
    Par Shmitabidf dans le forum Apache
    Réponses: 8
    Dernier message: 27/11/2009, 11h50
  4. instruction pour xml Encoder utf-8
    Par totoche dans le forum ASP
    Réponses: 7
    Dernier message: 14/02/2007, 11h03
  5. [1.1] Supprimer xml vers=1.0 encod=utf-8
    Par Nip dans le forum ASP.NET
    Réponses: 9
    Dernier message: 24/11/2005, 16h09

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