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

问题描述 投票:0回答:2

我正在以更简单的方式发布我的问题。

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

请建议我...

c# xmlnode
2个回答
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);
                }
            }

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

希望这可以帮助!


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");
© www.soinside.com 2019 - 2024. All rights reserved.