2011-08-11 58 views
2

我將一些日誌事件轉儲到XML文件中,每5分鐘開始一個新文件。我一直在使用的XDocument和它的XElement我真的很喜歡,遞增地將XML XDocument寫入磁盤,保存有效的XML

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

我想它有計時器堅持到磁盤每10秒左右,所以最近發生的事件不只是在內存中,人如有必要可以檢查文件。但是XDocument只有寫入整個文檔的Save()和WriteTo()方法。並猜測沒有</Root>標記,無論如何這將是無效的Xml。

我的下一個想法是使用XmlWriter並立即刷新我的FileStream,並跟蹤添加結束自己的關閉</Root>標記,直到完成並關閉文件後才生成無效的XML。

我真的很想在磁盤上擁有有效的Xml,並且如果我想寫一個根標籤,然後在我進行下一次刷新時需要五到十秒鐘,只需備份並移除根標記,然後追加下一個數百個元素並寫入並刷新流。 xmlWriter只是轉發,所以我不確定最有效的方式來做到這一點。

在磁盤上使用有效的xml最有效的方法是什麼,但最終保持流式傳輸新元素,而不是每次都重寫整個文檔?我的恐懼是,我錯過了像xDocument.AppendUpdatesToFile(_outfile)或類似的東西明顯的東西...

如果不是如何有效地找到並刪除最終的根標籤,並追加新的元素在一個流式的方式?

回答

3

XML並不友好這類磁盤上的更新。

如果您必須使用XML,請考慮使用XML片段集合(實質上省略了最初的開放標籤)。

+0

我同意XML對此不友好。至於列出根級別的所有元素。根級允許只有一個標籤。這不是有效的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/