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

时间:2011-05-25 15:46:17

标签: c#

我的问题很奇怪。我需要在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,导致该文件无法在浏览器中打开。有什么想法吗?

非常感谢!

1 个答案:

答案 0 :(得分:1)

我不知道你为什么再次覆盖MemoryStream,这似乎是一个坏主意。

但是如果您需要XDocument,那么您可以使用XDocument.Save(XmlWriter writer)选项,并确保使用no-BOM设置创建编写器,如代码开头所示。