0

Клонирование узла с помощью etree

10

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

4 ответ(ов)

0

Если у вас есть ссылка на родительский элемент elem.parent, вы можете использовать следующий код:

new_element = SubElement(parent, elem.tag, elem.attrib)

В противном случае, вы можете попробовать следующий вариант:

new_element = makeelement(elem.tag, elem.attrib)

Однако это не рекомендуется, так как подход с SubElement является более предпочтительным и безопасным.

0

Разное, и несколько тревожное решение:

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

Этот подход создает новый элемент на основе существующего, используя сериализацию и повторную десериализацию. Хотя это может быть эффективно в некоторых случаях, стоит обратить внимание на возможные нежелательные последствия, такие как потеря контекста или атрибутов. Возможно, есть более предпочтительные методы клонирования элементов, такие как deepcopy(), которые могут быть более безопасными и надежными в использовании.

0

В Python 2.7 объект Element из библиотеки etree действительно имеет метод copy, который вы можете использовать для создания поверхностной копии элемента. Это может быть полезно в ситуациях, когда вы хотите создать новый элемент, но не нуждаетесь в дублировании всех дочерних элементов.

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

Вот пример использования метода copy:

import xml.etree.ElementTree as ET

# Создаем элемент
original_element = ET.Element('svg')
# Делаем поверхностную копию
copied_element = ET.Element(original_element.tag, original_element.attrib)

# Добавляем трансформацию к скопированному элементу
copied_element.set('transform', 'translate(10, 10)')

# Теперь copied_element имеет ту же атрибуты, что и original_element, и свою собственную трансформацию

Таким образом, использование метода copy позволяет вам манипулировать элементами более эффективно, избегая ненужного дублирования дочерних узлов.

0

Для всех, кто заглянет сюда из будущего:

Если вам нужно клонировать весь элемент, используйте метод append.

new_tree = ET.Element('root')
for elem in a_different_tree:
    new_tree.append(elem)

@dennis-williamson оставил комментарий об этом, который я упустил, и в конце концов наткнулся на ответ здесь: https://stackoverflow.com/a/6533808/4916945

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь