在 xml 文件中的特定节点之后插入一个节点
Posted
技术标签:
【中文标题】在 xml 文件中的特定节点之后插入一个节点【英文标题】:inserting a node after a specific node in xml file 【发布时间】:2019-03-08 21:57:20 【问题描述】:我以更简单的方式重新发布我的问题。
我需要在 XML 文件中搜索特定节点,一旦我看到它,我需要创建一个新节点并在之后插入它。问题是有 2 个节点具有相同的值。我需要在每个实例之后插入新节点两次。使用下面的代码:它插入新节点两次,但仅在第一个实例之后的同一位置。
原始 XML:
<eventlist>
<event type="AUDIOPLAYER">
<properties>
<schedule startType="-ParentEnd1" />
<media mediaType="Audio" />
</properties>
</event>
<event type="AUDIOPLAYER">
<properties>
<schedule startType="-ParentEnd2" />
<media mediaType="Audio" />
</properties>
</event>
</eventlist>
预期的 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>
但当前的输出是:
<eventlist>
<event type="AUDIOPLAYER">
<properties>
<schedule startType="-ParentEnd1" />
<media mediaType="Audio" />
</properties>
</event>
<event type="VIZ" />
<event type="VIZ" />
<event type="AUDIOPLAYER">
<properties>
<schedule startType="-ParentEnd2" />
<media mediaType="Audio" />
</properties>
</event>
</eventlist>
代码如下:
XmlDocument xdoc = new XmlDocument();
xdoc.Load(@"C:\Users\namokhtar\Desktop\newxml\testxml.xml");
foreach (XmlNode node in xdoc.SelectNodes("/eventlist/event[@type='AUDIOPLAYER']"))
XmlNode srcNode = node.SelectSingleNode("/eventlist/event[@type='AUDIOPLAYER']");
XmlNode newElem = xdoc.CreateElement("event");
XmlAttribute newAttr = xdoc.CreateAttribute("type");
newAttr.Value = "VIZ";
newElem.Attributes.Append(newAttr);
srcNode.ParentNode.InsertAfter(newElem, srcNode);
xdoc.Save(@"C:\Users\namokhtar\Desktop\newxml\newxml1.xml");
请告诉我...
【问题讨论】:
【参考方案1】:我还没有完全测试过这个,但我几乎可以肯定这应该可以解决问题:
foreach (XmlNode node in xdoc.SelectNodes("/eventlist/event[@type='AUDIOPLAYER']"))
XmlNodeList srcNodes = node.SelectNodes("/eventlist/event[@type='AUDIOPLAYER']");
foreach (XmlNode srcNode in srcNodes)
XmlNode newElem = xdoc.CreateElement("event");
XmlAttribute newAttr = xdoc.CreateAttribute("type");
newAttr.Value = "VIZ";
newElem.Attributes.Append(newAttr);
srcNode.ParentNode.InsertAfter(newElem, srcNode);
问题是您从匹配表达式中选择单个节点,您需要选择所有匹配的节点并在每个节点之后插入新节点。
希望这会有所帮助!
【讨论】:
你是对的,但我不得不删除第一个 foreach 循环。因为它两次创建了节点。再次感谢。【参考方案2】:这是一个使用 LINQ 的解决方案:
var xml = XDocument.Parse(File.ReadAllText(@"C:\Users\namokhtar\Desktop\newxml\testxml.xml"));
var elems = xml.Root.Elements()
.Where(e => e.Name == "event" && e.Attribute("type")?.Value == "AUDIOPLAYER");
foreach (var elem in elems)
elem.AddAfterSelf(new XElement("event", new XAttribute("type", "VIZ")));
xml.Save(@"C:\Users\namokhtar\Desktop\newxml\newxml1.xml");
【讨论】:
以上是关于在 xml 文件中的特定节点之后插入一个节点的主要内容,如果未能解决你的问题,请参考以下文章