是否可以重用 XmlTextWriter 类的相同实例来生成更多 xml 文档?我的意思是这样的:

XmlTextWriter writer = new XmlTextWriter();
writer.WriteStartDocument();
writer.WriteStartElement("Message1");
writer.WriteEndElement();
writer.WriteEndDocument();

// do something with xml created
...

writer.Reset() // ?
writer.WriteStartDocument();
writer.WriteStartElement("Message2");
writer.WriteEndElement();
writer.WriteEndDocument();
// do something with xml created
...

最佳答案

简单的回答:是的,可以这样做。

但是如果底层流不指向文件,这将被实现。 MemoryStream 可能是一个很好的例子。

由于 MemoryStream 将流保存在“内存中”,您可以使用 XmlTextWriter 编写大量 XML 文件,并在结束每个文档后,执行 MemoryStream.ToArray() 并将其作为 File.WriteAllBytes 的参数。

写入所有字节后,您将清除内存流。

你可以通过调用 MemoryStream.SetLength 方法清除你的内存流并给 0 作为长度:

  • http://msdn.microsoft.com/en-us/library/system.io.memorystream.setlength.aspx

  • 在此处阅读有关 XmlTextWriter 构造函数的流重载的更多信息:
  • http://msdn.microsoft.com/en-us/library/ms162588.aspx

  • 这对于 File.WriteAllBytes:
  • http://msdn.microsoft.com/en-us/library/system.io.file.writeallbytes.aspx

  • 关于重用 XmlTextWriter 时的一些问题

    几年前@NigelTouch 对一些评论提出了关注:



    几个小时前,@Mike-EEE 遇到了同样的问题:



    顺便说一句,一些试错让我恢复了给定的 XmlTextWriter 以根据需要多次重用它:
        using(MemoryStream stream = new MemoryStream())
        using(StreamReader streamReader = new StreamReader(stream))
        using(XmlTextWriter writer = new XmlTextWriter(stream, Encoding.UTF8))
        {
            writer.WriteStartDocument(true);
            writer.WriteStartElement("a");
    
            try
            {
                throw new Exception();
            }
            catch
            {
                // This line makes de magic: ending the document
                // avoids the issue mentioned by @NigelTouch
                writer.WriteEndDocument();
                writer.Flush();
                stream.SetLength(0);
            }
    
    
            writer.WriteStartDocument(true);
            writer.WriteStartElement("b");
            writer.WriteEndElement();
            writer.Flush();
    
            stream.Position = 0;
    
            Console.WriteLine(streamReader.ReadToEnd());
    
        }
    

    10-08 13:17