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 스타일 트리의 깊은 복사를 수행 할 수있는 기존 메커니즘이 있다고 생각하지 않습니다. 두 가지 옵션이 남아 있다고 생각합니다.
- 문자열로 변환 한 다음 다시 트리로 변환하도록 제안한대로 수행하십시오.
- 방문자 패턴으로 자신에 대해 쓰기
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
'developer tip' 카테고리의 다른 글
Jupyter 노트북에서 IOPub 데이터 속도 초과 (이미지를 볼 때) (0) | 2020.11.27 |
---|---|
onKeyDown 이벤트가 React의 div에서 작동하지 않습니다. (0) | 2020.11.27 |
전 처리기의 C # 매크로 정의 (0) | 2020.11.27 |
Python에서 문자열 대신 datetime으로 sqlite에서 datetime을 다시 읽는 방법은 무엇입니까? (0) | 2020.11.27 |
ITextSharp HTML을 PDF로? (0) | 2020.11.27 |