我看到一些我不期望使用XmlTextWriter的行为。当我通过
实例化编写器时指定编码new XmlTextWriter(fs, Encoding.UTF8)
或
XmlWriter.Create(fs, new XmlWriterSettings(){Encoding = Encoding.UTF8} )
生成的文档在文档开头有一个前导十六进制字符。由于我传递XML的C ++解析器无法读取此内容,因此我想避免使用此字符。有趣的是,当我像这样创作作家时
new XmlTextWriter(fs, null)
我得到了我期望的确切行为。如何在不离开参数null的情况下在代码中直接执行此实例化?
答案 0 :(得分:2)
我认为“前导十六进制字符”是一个字节顺序标记(BOM),因为我对您的问题发表了评论,但我实际上看不到它就无法确定。 C ++解析器似乎不知道BOM,这很奇怪(见standard reference by Joel Spolsky)。
假设C ++解析器仅适用于编码为UTF-8的XML或其字符子集之一(ASCII,ISO-8859-1等)。在这种情况下,您没有选择,只能编码为UTF-8但排除BOM。 XmlWriter
允许您执行以下操作:
var utf8NoBom = new UTF8Encoding(false);
var writer = XmlWriter.Create(fs, new XmlWriterSettings() { Encoding = utf8NoBom } );
以下引用来自XmlWriter.Create上的MSDN参考:
XmlWriter始终将字节顺序标记(BOM)写入基础数据流;但是,某些流必须没有BOM。要省略BOM,请创建一个新的XmlWriterSettings对象,并将Encoding属性设置为新的UTF8Encoding对象,并将构造函数中的布尔值设置为false。
编辑:如果C ++解析器是一个通用的XML解析器,那么它对BOM的无知就是奇怪的。如果解析器是特定于域的,即如果它总是与其字符编码已知(并且明显受限)的文件一起使用,那么它的无知就不是奇怪的。我认为这是斯波尔斯基的观点。