覆盖特定的XML节点

本文关键字:XML 节点 覆盖 | 更新日期: 2023-09-27 18:08:57

我有一个以下格式的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>
   ...

我的程序有一个GUI,它使用户能够编辑警报的Comments。我正在努力为用户完成编辑并希望保存更改时所采取的行动提供最佳解决方案。XML文件不是特别大(它不需要一个数据库),但是足够大,我不希望每次对单个警报进行更改时都覆盖整个文件。是否有可能仅针对特定节点并编辑Comments属性,而无需重写所有内容?

我正在寻找一个特定于xml的解决方案…我想避免常规的平面文件方法,这种方法涉及到文件中的特定行,然后编辑该行。也许存在一些我不知道的XML文件。我目前正在使用。net 2项目,但很快就会升级到4.5,所以任何解决方案都适合我。

覆盖特定的XML节点

可以在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);

这里是一个工作小提琴:https://dotnetfiddle.net/eQROet