我正在尝试使用XDocument将xml写入文件。以前我使用FileStream写入文本文件,它曾经工作得很快。
使用Profiler,我发现XDcoument.Save花费了大约90%的时间,尤其是当我在xml节点中编写大文本时。
XDocument xDocument = XDocument.Load(FilePath);
XElement root = xDocument.Element("logs");
root.Add(
new XElement(
"log",
new XElement(
"dt",
DateTime.Now.ToString("MMM dd, yyyy")),
new XElement(
"tm",
DateTime.Now.ToString("HH:mm:ss.fff")),
new XElement(
"st",
ConvertStackTrace(stackList)
//stackInfo
),
new XElement(
"t",
topic),
new XElement(
"d",
description),
new XElement(
"cu",
custom)));
xDocument.Save(FilePath);
有没有其他方法可以比这更快地将xml写入文件。请注意,该文件约为1MB,每次打开文件并将节点添加到其中。
基本上有三种方法可以进入XML文件。NET
>
XmlTextReader, XmlTextWriter-用于处理NET中XML文件的最低级别API。它提供对xml数据的流式访问。
XmlDocument-提供XML的DOM表示,便于读取/修改数据
XDocument-提供XML的DOM表示,并支持LINQXML查询
XDocument
和XmlDocument
都在幕后使用XmlReader
/XmlWriter
。两者都将所有数据保存在内存中,因此显然它们更慢且更占用内存。对此你无能为力,因为每次调用代码时,都必须解析整个xml文档,然后再次转储到磁盘。
如果您从XDocument
切换到XmlReader
/XmlWriter
,您可以期待明显更好的性能(大概快5倍到10倍),但它需要一些工作,因为使用XmlReader
/XmlWriter
处理文档并不像使用XDocument
那样简单
根据您的用例,您还可以使用一些“讨厌”的技巧,例如为每个日志只编写一个xml片段。这样您就不必解析文档,只需将片段附加到文件末尾即可。速度与使用纯文本文件相当。缺点-生成的文件无效XML因为它没有任何根元素。从您的代码中处理此类文件很容易,但外部程序可能无法正常工作。