51

正在使用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);

该文件已正确生成并使用 xsd 文件成功验证。

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

您知道为什么 BOM 会附加到文件中吗?如果没有它,我该如何保存文件?

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

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

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

4

4 回答 4

79

使用 anXmlTextWriter并将其传递给 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);
}

UTF8Encoding构造函数有一个重载,它指定在您的情况下是否使用带有布尔值的 BOM(字节顺序标记)false

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

于 2011-02-09T10:04:57.893 回答
44

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

您可以像这样强制保存没有 BOM 的 XML:

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

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

于 2011-02-09T10:05:22.963 回答
0

使用XDocument时摆脱 BOM 字符的最便捷方法是仅保存文档,然后直接将文件读取为文件,然后将其写回。文件例程将为您删除字符:

        XDocument xTasks = new XDocument();
        XElement xRoot = new XElement("tasklist",
            new XAttribute("timestamp",lastUpdated),
            new XElement("lasttask",lastTask)
        );
        ...
        xTasks.Add(xRoot);
        xTasks.Save("tasks.xml");

        // read it straight in, write it straight back out. Done.
        string[] lines = File.ReadAllLines("tasks.xml");
        File.WriteAllLines("tasks.xml",lines);

(这很奇怪,但它是为了方便起见 - 至少你会有一个格式良好的文件上传到你的在线提供商);)

于 2011-11-04T08:47:27.307 回答
-1

通过 UTF-8 文档

String XMLDec = xDoc.Declaration.ToString();
StringBuilder sb = new StringBuilder(XMLDec);
sb.Append(xDoc.ToString());
Encoding encoding = new UTF8Encoding(false); // false = without BOM
File.WriteAllText(outPath, sb.ToString(), encoding); 
于 2020-12-02T11:23:31.213 回答