在C#中,有没有办法将XML节点添加到磁盘上的文件而不先加载它?

Dav*_*.id 10 c# xml

我在磁盘上有一个非常基本的XML结构/文件,类似于:

<root>
    <data timestamp="dd-mm-yyyy" type="comment">kdkdkdk</data>
    <data timestamp="dd-mm-yyyy" type="event">kdkdkdkgffgfdgf</data>
    <data timestamp="dd-mm-yyyy" type="something">kddsdsfsdkdkdk</data>
</root>
Run Code Online (Sandbox Code Playgroud)

如上所述,XML将位于磁盘上的外部文件中.由于文件可能会变得相当大(实际上每隔几周会被"修剪"),我不想先加载XML文件来添加新节点......

有没有办法添加这样的新节点?它可以被添加到顶部/底部等,因为实际使用XML的进程无论如何都按时间戳对它进行排序.

我猜测粗略的方法是将节点作为文本附加..但是我认为这会在结束标记之后添加节点?

任何想法都感激不尽......大卫.

Hen*_*man 8

不使用任何XML API或工具.

您可以将文件作为文本打开,找到位置</root>并从那里开始覆盖.当然</root>再添加一次.


一种快速而肮脏的方法,这不是很强大:

  • 确保准备初始文件,结束标记后应该没有任何内容(没有空格)
  • 确保使用ASCII或UTF8编码

====

string closeTag = "</root>";
int closeLength = Encoding.UTF8.GetBytes(closeTag).Length;

var fs = System.IO.File.Open(filename, System.IO.FileMode.Open);
fs.Position = fs.Length - closeLength;

var writer = new StreamWriter(fs);  // after the Position is set

writer.WriteLine(newTag);
writer.Write(closeTag);  // NOT WriteLine !!

writer.Close();
fs.Close();
Run Code Online (Sandbox Code Playgroud)

当然,你知道使用 using() {}块.


ash*_*thy 2

这里已经有很多不错的答案了,但是再想一下,您确定这些数据需要存储为 XML 文件吗?

您存储的数据看起来相当简单(即包含三个字段、日期、类型和一些字符串数据的记录。如果您不需要 XML 提供的任何附加好处(请参阅此处),那么为什么不只使用基本的 CSV?您可以像通过 .log 文件一样继续附加到它File.AppendText("filename")

(天哪,甚至可以使用 log4net 之类的东西来管理日志记录和任何清理工作。)