【问题标题】:How to swap two XML elements in linq to xml如何将 linq 中的两个 XML 元素交换为 xml
【发布时间】:2010-09-18 15:11:30
【问题描述】:

我想交换两个 xml 元素。我该怎么做呢?这是代码。我尝试了解决方案here,但它毕竟对我不起作用。我想交换这两个元素。当我运行程序时,元素不会交换,但是当我调用 ToList() 时,它会在 List 中交换,但不会在 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();

【问题讨论】:

    标签: c# xml linq-to-xml


    【解决方案1】:

    恐怕我还没有完全确定你想要交换哪些元素,但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);
        }
    }
    

    这将交换 element2element4

    请注意,这是可行的,因为第一个 x.ReplaceWith(y) 实际上创建了y副本,将原件留在其现有位置...准备好被x 替换。 p>

    【讨论】:

      【解决方案2】:

      .Reverse() 以相反的顺序返回元素。它不会交换它们。

      【讨论】:

        猜你喜欢
        • 2011-12-26
        • 2020-01-18
        • 1970-01-01
        • 2018-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多