Как поменять два элемента XML в linq в xml - PullRequest
2 голосов
/ 18 сентября 2010

Я хочу поменять местами два элемента XML.Как мне это сделать?Вот кодЯ попробовал решение здесь , но оно у меня не сработало.Я хочу поменять оба элемента.Когда я запускаю программу, элементы не меняются местами, но когда я вызываю ToList (), он переставляется в списке, но не обменивается в переменной doc

<template id="12">
  <tabs>
    <tab>
      <name>test1</name>
      <description />
    </tab>
    <tab>
      <name>test2</name>
      <description />
    </tab>
  </tabs>
</template>

Вот кодпоменять их местами

        var doc = XDocument.Parse(q.XMLtext);
        var Current = doc.ElementOrDefault("template").ElementOrDefault("tabs").ElementsOrDefault("tab").Where(x => (string)x.Element("name") == name).FirstOrDefault();
        var Previous = Current.PreviousNode as XElement;
        var Next = Current.NextNode as XElement;
        var CurrentName = (string)Current.ElementOrDefault("name");
        var PreviousName = (string)Previous.ElementOrDefault("name");
        var NextName = (string)Next.ElementOrDefault("name");
        if (MoveDirection == (int)MoveType.Up)
        {
            doc.ElementOrDefault("template").ElementOrDefault("tabs").ElementsOrDefault("tab").Where(x => (string)x.Element("name") == CurrentName || (string)x.Element("name") == PreviousName).Reverse();

        }
        else
            //doc.ElementOrDefault("template").ElementOrDefault("tabs").ElementsOrDefault("tab").Where(x => x == Current || x == Next).Take(2).Reverse();

        q.XMLtext = doc.ToString();
        context.SaveChanges();

Ответы [ 2 ]

7 голосов
/ 18 сентября 2010

Боюсь, я не совсем определился, какие именно элементы вы хотите поменять, но, я считаю, XElement.ReplaceWith - это то, что вы ищете. Вот короткая, но полная программа, которая демонстрирует это:

using System;
using System.Xml.Linq;

class Program
{
    static void Main()
    {
        string xml = @"
<root>
  <element1/>
  <element2/>
  <element3/>
  <element4/>
  <element5/>
</root>";
        XDocument doc = XDocument.Parse(xml);
        XElement x = doc.Root.Element("element2");
        XElement y = doc.Root.Element("element4");
        x.ReplaceWith(y);
        y.ReplaceWith(x);
        Console.WriteLine(doc);
    }
}

Это меняет element2 и element4.

Обратите внимание, что это работает, потому что первый x.ReplaceWith(y) фактически создает копию из y, оставляя оригинал в его существующем местоположении ... готовый для замены на x.

0 голосов
/ 18 сентября 2010

.Reverse() возвращает элементы в обратном порядке. Это не меняет их.

...