C# 如何强制XDocument输出;UTF-8“;在申报行吗?

C# 如何强制XDocument输出;UTF-8“;在申报行吗?,c#,xml,utf-8,linq-to-xml,C#,Xml,Utf 8,Linq To Xml,以下代码生成此输出: <?xml version="1.0" encoding="utf-16" standalone="yes"?> <customers> <customer> <firstName>Jim</firstName> <lastName>Smith</lastName> </customer> </customers> 请允许我回答我自己的问题,

以下代码生成此输出:

<?xml version="1.0" encoding="utf-16" standalone="yes"?>
<customers>
  <customer>
    <firstName>Jim</firstName>
    <lastName>Smith</lastName>
  </customer>
</customers>

请允许我回答我自己的问题,这似乎有效:

private static string BuildXmlWithLINQ()
{
    XDocument xdoc = new XDocument
    (
        new XDeclaration("1.0", "utf-8", "yes"),
        new XElement("customers",
            new XElement("customer",
                new XElement("firstName", "Jim"),
                new XElement("lastName", "Smith")
            )
        )
    );
    return xdoc.Declaration.ToString() + Environment.NewLine + xdoc.ToString();
}

这不是.NET中的错误。这是因为您使用
StringWriter
作为XDocument的目标。由于StringWriter在内部使用UTF-16,因此文档也必须使用UTF-16作为编码。如果将XDoc保存到流或文件中,它将按照说明使用UTF-8

有关详细信息,请参阅:

对于某些XML场景,必须写入包含StringWriter使用的编码的标头,此属性是必需的。这允许XML代码使用任意StringWriter并生成正确的XML头


您可以使用以下代码作为示例

XDocument doc = GetXmlDoc();
using (var stream = new MemoryStream())
{
    doc.Save(stream, SaveOptions.DisableFormatting);
    var docBytes = stream.ToArray();
    File.WriteAllBytes("fileName.xml", docBytes);
}

在我看来,序列化程序忽略了
XDeclaration
@KirkWoll中的这个值,这似乎是API中的一个错误,因为XML的默认编码是UTF8,所以可以忽略它。因此,它回避了一个问题:为什么需要在那里显式地编写UTF-8。问题可能是UTF-16存在,而不是没有UTF-8。另请参见线程。
XDocument doc = GetXmlDoc();
using (var stream = new MemoryStream())
{
    doc.Save(stream, SaveOptions.DisableFormatting);
    var docBytes = stream.ToArray();
    File.WriteAllBytes("fileName.xml", docBytes);
}