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

XML中在每个指定节点后插入新节点的异常问题求助

解决XML节点插入错误:仅第一个目标节点后重复插入新节点的问题

问题场景

你需要在XML中所有type="AUDIOPLAYER"的event节点后插入一个type="VIZ"的新节点,但当前代码出现了异常:第一个目标节点后被插入了两个新节点,第二个目标节点后却完全没有插入。

错误原因分析

问题出在循环内部的srcNode获取逻辑:

XmlNode srcNode = node.SelectSingleNode("/eventlist/event[@type='AUDIOPLAYER']");

SelectSingleNode使用绝对路径查询时,始终会返回文档中第一个匹配的节点。所以不管循环遍历到哪个AUDIOPLAYER节点,你都是在第一个目标节点后面插入新节点,这就导致了第一个节点后出现两个重复的VIZ节点,而第二个节点完全没被处理。

修复后的代码

只需要直接使用循环变量node(它就是当前遍历到的每个目标节点),不需要重新查询:

XmlDocument xdoc = new XmlDocument();
xdoc.Load(@"C:\Users\namokhtar\Desktop\newxml\testxml.xml");

foreach (XmlNode node in xdoc.SelectNodes("/eventlist/event[@type='AUDIOPLAYER']"))
{
    // 创建新的VIZ节点
    XmlNode newElem = xdoc.CreateElement("event");
    XmlAttribute newAttr = xdoc.CreateAttribute("type");
    newAttr.Value = "VIZ";
    newElem.Attributes.Append(newAttr);
    
    // 基于当前循环的node插入新节点
    node.ParentNode.InsertAfter(newElem, node);
}

xdoc.Save(@"C:\Users\namokhtar\Desktop\newxml\newxml1.xml");

效果验证

运行修改后的代码,生成的XML会完全符合你的预期:

<eventlist> 
  <event type="AUDIOPLAYER"> 
    <properties> 
      <schedule startType="-ParentEnd1" /> 
      <media mediaType="Audio" /> 
    </properties> 
  </event> 
  <event type="VIZ" /> 
  <event type="AUDIOPLAYER"> 
    <properties> 
      <schedule startType="-ParentEnd2" /> 
      <media mediaType="Audio" /> 
    </properties> 
  </event> 
  <event type="VIZ" /> 
</eventlist>

内容的提问来源于stack exchange,提问作者Tito

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:20:17