【问题标题】:inserting a node after a specific node in xml file在 xml 文件中的特定节点之后插入一个节点
【发布时间】: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");

请告诉我...

【问题讨论】:

    标签: c# xmlnode


    【解决方案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");
    

    【讨论】:

      猜你喜欢
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-21
      相关资源
      最近更新 更多