有没有办法在没有 BOM 的情况下输出 XDocument 的内容?使用 Flash 读取输出时,会导致错误。
7 回答
如果您使用 XmlWriter 编写 XML,则可以将 Encoding 设置为已初始化的编码以省略 BOM。
EG:System.Text.UTF8Encoding 的构造函数采用布尔值来指定是否需要 BOM,因此:
XmlWriter writer = XmlWriter.Create("foo.xml");
writer.Settings.Encoding = new System.Text.UTF8Encoding(false);
myXDocument.WriteTo(writer);
将创建一个使用 UTF-8 编码且没有字节顺序标记的 XmlWriter。
对 Chris Wenham 的回答稍加修改。
一旦创建了 XmlWriter 就不能修改编码,但是可以在创建 XmlWriter 时使用 XmlWriterSettings 设置它
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = new System.Text.UTF8Encoding(false);
XmlWriter writer = XmlWriter.Create("foo.xml", settings);
myXDocument.WriteTo(writer);
我无法在上面添加评论,但如果有人使用 Chris Wenham 的建议,请记住处置作者!我花了一些时间想知道为什么我的输出被截断,这就是原因。
建议using(XmlWriter...) {...}
更改 Chris 的建议
一种帖子的组合,可能是这样的:
MemoryStream ms = new MemoryStream();
StreamWriter writer = new StreamWriter(ms, new UTF8Encoding(false));
xmlDocument.Save(writer);
如前所述,这个问题有难闻的气味。
根据此支持说明,Flash 使用 BOM 来消除 UTF-16BE 和 UTF-16LE 之间的歧义,这是理所当然的。所以你不应该从 Flash 中得到错误:XDocument 生成 UTF16 编码的格式良好的 XML,Macromedia 声称 Flash 可以读取 UTF16 编码的格式良好的 XML。
这让我怀疑无论您遇到什么问题,它都可能不是由 BOM 引起的。如果是我,我会更多地挖掘,并期望实际问题出在其他地方。
您可能可以在输出上使用 System.Text.Encoding.Convert() ;就像要尝试的东西,而不是我测试过的东西。
将其转换为字符串,然后自己删除标记。