[C#] XMLWriter Encoding Issue / XMLWriter 控制文字編碼

一般狀況下,如果不是很在意使用 XMLWriter 後輸出的文字編碼是哪一種的話,可以很簡單地用下面的方式完成

StringBuilder sb = new StringBuilder();
XmlWriter writer = XmlWriter.Create(sb);

writer.WriteStartDocument();
//補上 xml 內容, 用 writer.WriteStartElement() 等完成
writer.WriteEndDocument();

writer.Flush();

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(sb.ToString());

但是可以發現到這樣子所輸出的 XML 文件是變成 UTF-16 encoding。雖然有 XmlWriterSettings 這東西可以去設定 XMLWriter 的編碼,不過看起來好像是有些問題,輸出的 XML 結果依舊是 UTF-16。

解決的方法是用 MemoryStream 與 XMLTextWriter。

MemoryStream stream = new MemoryStream();
XmlWriter writer = new XmlTextWriter(stream, Encoding.UTF8);

writer.WriteStartDocument();
//補上 xml 內容, 用 writer.WriteStartElement() 等完成
writer.WriteEndDocument();

writer.Flush();

StreamReader reader = new StreamReader(stream, Encoding.UTF8, true);
stream.Seek(0, SeekOrigin.Begin);
string result = reader.ReadToEnd();

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(result);