2010-10-23 10 views
24

पाइथन xml.etree में Element ऑब्जेक्ट्स कैसे क्लोन करें? मैं प्रक्रियात्मक रूप से स्थानांतरित करने और प्रतिलिपि बनाने (फिर उनके गुणों को संशोधित करने) की कोशिश कर रहा हूं।एट्री क्लोन नोड

उत्तर

30

आप तत्व की एक प्रति बनाने के लिए बस copy.deepcopy() का उपयोग कर सकते हैं। (यह वैसे भी एलएक्सएमएल के साथ काम करेगा)।

+4

यह एक प्रति बनाता है, लेकिन यह पेड़ में नहीं जोड़ा गया है। ऐसा करने के लिए आपको 'संलग्न() 'या' insert() 'करना होगा। –

+0

यह सीलेमेंट ट्री के साथ भी काम करता है ;-) – Thierry

0

आप Elementelem के parent पर एक संभाल है, तो आप कॉल कर सकते हैं

new_element = SubElement(parent, elem.tag, elem.attrib) 

नहीं तो आप

new_element = makeelement(elem.tag, elem.attrib) 

की कोशिश करना चाहते हो सकता है, लेकिन यह सलाह नहीं दी है।

+2

मुझे लगता है कि वे बच्चे नोड्स नकल नहीं है .. –

+0

@SHiNKiROU आप 'id (old_element)' की तुलना 'id (new_element)' से कर सकते हैं यह देखने के लिए कि क्या यह वास्तव में स्मृति में एक अलग वस्तु बनाता है। क्या यह मदद करता है? –

+0

@ मिंग-टैंग का उल्लेख है, यह ** ** बच्चों की प्रतिलिपि नहीं करता है। – halloleo

3

एक अलग, और कुछ हद तक परेशान समाधान:

new_element = lxml.etree.fromstring(lxml.etree.tostring(elem)) 
1

कम से कम अजगर में 2.7 etree तत्व एक प्रति विधि है: http://hg.python.org/cpython/file/2.7/Lib/xml/etree/ElementTree.py#l233

यह एक उथले प्रतिलिपि है, लेकिन कुछ मामलों में बेहतर है ।

मेरे मामले में मैं कुछ एसवीजी तत्वों को डुप्लिकेट कर रहा हूं और एक रूपांतरण जोड़ रहा हूं। बच्चों को डुप्लिकेट करना किसी भी उद्देश्य की सेवा नहीं करेगा क्योंकि जहां से वे अपने माता-पिता के परिवर्तन को पहले ही प्राप्त कर चुके हैं।

+3

भविष्य में * xml.etree.ElementTree * * lxml.etree * के साथ * xml.etree.ElementTree * को बदलने के बारे में सोचने के लिए, ध्यान दें कि 'Element.copy() 'मौजूद नहीं है * lxml.etree * में, और 'copy.copy()' बच्चों को प्रतिलिपि बनाता है, जब 'lxml.etree.Element' पर लागू होता है। – meowsqueak

+0

या तो CElementTree (पायथन 2.7) के साथ काम नहीं करता है। तो कोड evolutivity के लिए copy.copy() (उथले प्रतिलिपि) या copy.deepcopy() पसंद करते हैं। – Thierry

-1

भविष्य के संदर्भ के लिए।

सबसे आसान तरीका एक नोड (या पेड़) को कॉपी करें और रखने के लिए बच्चों को है, आयात करने के लिए एक और पुस्तकालय केवल उस के लिए बिना:

def copy_tree(tree_root): 
    return et.ElementTree(tree_root); 

duplicated_node_tree = copy_tree (node); # type(duplicated_node_tree) is ElementTree 
duplicated_tree_root_element = new_tree.getroot(); # type(duplicated_tree_root_element) is Element 
+0

स्पष्ट होने के लिए, यह एक गहरी प्रति नहीं है। (हां, पोस्ट कहता है "और अपने बच्चों को रखो," लेकिन मुझे अभी भी इसका मतलब परीक्षण करने की आवश्यकता महसूस हुई।) – harpo

संबंधित मुद्दे