如何使用C# Linq-to-XML替换指定XML元素的Value值?
Linq-to-XML 修改内存中XML节点值
需求说明
已通过XDocument.Parse(rawXmlString)加载内存中的XML结构如下:
<ParameterValues> <ParameterValue> <Name>Head Coach</Name> <Value>Bill Belichick</Value> </ParameterValue> <ParameterValue> <Name>Quarterback</Name> <Value>Mac Jones</Value> </ParameterValue> </ParameterValues>
需要根据Name节点值匹配,修改对应Value内容:
- 将
Name为"Head Coach"的Value从"Bill Belichick"替换为"Mike Vrabel" - 将
Name为"Quarterback"的Value从"Mac Jones"替换为"Kirk Cousins"
补充约束:
- XML仅存在于内存,无需持久化到文件
ParameterValues是根节点ParameterValue节点顺序不固定,未来可能新增更多子节点
实现代码
推荐用替换映射表+Linq遍历的方式实现,便于后续新增修改规则:
// 定义替换规则:Key是Name节点值,Value是要替换的新值 var valueReplacements = new Dictionary<string, string> { { "Head Coach", "Mike Vrabel" }, { "Quarterback", "Kirk Cousins" } }; // 遍历所有ParameterValue节点 foreach (var paramNode in xDocument.Root.Elements("ParameterValue")) { // 获取当前节点的Name值 var nameValue = paramNode.Element("Name")?.Value; if (nameValue != null && valueReplacements.TryGetValue(nameValue, out var newValue)) { // 修改对应的Value节点内容 paramNode.Element("Value").Value = newValue; } }
代码说明
- 替换映射表:用
Dictionary存储Name与新Value的对应关系,后续新增修改规则只需在字典中添加条目,无需改动查询逻辑 - 遍历节点:通过
xDocument.Root.Elements("ParameterValue")获取根节点下所有ParameterValue子节点,不受节点顺序影响 - 匹配与修改:先获取当前节点的
Name值,若存在于替换映射中,则找到对应的Value节点并更新其值
如果修改规则较少,也可以直接通过Linq查询定位单个节点修改:
// 单独修改Head Coach的Value var headCoachNode = xDocument.Root .Elements("ParameterValue") .FirstOrDefault(p => p.Element("Name")?.Value == "Head Coach"); if (headCoachNode != null) { headCoachNode.Element("Value").Value = "Mike Vrabel"; } // 单独修改Quarterback的Value var qbNode = xDocument.Root .Elements("ParameterValue") .FirstOrDefault(p => p.Element("Name")?.Value == "Quarterback"); if (qbNode != null) { qbNode.Element("Value").Value = "Kirk Cousins"; }
内容的提问来源于stack exchange,提问作者Jim G.
相关产品推荐
相关产品推荐

