重用XmlTextWriter类

时间:2011-02-07 08:20:06

标签: c# xml xmltextwriter

是否可以重用相同的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
...

3 个答案:

答案 0 :(得分:2)

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

但如果底层流未指向文件,则会发生这种情况。 MemoryStream就是一个很好的例子。

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

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

您可以通过调用MemoryStream.SetLength方法清除内存流,并将长度设为0:

在这里阅读更多关于XmlTextWriter构造函数的流重载:

这适用于File.WriteAllBytes:

关于重用XmlTextWriter

时的一些问题

几年前,@ NigelTouch对一些评论提出了一个担忧:

  

我发现的问题是如果异常被抛出中途   通过,例如在WriteStartElement()之后,即使你   Flush()写入器并将Stream长度设置为0,Writer保持不变   在一个WriteState of Element中。当你启动下一个文件时,它   以结束“>”开头(例如)。避免重复使用

几个小时前,@ 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());

    }

答案 1 :(得分:1)

XmlTextWriter课程:

  

表示一个编写器,它提供快速,非缓存,仅向前方式生成包含符合W3C可扩展标记语言(XML)1.0和命名空间的XML数据的流或文件。 XML建议。

(强调我的)

该类不提供Reset或任何类似的功能,也不提供对底层流的访问。如果您自己可以访问基础流,则可以自行重置该流。

这意味着无法直接重复使用它。

答案 2 :(得分:0)

我猜flush会大致满足你的要求。只需构建并检索XML,flush,rince,repeat;)

干杯。