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
相关产品推荐
相关产品推荐

