2011-05-25 39 views
3

我需要從不同的來源(函數)生成一個巨大的XML文件。我決定使用XmlTextWriter,因爲它使用的內存少於XmlDocument內存流爲空

首先,開始與潛在MemoryStream

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

一個XmlWriter然後我通過XmlWriter(注XML作家保持打開,直到最後一刻)的函數生成的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); 

不確定這是否有效。

非常感謝!

+1

你應該改掉這個問題在2,然後將它們鏈接,如果他們是彼此相關 – 2011-05-25 20:35:37

+2

請注意,將MemoryStream完全破壞了「我決定,因爲它使用較少的內存使用XmlTextWriter的」 – 2011-05-25 20:43:55

+2

對於任何低於10 MB只使用XmlDocument或XDocument。爲了節省內存,請寫入FileStream。 – 2011-05-25 20:45:49

回答

6

從技術上講,您應該只針對每個問題提出一個問題,所以我只會回答第一個問題,因爲目前這只是對我的快速訪問。

在嘗試從Stream中讀取數據之前,您需要先撥Flush

編輯 剛剛從下面的評論沸騰起來我的第二個預感到這裏證明接受的答案。

除了調用Flush,如果從流讀出是使用Read方法及其兄弟完成,則該流中的位置必須首先被複位返回到開始。否則,不會讀取字節。

+1

你是對的。 xmlWriter需要先刷新。 – Scott 2011-05-25 20:34:36

+0

我加了xmlWriter.Flush();但仍然得到空的內存流。在將xmlWriter傳遞給如下函數之後:public void Function(XmlTextWriter xmlWriter),底層內存流將由xmlWriter.WriteStartElement等寫入嗎? – Summer 2011-05-25 20:39:36

+0

在測試內存流的地方發佈代碼 - 也許流是好的,你的測試是錯誤的 – Ray 2011-05-25 20:45:40

1

也許你需要在檢查內存streazm之前調用xml流的Flush()。

+0

謝謝雷,你是對的! – Summer 2011-05-26 13:23:09

1

確保在檢查內存流之前調用XmlTextWriter上的Flush。

+0

非常感謝您的回答! – Summer 2011-05-26 13:41:28