вставка узла после определенного узла в файле XML - PullRequest
0 голосов
/ 09 марта 2019

Я публикую свой вопрос более простым способом.

Мне нужно найти конкретный узел в файле 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");

пожалуйста, посоветуйте мне ...

Ответы [ 2 ]

0 голосов
/ 09 марта 2019

Вот решение с использованием 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");
0 голосов
/ 09 марта 2019

Я не полностью проверил это, но я почти уверен, что это должно сработать:

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

Проблема в том, что вы выбрали один узел из соответствующего выражения, и вам нужно выбрать всеузлы, которые соответствуют этому и вставляют новый узел после каждого из них.

Надеюсь, это поможет!

...