2008-10-16 2 views
49

LINQ to XML XElement의 전체 복사본을 만들고 싶습니다. 이 작업을 수행하려는 이유는 수정 된 사본을 만들려는 문서의 일부 노드가 있다는 것입니다 (같은 문서에서). 나는 이것을 할 방법이 보이지 않는다.LINQ to XML의 요소를 전체 복사본으로 만드는 방법은 무엇입니까?

요소를 XML 문자열로 변환 한 다음 다시 구문 분석 할 수 있지만 더 좋은 방법이 있는지 궁금합니다.

+0

Daniel -이 질문에 대한 대답을 다시 생각해보십시오. –

+0

완료 - 답변을 수락했습니다. –

답변

98

재분석 할 필요가 없습니다. XElement를의 생성자 중 하나는 다른 XElement를 소요하고 그것의 전체 복사합니다 :

[TestMethod] 
public void XElementShallowCopyShouldOnlyCopyReference() 
{ 
    XElement original = new XElement("original"); 
    XElement shallowCopy = original; 
    shallowCopy.Name = "copy"; 
    Assert.AreEqual("copy", original.Name); 
} 

[TestMethod] 
public void ShouldGetXElementDeepCopyUsingConstructorArgument() 
{ 
    XElement original = new XElement("original"); 
    XElement deepCopy = new XElement(original); 
    deepCopy.Name = "copy"; 
    Assert.AreEqual("original", original.Name); 
    Assert.AreEqual("copy", deepCopy.Name); 
} 
+0

+1 : *이 * 게시물은 허용 된 답변이어야합니다. –

+0

+1. –

+2

이 예제에서 사용 된 생성자는 일반적으로 ** 복사 생성자 **로 알려져 있습니다. 다음은 ['XElement' 복사 생성자] (http://msdn.microsoft.com/en-us/library/bb297950%28v=vs.110%29.aspx)의 문서입니다. ['XDocument' 복사 생성자] (http://msdn.microsoft.com/en-us/library/bb341301%28v=vs.110%29.aspx)도 있습니다. 다행스럽게도 ** LINQ to XML **를 사용하면 일반적으로 [딥 복사 (또는 복제)]를 쉽게 수행 할 수 있습니다 (http://stackoverflow.com/questions/78536/deep-cloning-objects-in-c). - 샤프)는 여러 번 그렇게 간단하지 않을 수 있습니다. – DavidRR

-2

XNode 스타일 트리의 전체 복사본을 수행 할 수있는 기존 메커니즘이 있다고 생각하지 않습니다. 두 가지 옵션이 남아 있다고 생각합니다. 당신은 문자열로 변환을 제안

  1. 는 수행 한 후 다시 나무로
  2. 쓰기 자신에 방문자 패턴

방문자 패턴이 확실히 가능하다으로하지만 좋은 거래를 취할 것 테스트 작업. 나는 최선의 선택이 # 1이라고 생각한다.

6

ToString 및 재분석 방법이 가장 좋은 방법 인 것처럼 보입니다.

XElement copy = XElement.Parse(original.ToString()); 
+0

DstNode.Add (복사)를 추가하십시오. 끝난. – Fraga

2

C# 3.0 in a Nutshell 문의 드러내 :

노드 또는 속성은 노드 또는 속성의 부모 속성으로 설정된다 (기능 구성 또는 추가 방법을 통해 여부) 요소에 첨가 여기서 코드는 그 요소. 노드에는 부모 요소가 하나만있을 수 있습니다. 이미 부모 노드 인 노드를 두 번째 부모 노드에 추가하면 해당 노드가 자동으로 복제됩니다.

var address = new XElement ("address", 
        new XElement ("street", "Lawley St"), 
        new XElement ("town", "North Beach") 
      ); 
var customer1 = new XElement ("customer1", address); 
var customer2 = new XElement ("customer2", address); 

customer1.Element ("address").Element ("street").Value = "Another St"; 
Console.WriteLine (
    customer2.Element ("address").Element ("street").Value); // Lawley St 

이 자동 중복 부작용-다른 함수형 프로그래밍의 특징을 무료로 X-DOM 객체 인스턴스화를 유지 : 다음 예에서, 각 고객은 주소의 별도의 사본이 있습니다.

+3

왜 이것이 승인 된 답변으로 표시되어 있습니까? –

0

이 작동합니다 :

var copy = new XElement(original.Name, original.Attributes(), 
         original.Elements()); 
다음
XElement original = new XElement("original"); 
XElement deepCopy = new XElement(original); 

단위 테스트의 몇 입증됩니다
관련 문제