首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >XDocument:将XML保存到没有BOM的文件中

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

Stack Overflow用户
提问于 2011-02-09 08:46:30
回答 4查看 41.2K关注 0票数 53

我正在使用XDocument生成一个utf-8xml文件。

代码语言:javascript
运行
复制
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会附加到文件中吗?如果没有BOM,我如何保存该文件?

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

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-02-09 10:04:57

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

代码语言:javascript
运行
复制
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 ( boolean ),在您的例子中是false

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

票数 80
EN

Stack Overflow用户

发布于 2011-02-09 10:05:22

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

在没有BOM的情况下,您可以强制保存XML:

代码语言:javascript
运行
复制
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)

票数 44
EN

Stack Overflow用户

发布于 2011-11-04 08:47:27

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

代码语言:javascript
运行
复制
        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);

(这很麻烦,但是为了方便起见,至少你有一个格式良好的文件可以上传到你的在线提供商);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4942825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档