XDocument:将XML保存到没有BOM的文件

sys*_*out 38 c# byte-order-mark linq-to-xml

我正在使用生成utf-8 XML文件XDocument.

XDocument xml_document = new XDocument(
                    new XDeclaration("1.0", "utf-8", null),
                    new XElement(ROOT_NAME,                    
                    new XAttribute("note", note)
                )
            );
...
xml_document.Save(@file_path);
Run Code Online (Sandbox Code Playgroud)

正确生成文件并使用xsd文件成功验证.

当我尝试将XML文件上传到在线服务时,该服务说我的文件是wrong at line 1; 我发现问题是由文件的第一个字节上的BOM引起的.

你知道为什么将BOM附加到文件中,如何在没有它的情况下保存文件?

字节顺序标记维基百科文章中所述:

虽然Unicode标准允许使用UTF-8的BOM, 但它不需要或推荐它.字节顺序在UTF-8中没有意义,因此BOM仅用于将文本流或文件标识为UTF-8或者是从具有BOM的另一种格式转换的

这是一个XDocument问题还是我应该联系在线服务提供商的人员要求解析器升级?

Qui*_*ith 67

使用an XmlTextWriter并将其传递给XDocument的Save()方法,这样您就可以更好地控制所使用的编码类型:

var doc = new XDocument(
    new XDeclaration("1.0", "utf-8", null),
    new XElement("root", new XAttribute("note", "boogers"))
);
using (var writer = new XmlTextWriter(".\\boogers.xml", new UTF8Encoding(false)))
{
    doc.Save(writer);
}
Run Code Online (Sandbox Code Playgroud)

UTF8Encoding类的构造函数有指定是否与一个布尔值,用BOM(字节顺序标记),你的情况过载false.

使用Notepad ++验证了此代码的结果,以检查文件的编码.

  • 考虑添加`writer.Formatting = Formatting.Indented;` (9认同)
  • *警告:*Dercsár的解决方案更好."从.NET Framework 2.0开始,我们建议您使用XmlWriter.Create方法和XmlWriterSettings类创建XmlWriter实例,以利用新功能." 来源:[XmlTextWriter构造函数(字符串,编码)(System.Xml)](https://msdn.microsoft.com/en-us/library/5366y21d(v = vs.110).aspx) (2认同)

Der*_*sár 29

首先:服务提供商必须根据XML规范处理它,该规范声明在UTF-8表示的情况下可能存在BOM.

您可以强制保存XML而不使用BOM,如下所示:

XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = new UTF8Encoding(false); // The false means, do not emit the BOM.
using (XmlWriter w = XmlWriter.Create("my.xml", settings))
{
    doc.Save(w);
}
Run Code Online (Sandbox Code Playgroud)

(从这里用Google搜索:http://social.msdn.microsoft.com/Forums/en/xmlandnetfx/thread/ccc08c65-01d7-43c6-adf3-1fc70fdb026a)

  • 警告:这样做而不仅仅是 `doc.Save(filename)` 有副作用:所有内容都写在一行上。如果您希望您的文件保持人类可读,请考虑在此答案的代码中添加 `settings.Indent = true;`。 (4认同)
  • "虽然Unicode标准允许使用UTF-8中的BOM,但它不需要或推荐它.字节顺序在UTF-8中没有意义" - http://en.wikipedia.org/wiki/Byte_order_mark (2认同)