You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用C#根据属性值更新XML节点值时出错,求正确实现方案

问题描述

我尝试用C#更新XML文件,要求当<Variable>节点的name属性为MachineName3时,将其节点值更新为122.0.6261.112,但当前代码错误地修改了MachineName1的节点值。

XML示例

<?xml version="1.0" encoding="utf-8"?>
<Variables>
  <Variable name="MachineName1" application="chrome">122.0.6261.112</Variable>
  <Variable name="MachineName2" application="chrome">122.0.6261.112</Variable>
  <Variable name="MachineName3" application="chrome">122.0.6260.109</Variable>
  <Variable name="MachineName4" application="chrome">122.0.6261.110</Variable>
</Variables>

错误代码

XDocument xdoc = XDocument.Load(variablesFile);
var allElements = xdoc.Descendants();
foreach (XElement element in allElements)
{
    if (xdoc.Root.Descendants("Variable").FirstOrDefault().HasAttributes.Equals("MachineName3"));
       
    {
        xdoc.Root.Descendants("Variable").FirstOrDefault().SetValue("122.0.6261.112");
    }
}
错误原因
  1. 判断逻辑完全错误:if条件里拿第一个Variable节点的HasAttributes(布尔值)和字符串MachineName3做比较,这永远不会成立;而且条件末尾的分号;让if变成空语句,导致后面的修改代码一定会执行。
  2. 始终修改第一个节点:FirstOrDefault()每次都返回第一个Variable节点(即MachineName1),所以不管条件如何,都会误改它的值。
  3. 冗余循环:遍历所有节点但完全没用到循环变量element,循环毫无意义。
正确代码

直接定位目标节点并修改,无需多余循环:

XDocument xdoc = XDocument.Load(variablesFile);
// 精准定位name属性为MachineName3的Variable节点
var targetNode = xdoc.Root.Descendants("Variable")
                     .FirstOrDefault(v => v.Attribute("name")?.Value == "MachineName3");

// 找到节点后再修改并保存
if (targetNode != null)
{
    targetNode.SetValue("122.0.6261.112");
    xdoc.Save(variablesFile); // 必须保存才能将修改写入文件
}

代码说明

  • 用LINQ条件筛选直接定位目标节点,避免误改其他节点。
  • 先判断节点是否存在,防止空引用异常。
  • 调用Save()方法是关键,原代码遗漏了这一步,修改后不会写入文件。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:40:11