覆盖特定的XML节点

时间:2014-06-16 22:28:55

标签: 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>Error</Severity>
      <Comments>Restart the machine</Comments>
   </Alarm>
   ...

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

我正在寻找特定于XML的解决方案...我想避免使用常规的平面文件方法,这些方法涉及到文件中的特定行然后编辑该行。对于我不熟悉的XML文件可能存在某些东西。我目前正在使用.NET 2项目,但很快就会升级到4.5,所以任何解决方案都适用于我。

1 个答案:

答案 0 :(得分:2)

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

以下是使用控制台应用程序的示例。

// 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