首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重用XmlTextWriter类

重用XmlTextWriter类
EN

Stack Overflow用户
提问于 2011-02-07 16:20:06
回答 3查看 1.5K关注 0票数 4

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

代码语言:javascript
复制
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
...
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-07 16:24:45

答案很简单:是的,这样做是可能的。

但是,如果底层流不指向文件,就会实现这一点。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在一些评论中提出了一个担忧:

我发现的问题是,如果在中途抛出异常,例如在WriteStartElement()之后,那么即使您刷新了

()并将Stream length设置为0,Writer仍然保留在元素的WriteState中。当您开始下一个文档时,它以闭合的">“开头(例如)。避免重用

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

请提供示例解决方案的工作代码。我遇到了和奈杰尔描述的一样的问题

顺便说一句,一个小小的试错让我恢复一个给定的XmlTextWriter,让它重复使用你想要的次数:

代码语言:javascript
复制
    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());

    }
票数 2
EN

Stack Overflow用户

发布于 2011-02-07 16:23:28

XmlTextWriter类:

代表了一种编写器,它提供了一种快速的、非缓存的、只向前的方法,用于生成包含W3C数据的流或文件,这些流或文件符合XML Language (XML1.0)和XML in XML建议。

(强调我的)

该类不提供Reset或任何类似的函数,也不提供对底层流的访问。如果您自己有权访问底层流,则可以自行重置该流。

这都意味着不可能直接重用它。

票数 2
EN

Stack Overflow用户

发布于 2011-02-07 16:23:32

我猜flush大概会按照你的要求去做。只需构建和检索XML,刷新、冲洗、重复;)

干杯。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4919210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档