使用XDocument查询XML的Component节点返回null,如何修改嵌套ConstantValue值
问题根因
你查询返回null的核心原因是XML中<FlgNet>节点声明了默认命名空间 http://www.siemens.com/automation/Openness/SW/NetworkSource/FlgNet/v4,该节点下所有子节点(包括你要查找的<Component>节点)都属于这个命名空间,原代码未指定命名空间直接查询节点名,自然无法匹配到目标节点。
修复后的实现代码
using System.Xml.Linq; // 加载XML XDocument xmlDoc = XDocument.Parse(str); // 声明节点所属的目标命名空间 XNamespace ns = "http://www.siemens.com/automation/Openness/SW/NetworkSource/FlgNet/v4"; // 查找目标Component节点,查询时节点名需要带上命名空间 var targetComponent = xmlDoc.Descendants(ns + "Component") .FirstOrDefault(x => x.Attribute("Name")?.Value == "axesInterface"); if (targetComponent != null) { // 向下层级查找ConstantValue节点并修改值 var constantValueNode = targetComponent.Descendants(ns + "ConstantValue").FirstOrDefault(); if (constantValueNode != null) { constantValueNode.Value = "替换为你需要的新值"; } }
补充注意事项
- 查询带命名空间的XML节点时,必须明确指定节点所属的命名空间,否则会默认使用空命名空间匹配,导致查询无结果
- 代码中使用
?.操作符避免Attribute不存在时抛出空引用异常,提升代码鲁棒性
内容的提问来源于stack exchange,提问作者mrsargent
相关产品推荐
相关产品推荐

