是否可以重用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
...发布于 2011-02-07 16:24:45
答案很简单:是的,这样做是可能的。
但是,如果底层流不指向文件,就会实现这一点。MemoryStream就是一个很好的例子。
因为MemoryStream将流保存在“内存中”,所以您可以用XmlTextWriter编写许多XML文件,在结束每个文档之后,执行一个MemoryStream.ToArray()并将其作为File.WriteAllBytes的参数。
在写入所有字节之后,您将清除内存流。
你可以通过调用MemoryStream.SetLength方法来清除你的内存流,长度为0:
在这里阅读更多,关于XmlTextWriter构造函数的流重载:
这是针对File.WriteAllBytes的:
关于重用XmlTextWriter时的一些注意事项
几年前,@NigelTouch在一些评论中提出了一个担忧:
我发现的问题是,如果在中途抛出异常,例如在WriteStartElement()之后,那么即使您刷新了
()并将Stream length设置为0,Writer仍然保留在元素的WriteState中。当您开始下一个文档时,它以闭合的">“开头(例如)。避免重用
几个小时前,@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());
}发布于 2011-02-07 16:23:28
XmlTextWriter类:
代表了一种编写器,它提供了一种快速的、非缓存的、只向前的方法,用于生成包含W3C数据的流或文件,这些流或文件符合XML Language (XML1.0)和XML in XML建议。
(强调我的)
该类不提供Reset或任何类似的函数,也不提供对底层流的访问。如果您自己有权访问底层流,则可以自行重置该流。
这都意味着不可能直接重用它。
发布于 2011-02-07 16:23:32
我猜flush大概会按照你的要求去做。只需构建和检索XML,刷新、冲洗、重复;)
干杯。
https://stackoverflow.com/questions/4919210
复制相似问题