c#如何在没有BOM的情况下将内存流加载到xmldocument? 我的内存流是从不带BOM的XMLTextWriter生成的

问题描述

| 我的问题真的很奇怪,我需要在c#中从不同来源编写一个巨大的xml文件。 因此,首先,我使用XmlTextWriter写入内存流:
     MemoryStream ms=new MemoryStream();
     XmlWriterSettings settings = new XmlWriterSettings();
        settings.Indent = true;
        **settings.Encoding = new UTF8Encoding(false,false); // set UTF8 without BOM !!**
        XmlWriter xmlWriter = XmlWriter.Create(ms,settings);
        xmlWriter.WriteStartDocument();

        xmlWriter.WriteStartElement();

        xmlWriter.WriteEndElement(); 
        xmlWriter.WriteEndDocument()

        xmlWriter.Flush();

        xmlWriter.Close();
请注意,关闭xmlTextWriter后不会关闭ms。因此,我将ms传递给xmlDocument并编写xml元素的其他部分:
        XmlDocument doc = new XmlDocument();
        ms.Position=0;
        doc.Load(ms);
然后,我使用以下代码编写:
       XmlElement elmRoot=doc.DocumentElement(); //root
       XmlElement elm=doc.CreateElement(\"New Element\");
       XmlAttribute att=doc.CreateAttribute(\"att\");
       att.Value=\"ABC\";
       elm.Attributes.Append(att);
       elmRoot.AppendChild(elm);
       ms.Position=0;
       doc.Save(ms)
但是,经过上述操作,我发现ms在生成的xml文件的开头仍然有三个BOM,导致无法在浏览器中打开该文件。有任何想法吗? 非常感谢!     

解决方法

我不知道为什么您要再次覆盖MemoryStream,这似乎是个坏主意。 但是,如果您需要XDocument,则可以使用
XDocument.Save(XmlWriter writer)
选项,并确保使用无BOM设置创建编写器,如代码开头所示。