C# 覆盖特定的XML节点

C# 覆盖特定的XML节点,c#,xml,.net-2.0,.net-4.5,C#,Xml,.net 2.0,.net 4.5,我有一个以下格式的XML文件: <Alarms> <Alarm> <Id>1</Id> <Severity>Warning</Severity> <Comments></Comments> </Alarm> <Alarm> <Id>2</Id> <Severity>

我有一个以下格式的XML文件:

<Alarms>
   <Alarm>
      <Id>1</Id>
      <Severity>Warning</Severity>
      <Comments></Comments>
   </Alarm>
   <Alarm>
      <Id>2</Id>
      <Severity>Error</Severity>
      <Comments>Restart the machine</Comments>
   </Alarm>
   ...

1.
警告
2.
错误
重新启动机器
...
我的程序有一个GUI,用户可以编辑报警的
注释。我正在尝试为用户完成编辑并希望保存更改时要采取的操作提供最佳解决方案。XML文件不是非常大(它不需要数据库),但足够大,我不想每次更改单个报警时都覆盖整个文件。是否可以只针对特定节点并编辑
Comments
属性,而不必重新写入所有内容


我正在寻找一个特定于XML的解决方案。。。我希望避免常规的平面文件方法,这些方法涉及到文件中的特定行,然后编辑该行。可能存在一些我不熟悉的XML文件。我目前正在处理一个.NET 2项目,但不久将升级到4.5,因此任何解决方案都适合我。

您可以在XmlDocument类中加载xml。使用XPath查询导航到要编辑并更改值的Comments节点。完成后,只需将文档保存到相同的文件名或不同的文件名

下面是一个使用控制台应用程序的示例

// The Id of the Alarm to edit
int idToEdit = 2;

// The new comment for the Alarm
string newCommentValue = "Here is a new comment";

XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);

XmlNode commentsElement = doc.SelectSingleNode(String.Format("Alarms/Alarm[Id = '{0}']/Comments", idToEdit));
commentsElement.InnerText = newCommentValue;

doc.Save(Console.Out);

这是一把工作小提琴:

您知道
XmlDocument.Save()的内部工作原理吗?有几个重载使用不同的writer(),我正试图找到一个对我的用例最有效的重载。您可能需要一个字符串的重载,它将文档内容保存到一个文件路径。这最终会将整个文件再次写入磁盘,这真的不是什么大问题。如果您担心将整个文件写入磁盘,请考虑将每个警报保存为文件名中的警报ID的单独文件。这样,当您修改文件时,您只需将更改保存到一个报警。