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

如何移除XML中ID为AW的PMT节点下的ADS和SCV子节点

问题解决:移除指定PMT节点下的ADS和SCV子节点

问题分析

你之前的代码存在两个核心问题:

  1. 用PMT[1]通过索引定位节点不可靠,一旦XML中ID为AW的PMT位置变化,代码就会失效;
  2. 直接遍历子节点并删除时,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 05:03:35