2011-01-20 15 views
9

से एक नया XDocument बनाएं मेरे पास एक ऐसा फ़ंक्शन है जो XDocument ऑब्जेक्ट को तर्क के रूप में लेता है।मौजूदा XDocument

मैं किसी दूसरे संग्रह में अन्य वस्तुओं के एक नंबर के माध्यम से और उन वस्तुओं में से हर एक के लिए पाश की जरूरत है, XDocument पर कुछ कार्रवाई करने के। लेकिन लूप के प्रत्येक पुनरावृत्ति को मूल XDocument की एक प्राचीन प्रति की आवश्यकता होती है जो फ़ंक्शन में पास हो जाती है।

हालांकि अगर मैं फ़ंक्शन में पारित होने वाले वेरिएबल पर अपने ऑपरेशन को आजमाता हूं और निष्पादित करता हूं तो यह पॉइंटर की तरह व्यवहार करता है - इसलिए लूप के प्रत्येक पुनरावृत्ति को अंतिम पुनरावृत्ति के अंत में जो भी राज्य छोड़ा गया था, उसमें XDocument प्राप्त होता है बिल्कुल कोई उपयोग नहीं है।

स्पष्ट रूप से मुझे एक्सडॉक्यूमेंट की एक प्रति बनाने की आवश्यकता है लेकिन मुझे ऐसा करने का कोई सीधा तरीका नहीं दिख रहा है। कोशिश कर रहा है:

XDocument currentServerXml = XDocumentFromFunction.Document(): 

और फिर XDocumentFromFunction के बजाय currentServerXml का उपयोग करके मुझे एक ही सूचक है और एक ही व्यवहार के साथ एक ही कॉपी हो जाता है।

मैं लूप के प्रत्येक पुनरावृत्ति के लिए डेटा की एक नई नई प्रति कैसे बना सकता हूं?

+0

आप भी अपने XDocument क्लोनिंग जैसे मैं सुझाव पर विचार किया? – Filburt

उत्तर

17

आप XDocument constructor कि एक XDocument लेता है के लिए देख रहे हैं। यह उत्तीर्ण 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

मैंने इसे चेक किया है और एक्स डॉक्यूमेंट में सेव (स्ट्रीम) अधिभार है! : डी यहां आपके पास अधिभार सूची है: 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(); 
संबंधित मुद्दे