内存流是空的

时间:2011-05-25 20:27:29

标签: c# xmltextwriter

我需要从不同的源(函数)生成一个巨大的xml文件。我决定使用XmlTextWriter,因为它使用的内存少于XmlDocument

首先,使用基础XmlWriter

发起MemoryStream
MemoryStream ms = new MemoryStream();
XmlTextWriter xmlWriter = new XmlTextWriter(ms, new UTF8Encoding(false, false));
xmlWriter.Formatting = Formatting.Indented;

然后我将XmlWriter(注意xml编写器保持打开直到最后)传递给函数以生成XML文件的开头:

xmlWriter.WriteStartDocument();

xmlWriter.WriteStartElement();

// xmlWriter.WriteEndElement(); // Do not write the end of root element in first function, to add more xml elements in following functions

xmlWriter.WriteEndDocument();
xmlWriter.Flush();

但是我发现底层内存流是空的(通过将字节数组转换为字符串和输出字符串)。有什么想法吗?

另外,我有一个关于如何从不同的源(函数)生成一个巨大的xml文件的一般性问题。我现在所做的是保持XmlWriter打开(我假设底层内存流也应该打开)到每个函数并写入。在第一个函数中,我没有写根元素的结尾。在最后一个函数之后,我手动添加根元素的结尾:

string endRoot = "</Root>";
byte[] byteEndRoot = Encoding.ASCII.GetBytes(endRoot);
ms.Write(byteEndRoot, 0, byteEndRoot.Length); 

不确定这是否有效。

非常感谢!

3 个答案:

答案 0 :(得分:6)

从技术上讲,每个问题你应该只问一个问题,所以我只会回答第一个问题,因为这只是我现在快速访问的一个问题。

在尝试从我认为的流中读取之前,您需要致电Flush

修改 只是从下面的评论中汲取我的第二次预感,以证明这里接受的答案。

除了调用Flush之外,如果使用Read方法及其兄弟来读取Stream,则必须先将流中的位置重置回到开头。否则不会读取任何字节。

答案 1 :(得分:1)

也许你需要在检查内存streazm之前在xml流上调用Flush()。

答案 2 :(得分:1)

确保在检查内存流之前在XmlTextWriter上调用Flush。