Как клонировать Element
объекты в Python xml.etree
? Я пытаюсь процедурно перемещать и копировать (затем изменять их атрибуты) узлы.
Etree Clone Node
Ответ 1
Вы можете просто использовать copy.deepcopy(), чтобы сделать копию элемента. (это также будет работать с lxml, кстати).
Ответ 2
Другое, и несколько тревожное решение:
new_element = lxml.etree.fromstring(lxml.etree.tostring(elem))
Ответ 3
По крайней мере, в Python 2.7 etree Element есть метод копирования: http://hg.python.org/cpython/file/2.7/Lib/xml/etree/ElementTree.py#l233
Это мелкая копия, но в некоторых случаях это предпочтительнее.
В моем случае я дублирую некоторые элементы SVG и добавляю преобразование. Дублирование детей не будет служить какой-либо цели, поскольку, когда они уместны, они уже наследуют их родительское преобразование.
Ответ 4
Если у вас есть дескриптор на Element
elem
parent
, вы можете позвонить
new_element = SubElement(parent, elem.tag, elem.attrib)
В противном случае вы можете попробовать
new_element = makeelement(elem.tag, elem.attrib)
но это не рекомендуется.
Ответ 5
Для справок в будущем.
Самый простой способ скопировать node (или дерево) и оставить его дочерним, без необходимости использовать для него ДРУГОЕ.
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