Подтвердить что ты не робот

Etree Clone Node

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

4b9b3361

Ответ 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