【问题标题】:Overwrite specific XML node覆盖特定的 XML 节点
【发布时间】:2014-06-16 22:28:54
【问题描述】:

我有一个以下格式的 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,所以任何解决方案都适合我。

【问题讨论】:

    标签: c# xml .net-2.0 .net-4.5


    【解决方案1】:

    您可以在 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

    【讨论】:

    • 你知道XmlDocument.Save()的内部工作原理吗?使用不同的编写器 (msdn.microsoft.com/en-us/library/…) 有几个重载,我正在尝试找到对我的用例最有效的一个。
    • 您可能需要采用字符串的重载,它将文档内容保存到文件路径。这确实最终将整个文件再次写入磁盘,这真的没什么大不了的。如果您关心将整个文件写入磁盘,请考虑将每个警报保存为单独的文件,并在文件名中使用警报 ID。这样,当您修改文件时,您只是将更改保存到一个警报中。
    猜你喜欢
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 2014-05-31
    • 2022-11-11
    • 1970-01-01
    相关资源
    最近更新 更多