web-dev-qa-db-fra.com

XmlWriter encodant UTF-8 en utilisant StringWriter en C #

J'utilise C # pour générer un fichier XML et je tente de définir la valeur d'encodage XML sur UTF-8, mais le résultat est actuellement affiché:

<?xml version="1.0"?>

Ceci est mon code:

public sealed class StringWriterWithEncoding: StringWriter {
    private readonly Encoding encoding;

    public StringWriterWithEncoding(Encoding encoding) {
        this.encoding = encoding;
    }

    public override Encoding Encoding {
        get {
            return encoding;
        }
    }
}

private string GetXml(JobStore jobStore) {
    StringWriterWithEncoding sw = new StringWriterWithEncoding();
    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Encoding = Encoding.UTF8;
    settings.Encoding = Encoding.GetEncoding("utf-8");
    settings.Indent = true;
    using(var writer = XmlWriter.Create(sw, settings)) {
        writer.WriteStartDocument();
        writer.WriteStartElement("resources");

        writer.WriteStartElement("string");
        writer.WriteAttributeString("name");
        writer.WriteCData("value");
        writer.WriteEndElement();

        writer.WriteEndElement();
        writer.WriteEndDocument();
    }
    return sw.ToString();
}

Doit être quelque chose de simple me manque?

5
Web Tech

Votre code ne compile pas - StringWriterWithEncoding n'a pas de constructeur sans paramètre. Ou, si elle a un constructeur sans paramètre, peut-être que ça ressemble à ça?

public sealed class StringWriterWithEncoding : StringWriter
{
    private readonly Encoding encoding;

    public StringWriterWithEncoding() { }

    public StringWriterWithEncoding(Encoding encoding)
    {
        this.encoding = encoding;
    }

    public override Encoding Encoding
    {
        get { return encoding; }
    }
}

Si tel est le cas, cela expliquerait votre problème: le champ encoding a été laissé à sa valeur par défaut (null), ce qui signifie que Encoding renvoie null et qu'aucun codage n'apparaîtra dans le fichier XML.

Pour résoudre ce problème, éliminez le constructeur sans paramètre et faites:

var sw = new StringWriterWithEncoding(Encoding.UTF8);

Ou changez le constructeur sans paramètre pour définir explicitement Encoding.UTF8:

public sealed class StringWriterWithEncoding : StringWriter
{
    private readonly Encoding encoding;

    public StringWriterWithEncoding() : this(Encoding.UTF8) { }

    public StringWriterWithEncoding(Encoding encoding)
    {
        this.encoding = encoding;
    }

    public override Encoding Encoding
    {
        get { return encoding; }
    }
}
11
dbc

Utilisez simplement le nom du fichier de sortie pour XmlWriter au lieu de StringWriterWithEncoding:

var settings = new XmlWriterSettings
{
    Encoding = Encoding.UTF8,
    Indent = true
};

using (var writer = XmlWriter.Create(filePathName, settings))
{
    ...
0
Interferank