Простой ответ: да, это возможно.
Но это было бы достигнуто, если основной поток не указывает на файл. MemoryStream может быть хорошим примером этого.
Поскольку MemoryStream сохраняет поток «в памяти», вы можете написать множество XML-файлов с помощью вашего XmlTextWriter и после завершения каждого документа выполнить MemoryStream.ToArray () и передать его в качестве аргумента для File.WriteAllBytes.
После записи всех байтов вы очистите поток памяти.
Вы можете очистить поток памяти, вызвав метод MemoryStream.SetLength, и указать 0 в качестве длины:
Подробнее о перегрузке потока в конструкторе XmlTextWriter читайте здесь:
И это для File.WriteAllBytes:
О некоторых проблемах при повторном использовании XmlTextWriter
Несколько лет назад @NigelTouch выразил обеспокоенность по поводу некоторых комментариев:
Проблема, которую я обнаружил, заключается в том, что если исключение выдается на полпути
через, например, после WriteStartElement (), тогда даже если вы
Flush () Writer и установите длину потока на 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());
}