Как клонировать Element
объектов в Python xml.etree
? Я пытаюсь процедурно перемещать и копировать (затем изменять их атрибуты) узлы.etree Clone Node
ответ
Вы можете просто использовать copy.deepcopy(), чтобы сделать копию элемента. (кстати, это также будет работать с lxml).
Если у вас есть ручка на Element
elem
«ы parent
вы можете позвонить
new_element = SubElement(parent, elem.tag, elem.attrib)
В противном случае вы можете попробовать
new_element = makeelement(elem.tag, elem.attrib)
, но это не рекомендуется.
Я думаю, что они не копируют дочерние узлы .. . –
@SHiNKiROU Вы можете сравнить 'id (old_element)' с 'id (new_element)', чтобы увидеть, действительно ли он создает другой объект в памяти. Помогает ли это? –
Как @ Ming-Tang упоминает, это ** не ** копирует детей. – halloleo
Другое, и несколько тревожное решение:
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 и добавляю преобразование. Дублирование детей не будет служить какой-либо цели, поскольку, когда они уместны, они уже наследуют трансформацию своего родителя.
Для тех, кто использует это и думая о замене * xml.etree.ElementTree * на * lxml.etree * в будущем, обратите внимание, что 'Element.copy()' не существует в * lxml.etree * и 'copy.copy()' также копирует файлы, когда применяется к 'lxml.etree.Element'. – meowsqueak
Не работает ни с cElementTree (Python 2.7). Поэтому предпочитайте copy.copy() (мелкая копия) или copy.deepcopy() для эволюции кода. – Thierry
Для справок в будущем.
Простейший способ скопировать узел (или дерево) и держать его ребенок, без необходимости импорта ДРУГОГО библиотеки ТОЛЬКО для этого:
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
Чтобы быть ясным, это не глубокая копия. (Да, почта говорит «и держит своих детей», но я все еще чувствовал необходимость проверить, что это значит.) – harpo
Это делает копию, но она не добавляется к дереву. Для этого вам нужно сделать 'append()' или 'insert()'. –
это также работает с cElementTree, кстати ;-) – Thierry