如何移除XML中ID为AW的PMT节点下的ADS和SCV子节点
问题解决:移除指定PMT节点下的ADS和SCV子节点
问题分析
你之前的代码存在两个核心问题:
- 用
PMT[1]通过索引定位节点不可靠,一旦XML中ID为AW的PMT位置变化,代码就会失效; - 直接遍历子节点并删除时,
XmlNodeList是动态集合,删除元素会导致迭代器异常,循环提前终止。
正确实现方案
方案1:使用XmlDocument(传统DOM方式)
先通过XPath精准定位ID为AW的PMT节点,再收集所有要删除的子节点到列表中,最后批量删除:
XmlDocument xmlObj = new XmlDocument(); xmlObj.Load("你的XML文件路径"); // 精准定位ID为AW的PMT节点 XmlNode targetPmt = xmlObj.SelectSingleNode("/PCTX/PMT[ID='AW']"); if (targetPmt != null) { // 先收集所有要删除的ADS和SCV节点(避免遍历动态集合时出错) List<XmlNode> nodesToRemove = new List<XmlNode>(); foreach (XmlNode node in targetPmt.ChildNodes) { if (node.Name == "ADS" || node.Name == "SCV") { nodesToRemove.Add(node); } } // 批量删除 foreach (XmlNode node in nodesToRemove) { targetPmt.RemoveChild(node); } // 保存修改后的XML xmlObj.Save("修改后的XML路径"); }
方案2:使用XDocument(LINQ to XML,更简洁)
如果项目支持.NET 3.5及以上,推荐用LINQ to XML,代码更简洁直观:
XDocument doc = XDocument.Load("你的XML文件路径"); // 找到ID为AW的PMT节点,删除其下的ADS和SCV子节点 doc.Descendants("PMT") .Where(pmt => pmt.Element("ID")?.Value == "AW") .Elements() .Where(e => e.Name == "ADS" || e.Name == "SCV") .Remove(); // 保存修改 doc.Save("修改后的XML路径");
关键说明
- 用
PMT[ID='AW']的XPath筛选节点,比索引定位更鲁棒,不受节点顺序影响; - 收集要删除的节点到列表再删除,避免了遍历动态集合时的迭代器失效问题;
- LINQ to XML的方式代码量更少,可读性更高,适合现代C#项目。
内容的提问来源于stack exchange,提问作者MB34
相关产品推荐
相关产品推荐

