2011-01-20 2 views
9

저는 XDocument 객체를 인자로 취하는 함수를 가지고 있습니다.기존 XDocument에서 새 XDocument 만들기

다른 컬렉션의 다른 개체를 반복해야하며 해당 개체 각각에 대해 XDocument에서 일부 작업을 수행해야합니다. 그러나 lopp의 각 반복에는 함수에 전달 된 원래 XDocument의 초기 복사본이 필요합니다.

그러나 함수에 전달 된 변수에 대한 연산을 포인터처럼 작동 시키면 루프의 각 반복은 마지막 반복의 끝 부분에 남아있는 상태에 관계없이 XDocument를받습니다. 전혀 쓸모가 없다.

분명히 Xdocument 복사본을 만들어야하지만이 작업을 수행하는 간단한 방법은 없습니다. 시도 :

XDocument currentServerXml = XDocumentFromFunction.Document(): 

을 그리고 대신 XDocumentFromFunction의 currentServerXml를 사용하는 것은 나에게 같은 포인터와 같은 동작과 동일한 복사본을 가져옵니다.

루프의 반복마다 데이터의 새로운 복사본을 만들려면 어떻게해야합니까?

+0

당신이 또한 내가 제안처럼하여 XDocument를 복제 생각 했습니까? – Filburt

답변

17

당신은하여 XDocument을 소요하여 XDocument constructor 찾고 있습니다. 그러면 전달 된 XDocument의 전체 복사본이 만들어집니다.

샘플 코드 :

var foo_original = XDocument.Load("foo.xml"); 
var foo_copy1 = new XDocument(foo_original); 
var foo_copy2 = new XDocument(foo_original); 
0

XDocument를 스트림에 저장하고 해당 스트림에서 다른 인스턴스를로드하십시오.

편집 : 해당 솔루션을 캡슐화 할 수있는 확장 메서드 "CreateCopy()"를 구현할 수 있으므로 사용하기 쉬운 솔루션을 요청할 수 있습니다.

+0

스트림을 허용하는 XDocument에 대한 오버로드 메서드가 없습니다. –

+0

제안에 감사드립니다.하지만 XDocument를 스트림에 저장할 수 없다면 많은 도움이되지 않습니다! 내가 왜 과부하가 보이지 않는지 이해가 안됩니다. 스트림을 받아들입니다. 네임 스페이스가 없습니까? –

+0

그걸 확인하고 XDocument에 Save (Stream) overload가 있습니다! : D 여기에 오버로드 목록이 있습니다. http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.save.aspx 사용 가능한지 알려주십시오! –

0

다른 응답자가 제안한대로 스트림이 최상의 옵션이됩니다. 그러나 스트림을 사용할 수없는 내 위치에 붙어 사람을 위해, 가장 간단한 방법 대신 TextReader를 사용하는 것입니다 :

  TextReader tr = new StringReader(myXDocument.ToString()); 
      XDocument copyOfMyXDocument = XDocument.Load(tr); 

짜잔!

0

어때 대략 MemberwiseClone?

XDocument newdoc = XDocumentFromFunction.Document().MemberwiseClone(); 
관련 문제