developer tip

LINQ to XML에서 요소의 전체 복사를 수행하려면 어떻게합니까?

copycodes 2020. 11. 27. 08:22
반응형

LINQ to XML에서 요소의 전체 복사를 수행하려면 어떻게합니까?


LINQ to XML XElement의 전체 복사본을 만들고 싶습니다. 이 작업을 수행하려는 이유는 동일한 문서에서 수정 된 복사본을 만들려는 문서에 일부 노드가 있기 때문입니다. 이 작업을 수행하는 방법이 없습니다.

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


재분석 할 필요가 없습니다. XElement의 생성자 중 하나는 다른 XElement를 사용하여 전체 복사본을 만듭니다.

XElement original = new XElement("original");
XElement deepCopy = new XElement(original);

다음은 몇 가지 단위 테스트입니다.

[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);
}

ToString 및 재분석 방법이 가장 좋은 방법 인 것 같습니다. 다음은 코드입니다.

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

간단히 말해서 C # 3.0에서 직접 해제했습니다 .

노드 또는 속성이 요소에 추가되면 (기능적 구성 또는 Add 메서드를 통해) 노드 또는 속성의 Parent 속성이 해당 요소로 설정됩니다. 노드는 하나의 부모 요소 만 가질 수 있습니다. 이미 부모가 된 노드를 두 번째 부모에 추가하면 노드가 자동으로 딥 클로닝됩니다. 다음 예에서 각 고객은 별도의 주소 사본을 가지고 있습니다.

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

XNode 스타일 트리의 깊은 복사를 수행 할 수있는 기존 메커니즘이 있다고 생각하지 않습니다. 두 가지 옵션이 남아 있다고 생각합니다.

  1. 문자열로 변환 한 다음 다시 트리로 변환하도록 제안한대로 수행하십시오.
  2. 방문자 패턴으로 자신에 대해 쓰기

The visitor pattern is certainly possible but it will take a good deal of work an testing. I think your best option is #1.

참고URL : https://stackoverflow.com/questions/209595/how-do-i-do-a-deep-copy-of-an-element-in-linq-to-xml

반응형