4

さまざまなソース (関数) から巨大な xml ファイルを生成する必要があります。XmlTextWriterよりもメモリ使用量が少ないため、使用することにしましXmlDocumentた。

まず、XmlWriter基礎となるMemoryStream

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

次に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); 

これが機能するかどうかはわかりません。

どうもありがとう!

4

3 に答える 3

8

技術的には、質問ごとに 1 つの質問のみを行う必要があります。これは現時点で SO への簡単な訪問であるため、最初の質問のみに回答します。

Stream から読み取ろうとする前に、 Flushを呼び出す必要があると思います。

編集 ここで受け入れられた答えを正当化するために、以下のコメントから私の2番目の予感を膨らませるだけです。

への呼び出しに加えてFlush、 Stream からの読み取りがReadメソッドとその兄弟を使用して行われる場合、最初にストリーム内の位置を最初にリセットする必要があります。それ以外の場合、バイトは読み取られません。

ms.Position = 0; /*reset Position to start*/
StreamReader reader = new StreamReader(ms); 
string text = reader.ReadToEnd(); 
Console.WriteLine(text); 
于 2011-05-25T20:32:25.630 に答える
1

おそらく、メモリ ストリームをチェックする前に、xml ストリームで Flush() を呼び出す必要があります。

于 2011-05-25T20:32:16.803 に答える