代码之家  ›  专栏  ›  技术社区  ›  Luke101

如何将linq中的两个XML元素交换为XML

  •  2
  • Luke101  · 技术社区  · 15 年前

    here 但这毕竟对我不起作用。我想交换这两个元素。当我运行程序时,元素不会被交换,但是当我调用ToList()时,元素会在列表中被交换,而不会在列表中被交换

    <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 回复  |  直到 8 年前
        1
  •  7
  •   Jon Skeet    15 年前

    恐怕我还没弄清楚你到底想交换哪些元素,但是 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 .

        2
  •  0
  •   Eric Mickelsen    15 年前

    .Reverse()