2012-05-15 1 views
4

는 다음 코드Linq to XML infanticide - 손자를 대신하여 자녀를 대체 할 수있는 간편한 방법이 있습니까?

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

에 라인들의 순서를 변경하는 경우 원형 관계 설정 및 제거는 eventualy OutOfMemoryException시킨다.

이 작업을 수행하는 간단하고 편리한 방법이 있습니까?

편집

실제로 구현 된 수정

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

변명 내 홍조이었다.

+2

제목만으로 투표 할 가치가 있습니다! –

답변

5

그렇지 않으면 빈 결과를 얻을이 대신

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

당신 때문에 게으른 평가 결과를 산출하기 위해 열거를 강제로 일을보십시오.

+0

Jodrell의 코드를 실행 한 다음 제안한 변경 사항을 적용했습니다. 그것은 나를 위해 일했습니다. –

+0

네, 실제로'Single()'같은 효과를 사용했습니다. 곧 받아 들일 것입니다. – Jodrell

0

루트 요소에 추가하기 전에 usurper.Remove()에 전화해야한다고 생각합니다. 이 단계가 없으면 살인자는 항상 "c"엘리먼트의 자손이 될 것이므로 "c"가 제거되면 살인자도 제거됩니다.