在 xml 文件中的特定节点后插入节点

inserting a node after a specific node in xml file

我将以更简单的方式重新发布我的问题。

我需要在 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");

请多多指教...

我还没有完全测试过这个,但我几乎可以肯定这应该可以解决问题:

            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);
                }
            }

问题是您 select 从匹配表达式创建单个节点,您需要 select 所有匹配的节点并在每个节点之后插入新节点。

希望对您有所帮助!

这是一个使用 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");