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