Поток памяти пуст
Мне нужно создать огромный 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 перед проверкой памяти.