Linq to XML杀婴 - 是否有一种简单的权宜之计来促使孙子女取代孩子?

时间:2012-05-15 16:10:55

标签: c# linq-to-xml

考虑以下代码段

using System;
using System.Xml.Linq;

class Program
{
    static void Main()
    {
        var family = XDocument.Parse("<p><c><g/></c></p>");

        var usurper = family.Root.Descendants("g");
        family.Root.Element("c").Remove();
        family.Root.Add(usurper);

        Console.WriteLine(family.ToString());
        Console.ReadKey();
    }
}

我得到的输出是@"<p />",但我希望@"<p><g/></p>"。我可以看出为什么会发生这种情况,并且有一种正义,但它不是我需要的输出。

如果我将行的顺序更改为

        var usurper = family.Root.Descendants("g");
        family.Root.Add(usurper);
        family.Root.Element("c").Remove();

设置了循环关系,并且remove eventualy会导致OutOfMemoryException

是否有一种简单,方便的方法来完成这项工作?

修改

我实际实施的修复是

        var usurper = family.Root.Descendants("g").Single();
        family.Root.Element("c").Remove();
        family.Root.Add(usurper);

请原谅我的脸红。

2 个答案:

答案 0 :(得分:5)

尝试这样做

var usurper = family.Root.Descendants("g").ToList();

由于延迟评估,您必须强制枚举产生结果,否则您将得到一个空结果。

答案 1 :(得分:0)

我认为在将其添加到Root元素之前需要调用usurper.Remove()。如果没有这一步,篡夺者将永远是“c”元素的后代,所以当“c”被移除时,篡位者也将如此。