我正在使用XDocument
生成一个utf-8xml文件。
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
问题,还是我应该联系在线服务提供商的人要求语法分析器升级?
发布于 2011-02-09 10:04:57
使用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);
}
UTF8Encoding
类构造函数具有一个重载,该重载指定是否使用带有布尔值的BOM ( boolean ),在您的例子中是false
。
使用Notepad++对此代码的结果进行了验证,以检查文件的编码。
发布于 2011-02-09 10:05:22
首先,根据XML规范,服务提供者必须处理它,该规范规定,在UTF-8表示的情况下,可能存在BOM。
在没有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-11-04 08:47:27
在使用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);
(这很麻烦,但是为了方便起见,至少你有一个格式良好的文件可以上传到你的在线提供商);
https://stackoverflow.com/questions/4942825
复制相似问题