逐步将XML XDocument写入磁盘,保持有效的XML

时间:2011-08-11 22:31:14

标签: c# xml stream

我将一些日志事件转储到XML文件中,每隔5分钟我就开始一个新文件。我一直在使用我非常喜欢的XDocument和XElement,

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

我想用计时器每隔10秒左右将其保存到磁盘,这样最近的事件不仅仅在内存中,人们可以在必要时检查文件。但是XDocument只有Save()和WriteTo()方法来编写整个文档。猜测没有&lt; / Root&gt;标签它无论如何都是无效的Xml。

我的下一个想法是使用XmlWriter并立即刷新我的FileStream,然后跟踪添加结束&lt; / Root&gt;标记自己...并且只有在完成并关闭文件之前才有无效的XML。

我真的很想在磁盘上安装有效的Xml,如果我想写一个root标签,然后五到十秒后我进行下一次刷新,只需备份并删除根标签,然后追加下一百个元素并写入和刷新流。 xmlWriter只是转发,所以我不确定最有效的方法。

在磁盘上拥有有效xml的最有效方法是什么,但最后是否继续流式传输新元素,而不是每次都重写整个文档?我担心的是我错过了像xDocument.AppendUpdatesToFile(_outfile)这样明显的东西或类似的东西......

如果不是,您将如何有效地查找和删除最终根标签并以流方式附加新元素?

2 个答案:

答案 0 :(得分:3)

XML对磁盘上的这种更新不友好。

如果必须坚持使用XML,请考虑使用XML片段集合(基本上省略初始开放标记)。

答案 1 :(得分:0)

一种简单(虽然不是非常有效)的方法是像你一样创建文件,在保存包括标签之后你可以通过加载它来“追加”条目(根据需要经常)并使用类似的东西< / p>

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/