在 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 文件中的特定节点之后插入一个节点的主要内容,如果未能解决你的问题,请参考以下文章

在特定位置插入 XML 节点

R:将节点插入到特定位置的xml树中

如何使用 vbscript 删除 XML 文件中的特定节点

使用多个 XML 文件中的特定 XML 节点填充 datagridview

在单链表中的特定节点之前插入一个节点

使用 LINQ - C# 在 xml 文件中的特定节点下方添加新元素