2010-10-23 2 views
24

Как клонировать Element объектов в Python xml.etree? Я пытаюсь процедурно перемещать и копировать (затем изменять их атрибуты) узлы.etree Clone Node

ответ

30

Вы можете просто использовать copy.deepcopy(), чтобы сделать копию элемента. (кстати, это также будет работать с lxml).

+4

Это делает копию, но она не добавляется к дереву. Для этого вам нужно сделать 'append()' или 'insert()'. –

+0

это также работает с cElementTree, кстати ;-) – 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

Как @ Ming-Tang упоминает, это ** не ** копирует детей. – halloleo

3

Другое, и несколько тревожное решение:

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

По крайней мере, в Python 2.7 etree Элемента имеет метод копирования: http://hg.python.org/cpython/file/2.7/Lib/xml/etree/ElementTree.py#l233

Это неполная копия, но, что является предпочтительным в некоторых случаях ,

В моем случае я дублирую некоторые элементы SVG и добавляю преобразование. Дублирование детей не будет служить какой-либо цели, поскольку, когда они уместны, они уже наследуют трансформацию своего родителя.

+3

Для тех, кто использует это и думая о замене * xml.etree.ElementTree * на * lxml.etree * в будущем, обратите внимание, что 'Element.copy()' не существует в * lxml.etree * и 'copy.copy()' также копирует файлы, когда применяется к 'lxml.etree.Element'. – meowsqueak

+0

Не работает ни с cElementTree (Python 2.7). Поэтому предпочитайте 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

 Смежные вопросы

  • Нет связанных вопросов^_^