2010-09-18 2 views
2

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

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

ответ

6

Боюсь, я не совсем определил, какие элементы вы хотите поменять местами, но 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

именно то, что мне было нужно. – Luke101

0

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

Смежные вопросы