是否可以重用相同的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
...
答案 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)
表示一个编写器,它提供快速,非缓存,仅向前方式生成包含符合W3C可扩展标记语言(XML)1.0和命名空间的XML数据的流或文件。 XML建议。
(强调我的)
该类不提供Reset
或任何类似的功能,也不提供对底层流的访问。如果您自己可以访问基础流,则可以自行重置该流。
这意味着无法直接重复使用它。
答案 2 :(得分:0)
我猜flush会大致满足你的要求。只需构建并检索XML,flush,rince,repeat;)
干杯。