LINQ to XML XElement의 전체 복사본을 만들고 싶습니다. 이 작업을 수행하려는 이유는 수정 된 사본을 만들려는 문서의 일부 노드가 있다는 것입니다 (같은 문서에서). 나는 이것을 할 방법이 보이지 않는다.LINQ to XML의 요소를 전체 복사본으로 만드는 방법은 무엇입니까?
요소를 XML 문자열로 변환 한 다음 다시 구문 분석 할 수 있지만 더 좋은 방법이 있는지 궁금합니다.
LINQ to XML XElement의 전체 복사본을 만들고 싶습니다. 이 작업을 수행하려는 이유는 수정 된 사본을 만들려는 문서의 일부 노드가 있다는 것입니다 (같은 문서에서). 나는 이것을 할 방법이 보이지 않는다.LINQ to XML의 요소를 전체 복사본으로 만드는 방법은 무엇입니까?
요소를 XML 문자열로 변환 한 다음 다시 구문 분석 할 수 있지만 더 좋은 방법이 있는지 궁금합니다.
재분석 할 필요가 없습니다. 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);
}
+1 : *이 * 게시물은 허용 된 답변이어야합니다. –
+1. –
이 예제에서 사용 된 생성자는 일반적으로 ** 복사 생성자 **로 알려져 있습니다. 다음은 ['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
XNode 스타일 트리의 전체 복사본을 수행 할 수있는 기존 메커니즘이 있다고 생각하지 않습니다. 두 가지 옵션이 남아 있다고 생각합니다. 당신은 문자열로 변환을 제안
방문자 패턴이 확실히 가능하다으로하지만 좋은 거래를 취할 것 테스트 작업. 나는 최선의 선택이 # 1이라고 생각한다.
ToString 및 재분석 방법이 가장 좋은 방법 인 것처럼 보입니다.
XElement copy = XElement.Parse(original.ToString());
DstNode.Add (복사)를 추가하십시오. 끝난. – Fraga
가 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 객체 인스턴스화를 유지 : 다음 예에서, 각 고객은 주소의 별도의 사본이 있습니다.
왜 이것이 승인 된 답변으로 표시되어 있습니까? –
이 작동합니다 :
var copy = new XElement(original.Name, original.Attributes(),
original.Elements());
다음
XElement original = new XElement("original");
XElement deepCopy = new XElement(original);
단위 테스트의 몇 입증됩니다
Daniel -이 질문에 대한 대답을 다시 생각해보십시오. –
완료 - 답변을 수락했습니다. –