当保存一个XmlDocument时,会忽略XmlDeclaration(UTF8)中的编码?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (68)

我有以下代码:

var doc = new XmlDocument();

XmlDeclaration xmlDeclaration = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
doc.AppendChild(xmlDeclaration);

XmlElement root = doc.CreateElement("myRoot");
doc.AppendChild(root);
root.InnerText = "myInnerText";

StringWriter sw = new StringWriter();
doc.Save(sw);
Console.WriteLine(sw.ToString());

Console.WriteLine();

MemoryStream ms = new MemoryStream();
doc.Save(ms);
Console.WriteLine(Encoding.ASCII.GetString(ms.ToArray()));

这是输出:

<?xml version="1.0" encoding="utf-16"?>
<myRoot>myInnerText</myRoot>

???<?xml version="1.0" encoding="UTF-8"?>
<myRoot>myInnerText</myRoot>

它是一个xml文件,并将编码设置为utf8,但是当它将其保存到字符串,它会忽略我的编码,并使用utf16。但是,使用内存流时,它使用utf8

为什么是这样?

提问于
用户回答回答于

因为你所做的只是设置一个XML元素来表示它是UTF-8,所以你实际上并不把它保存为UTF-8。您需要将输出流设置为使用UTF-8,如下所示:

var doc = new XmlDocument();
XmlElement root = doc.CreateElement("myRoot");
doc.AppendChild(root);
root.InnerText = "myInnerText";
using(TextWriter sw = new StreamWriter("C:\\output.txt", false, Encoding.UTF8)) //Set encoding
{
    doc.Save(sw);
}
用户回答回答于

TextWriter上的编码决定了编码(XmlDeclaration节点的编码由TextWriter的编码替换)。如果在TextWriter上没有指定编码,则保存XmlDocument而没有编码属性。

如果要使用XmlDeclaration中的编码,则需要使用流来保存文档。

扫码关注云+社区

领取腾讯云代金券