如何使用XmlDocument修改嵌套XML中指定的CompValue属性值
问题
需要将嵌套XML中CritID为205的Crit节点的CompValue属性值从"C02"修改为"C02,C03",尝试多种XmlDocument操作方法仍未成功,尝试的代码及示例XML如下:
尝试代码1:
XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml("XML value"); XmlNode root = xmlDoc.DocumentElement; XmlNode myNode = root.SelectSingleNode("descendant::CompValue"); myNode.Value = "blabla";
尝试代码2:
root.SelectSingleNode("//CritGroup/Crit").InnerText = "NewValue";
示例XML:
<Search Name="Test1" ProjTypeID="107"> <SearchType SearchTypeID="20246" /> <FiscalYear Year="2022" /> <CorpEnt CEID="367" CEName="Sample" /> <CritGroup CritGroupID="1" CritGroupAndOr="AND"> <Crit CritID="205" RelID="275" CompValue="C02" CompValueHuman="C02" AndOr="AND" TextBoxName="tbProjNum" /> <Crit CritID="208" RelID="280" CompValue="11" CompValueHuman="Yes" AndOr="AND" TextBoxName="" /> </CritGroup> <PageSize Size="200" /> </Search>
解决方案
你之前的操作存在两个问题:
- 第一个代码中
descendant::CompValue试图选择名为CompValue的子节点,但CompValue是Crit节点的属性,并非独立节点; - 第二个代码中
//CritGroup/Crit只会选中第一个Crit节点,无法定位到CritID=205的目标节点。
正确的实现方式是用XPath精准定位目标节点,再修改对应属性:
XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml("你的XML内容"); // 定位CritID为205的Crit节点 XmlNode targetCritNode = xmlDoc.SelectSingleNode("//Crit[@CritID='205']"); if (targetCritNode != null) { // 修改CompValue属性 targetCritNode.Attributes["CompValue"].Value = "C02,C03"; // 可选:同步更新CompValueHuman属性 targetCritNode.Attributes["CompValueHuman"].Value = "C02,C03"; // 保存修改后的XML(按需写入文件或输出) xmlDoc.Save("修改后的文件路径.xml"); }
代码说明
//Crit[@CritID='205']:XPath表达式,用于查找所有层级下CritID属性等于205的Crit节点;- 先判断节点是否存在,避免空引用异常;
- 通过
Attributes["属性名"]获取目标属性,直接修改其Value即可完成更新。
内容的提问来源于stack exchange,提问作者Sribin
相关产品推荐
相关产品推荐

