2017-03-03 22 views
5

我使用C#輸出XML文件,我試着去設置的XML編碼值UTF-8,但其目前輸出:的XmlWriter編碼UTF-8在C#中使用的StringWriter

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

必須是簡單的東西我失蹤了?

+0

你能在.NETFiddle分享您的代碼? – aloisdg

+1

來自[此回答](Utf8StringWriter)(https://stackoverflow.com/questions/955611/xmlwriter-to-write-to-a-string-instead-of-to-a-file/955698#955698)應該工作。 – dbc

+1

你的代碼不能編譯 - 'StringWriterWithEncoding'沒有無參數的構造函數。或者,也許你的版本實際上有一個無參數的構造函數,它將'encoding'保留在其默認值(空值),這意味着'Encoding'返回null?這將解釋你的問題。無論如何,如果我做'StringWriterWithEncoding sw = new StringWriterWithEncoding(Encoding.UTF8);'一切工作正常。示例[fiddle](https://dotnetfiddle.net/JxACgB)。 – dbc

回答

7

您的代碼不編譯 - 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; } 
    } 
} 
1

只需使用輸出文件名稱爲XmlWriter的,而不是StringWriterWithEncoding:

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

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