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

时间:2019-03-08 21:57:20

标签: c# xmlnode

我以一种更简单的方式发布我的问题。

我需要在XML文件中搜索一个特定的节点,一旦看到它,就需要创建一个新节点并将其插入。问题是有两个具有相同值的节点。而且我需要在每个实例之后两次插入新节点。使用下面的代码:它将两次插入新节点,但仅在第一个实例之后插入同一位置。

原始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");

请告诉我...

2 个答案:

答案 0 :(得分:0)

我还没有完全测试过,但是我几乎确定这可以解决问题:

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

问题是您要从匹配表达式中选择单个节点,并且需要选择所有与之匹配的节点,并在每个节点之后插入新节点。

希望这会有所帮助!

答案 1 :(得分:0)

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