2011-08-11 5 views
2

5分ごとにログファイルをXMLファイルにダンプします。新しいファイルを開始します。私は最新のイベントだけでメモリにないので、タイマーでディスクに10秒ごとかそこらでそれを永続化するために好きで、人と思い、私が本当に好きXDocumentとXElementの、XML XDocumentをディスクにインクリメンタルに書き出し、有効なXMLを保持

_xDocument = XDocument.Parse("<LogEntires/>"); 
_xDocument.Root.Add(xElementLogEventList.ToArray()); 
_xDocument.Save(_outFileName); 

を使用してきました必要に応じてファイルを調べることができます。しかし、XDocumentには文書全体を書き込むSave()メソッドとWriteTo()メソッドしかありません。そして、</Root>タグがないと推測すると、とにかに無効なXMLになります。

私の次の考えは、XmlWriterを使用してFileStreamを今度はフラッシュして、最後に</Root>タグを追加して追跡し、完全に完了してファイルを閉じるまで無効なXMLを持っています。

私は本当にディスクに有効なXMLを持っていたいと思います。ルートタグを書きたいと思ったら、次のフラッシュを作成した後、バックアップしてルートタグを削除してから、ストリームを書き込み、フラッシュします。 xmlWriterは前方のみですので、これを行う最も効率的な方法はわかりません。

有効なxmlをディスクに保存するのに、最後に新しい要素をストリーミングして、毎回ドキュメント全体を書き直すのではなく、最も効率的な方法は何ですか?私の恐れは、xDocument.AppendUpdatesToFile(_outfile)のような明白なもの、またはそのような明白なものが欠けていることです...

最終的なルートタグを効率的に見つけて削除し、ストリーミングの仕方?

答えて

3

XMLは、ディスク上の更新のこの種に優しいではありません参照してください。

XMLに固執する必要がある場合は、XMLフラグメントのコレクションを使用することを検討してください(本質的に初期のopeneingタグを省略してください)。

+0

私はXMLがこれに親しみがないことに同意します。すべての要素をルートレベルで一覧表示する限り。ルートレベルで許可されるタグは1つだけです。それは有効なXMLではありません。 – DanO

+1

はい、有効なXMLではなく、有効なXMLフラグメントのコレクションです... http://msdn.microsoft.com/en-us/library/cakk7ha0(v=VS.100).aspx#Y136。あなたの目標に応じて、それはあなたのために働くかもしれません。 –

0

これを行う簡単な方法は、ファイルを作成して保存した後、タグを含めて(必要に応じて頻繁に読み込んで)エントリを追加することができます。

xmlDoc.Element("Persons").Add(new XElement("Person", new XElement("Name", txtName.Text), 
new XElement("City", txtCity.Text), new XElement("Age", txtAge.Text))); 

は、ちょうどそれが有効な滞在...それを保存...サンプルコードについて

http://www.linqhelp.com/linq-tutorials/adding-to-xml-file-using-linq-and-c/

関連する問題