web-dev-qa-db-ja.com

C#でStringWriterを使用してXmlWriterでUTF-8をエンコードする

私はC#を使用してxmlファイルを出力していて、xmlエンコーディング値をUTF-8に設定しようとしていますが、現在は次のように出力しています。

<?xml version="1.0"?>

これは私のコードです:

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();
}

私が見逃している単純なものでなければなりませんか?

7
Web Tech

コードがコンパイルされない-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; }
    }
}

もしそうなら、それはあなたの問題を説明します-フィールドencodingはデフォルト(null)値のままになっています。つまり、Encodingはnullを返すため、XMLファイルにエンコーディングは表示されません。

これを修正するには、パラメーターのないコンストラクターを削除し、次のようにします。

var sw = new StringWriterWithEncoding(Encoding.UTF8);

または、パラメータなしのコンストラクタを変更して、明示的に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; }
    }
}
15
dbc

StringWriterWithEncodingの代わりにXmlWriterの出力ファイル名を使用するだけです。

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

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