正如标题所示,我需要将日志数据附加到 XML 文件而不缓冲到 RAM。XML 文件由 LogEntry 元素组成,其中包含 82 个包含数据的子元素。这些文件可能会变得非常大,并且由于它将构成 Windows CE6 程序的一部分,因此我们的内存非常有限。
经过大量研究后,很明显最常用的方法是使用XDocument
或Linq to XML
读取现有文档,然后再附加到现有文档并写出新文档。使用XmlWriter
和XmlReader
一致似乎是我追加到文件的最佳方式,但到目前为止我的所有尝试都是非常不切实际的,并且需要 IF 语句来指示要写入的内容,以防止写入重复或数据较少的元素。
我正在做的事情的本质是:
//Create an XmlReader to read current WorkLog.
using (XmlReader xmlRead = XmlTextReader.Create("WorkLog.xml"))
{
//Create a XmlWriterSettings and set indent
//to true to correctly format the document
XmlWriterSettings writerSettings = new XmlWriterSettings();
writerSettings.Indent = true;
writerSettings.IndentChars = "\t";
//Create a new XmlWriter to output to
using (XmlWriter xmlWriter = XmlWriter.Create("New.xml", writerSettings))
{
//Starts the document
xmlWriter.WriteStartDocument();
//While the XmlReader is still reading (essentially !EOF)
while (xmlRead.Read())
{
//FSM to direct writing of OLD Log data to new file
switch (xmlRead.NodeType)
{
case XmlNodeType.Element:
//Handle the copying of an element node
//Contains many if statements to handle root node &
//attributes and to skip nodes that contain text
break;
case XmlNodeType.Text:
//Handle the copying of an text node
break;
case XmlNodeType.EndElement:
//Handle the copying of an End Element node
break;
}
}
xmlWriter.WriteEndDocument();
}
}
我相信我可以通过这种方式附加到文件中,但这样做非常不切实际 - 有没有人知道我的搜索时间没有出现的任何内存高效方法?
如果需要,我很乐意发布我当前的代码来执行此操作 - 但正如我所提到的,它非常大,而且目前实际上非常讨厌,所以我暂时将其忽略。