【问题标题】:c# How to load a memory stream to an xmldocument without BOM? (My memory stream is generated from XMLTextWriter without BOM)c#如何在没有BOM的情况下将内存流加载到xmldocument? (我的内存流是从没有 BOM 的 XMLTextWriter 生成的)
【发布时间】:2011-05-25 15:46:16
【问题描述】:

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

非常感谢!

【问题讨论】:

  • 不知道但发现了这个:stackoverflow.com/questions/1755958/…
  • 谢谢托比约恩。我知道问题是 doc.save(ms) 会添加 BOM。您发布的链接中的解决方案是使用 doc.save(xmlwriter) 并在 xmlwriter 中设置 encoding(false)。但是,是否可以在 doc.save(ms) 中省略 BOM?否则,我可能需要重写很多代码......

标签: c#


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 2018-07-10
    • 2012-01-15
    相关资源
    最近更新 更多