考虑以下代码段
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);
请原谅我的脸红。
答案 0 :(得分:5)
尝试这样做
var usurper = family.Root.Descendants("g").ToList();
由于延迟评估,您必须强制枚举产生结果,否则您将得到一个空结果。
答案 1 :(得分:0)
我认为在将其添加到Root元素之前需要调用usurper.Remove()
。如果没有这一步,篡夺者将永远是“c”元素的后代,所以当“c”被移除时,篡位者也将如此。