默认情况下,.NET中生成的Unicode的XML文件都带有BOM头。然而,群中有人问到:在一些特殊情况下,如果不想生成这个BOM头,应该怎么办呢?

 

查了下MSDN,果然有办法。

 

先看默认的XMLWriter的用法:

 

        public static void WriteFile()
        {
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            settings.IndentChars = ("    ");
            using (XmlWriter writer = XmlWriter.Create("books.xml", settings))
            {
                // Write XML data.
                writer.WriteStartElement("book");
                writer.WriteElementString("price", "19.95");
                writer.WriteEndElement();
                writer.Flush();
            }

        }

 

这样写会在XML头部添加BOM。要解决问题,请看以下的代码:

 

        public static void WriteFile()
        {
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Encoding = new UTF8Encoding(false);
            settings.Indent = true;
            settings.IndentChars = ("    ");
            using (XmlWriter writer = XmlWriter.Create("books.xml", settings))
            {
                // Write XML data.
                writer.WriteStartElement("book");
                writer.WriteElementString("price", "19.95");
                writer.WriteEndElement();
                writer.Flush();
            }

        }
我们需要给settings对象设置一个新的Encoding实例,这个实例是不会添加BOM的。而默认的实例会添加BOM。
请注意构造函数传入了false参数,这会通知Encoding实例不写入BOM。
 
以下分别是两段代码的输出效果:
 
image 
 
image 
 
我们可以发现前一个文件在头部多了三个字节,分别是ef bb bf,这就是BOM标志了。哈哈。