سؤال
كيفية استنساخ Element
الأشياء في بيثون xml.etree
؟ أحاول نقل العقد ونسخها (ثم تعديل سماتها).
المحلول
يمكنك فقط استخدام copy.deepcopy () لعمل نسخة من العنصر. (سيعمل هذا أيضًا مع LXML).
نصائح أخرى
حل مختلف ومقلق إلى حد ما:
new_element = lxml.etree.fromstring(lxml.etree.tostring(elem))
على الأقل في عنصر Python 2.7 Etree لديه طريقة نسخ:http://hg.python.org/cpython/file/2.7/lib/xml/etree/elementtree.py#l233
إنها نسخة ضحلة ، لكن هذا هو الأفضل في بعض الحالات.
في حالتي ، أقوم بتكرار بعض عناصر SVG وإضافة تحويل. إن تكرار الأطفال لن يخدموا أي غرض لأنهم يرثون بالفعل تحويل والديهم.
إذا كان لديك مقبض على Element
elem
'س parent
تستطيع الاتصال
new_element = SubElement(parent, elem.tag, elem.attrib)
وإلا فقد ترغب في المحاولة
new_element = makeelement(elem.tag, elem.attrib)
ولكن هذا لا ينصح.
للرجوع إليها في المستقبل.
أبسط طريقة لنسخ عقدة (أو شجرة) والحفاظ على أطفالها ، دون الحاجة إلى الاستيراد اخر مكتبة فقط من أجل هذا:
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