在C#中使用StringWriter编码UTF-8的XmlWriter

Web*_*ech 5 c# xml encoding xmlwriter utf-8

我正在使用C#输出一个xml文件,我试图将xml编码值设置为UTF-8,但它当前正在输出:

<?xml version="1.0"?>
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

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();
}
Run Code Online (Sandbox Code Playgroud)

一定是简单的我错过了吗?

dbc*_*dbc 13

您的代码无法编译 - StringWriterWithEncoding没有无参数构造函数.或者,如果它确实有一个无参数构造函数,也许它实际上看起来像这样?

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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果是这样,那将解释您的问题 - 该字段encoding已保留其默认值(null),即Encoding返回null,因此XML文件中不会出现任何编码.

要修复它,删除无参数构造函数,并执行:

var sw = new StringWriterWithEncoding(Encoding.UTF8);
Run Code Online (Sandbox Code Playgroud)

或者将无参数构造函数更改为显式设置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; }
    }
}
Run Code Online (Sandbox Code Playgroud)