增量地将XML XDocument写入磁盘,保持有效的XML
本文关键字:XML 有效 磁盘 XDocument | 更新日期: 2023-09-27 18:05:24
我将一些日志事件转储到XML文件中,每5分钟我启动一个新文件。我一直在用XDocument和XElement我很喜欢,
_xDocument = XDocument.Parse("<LogEntires/>");
_xDocument.Root.Add(xElementLogEventList.ToArray());
_xDocument.Save(_outFileName);
我想每隔10秒左右用计时器将它持久化到磁盘,这样最近的事件就不只是在内存中,人们可以在必要时检查文件。但是XDocument只有Save()和WriteTo()方法来写整个文档。不加<标记,无论如何它将是无效的Xml。>
我的下一个想法是使用XmlWriter和刷新我的FileStream现在和然后,保持跟踪添加关闭标签自己…只有无效的XML,直到我完全完成并关闭文件。
我真的很想在磁盘上有有效的Xml,如果我想写一个根标签,然后五到十秒钟后,当我做下一次刷新,只是备份和删除根标签,附加下一个100个元素,写和刷新流。xmlWriter只是转发,所以我不确定最有效的方法来做到这一点。
在磁盘上保存有效xml的最有效方法是什么,但在最后保持流新元素,而不是每次都重写整个文档?我担心的是,我错过了一些明显的东西,如xDocument.AppendUpdatesToFile(_outfile)或类似的东西…
如果不是,如何有效地找到并删除最后的根标签,并以流方式附加新元素?
XML对磁盘上的这种更新不友好。
如果必须坚持使用XML,请考虑使用XML片段集合(基本上省略了初始的开始标记)。
一种简单(虽然不是很有效)的方法是创建文件,保存后包括标签,您可以通过加载它(根据需要经常)并使用类似于
的内容来"追加"条目。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/