Поток памяти пуст

Мне нужно создать огромный XML-файл из разных источников (функций). Я решил использовать XmlTextWriter так как он использует меньше памяти, чем XmlDocument,

Во-первых, инициировать XmlWriter с базовым MemoryStream

MemoryStream ms = new MemoryStream();
XmlTextWriter xmlWriter = new XmlTextWriter(ms, new UTF8Encoding(false, false));
xmlWriter.Formatting = Formatting.Indented;

Тогда я передаю XmlWriter (обратите внимание, что XML Writer остается открытым до самого конца) для функции, которая генерирует начало XML-файла:

xmlWriter.WriteStartDocument();

xmlWriter.WriteStartElement();

// xmlWriter.WriteEndElement(); // Do not write the end of root element in first function, to add more xml elements in following functions

xmlWriter.WriteEndDocument();
xmlWriter.Flush();

Но я обнаружил, что основной поток памяти пуст (путем преобразования байтового массива в строку и строку вывода). Есть идеи почему?

Кроме того, у меня есть общий вопрос о том, как создать огромный XML-файл из различных источников (функций). То, что я делаю сейчас, хранит XmlWriter открыть (я предполагаю, что основной поток памяти должен также открыться) для каждой функции и записи. В первой функции я не пишу конец корневого элемента. После последней функции я вручную добавляю конец корневого элемента следующим образом:

string endRoot = "</Root>";
byte[] byteEndRoot = Encoding.ASCII.GetBytes(endRoot);
ms.Write(byteEndRoot, 0, byteEndRoot.Length); 

Не уверен, работает ли это или нет.

Большое спасибо!

3 ответа

Решение

Технически вы должны задавать только один вопрос на каждый вопрос, поэтому я собираюсь ответить только на первый, потому что в данный момент это всего лишь быстрый визит в SO.

Я думаю, вам нужно позвонить в Flush, прежде чем пытаться читать из Stream.

EditПросто запутываю мою вторую догадку из комментариев ниже, чтобы оправдать принятый ответ здесь.

В дополнение к звонку Flush, если чтение из потока выполняется с помощью Read метод и его братья, то позиция в потоке должна быть сначала возвращена к началу. В противном случае никакие байты не будут прочитаны.

Убедитесь, что вы вызываете Flush для XmlTextWriter, прежде чем проверять поток памяти.

Возможно, вам нужно вызвать Flush() в потоке xml перед проверкой памяти.

Другие вопросы по тегам