Клонирование узла с помощью etree
Как клонировать объекты Element
в Python с использованием xml.etree
? Я пытаюсь программно перемещать и копировать узлы (а затем изменять их атрибуты).
4 ответ(ов)
Если у вас есть ссылка на родительский элемент elem.parent
, вы можете использовать следующий код:
new_element = SubElement(parent, elem.tag, elem.attrib)
В противном случае, вы можете попробовать следующий вариант:
new_element = makeelement(elem.tag, elem.attrib)
Однако это не рекомендуется, так как подход с SubElement
является более предпочтительным и безопасным.
Разное, и несколько тревожное решение:
new_element = lxml.etree.fromstring(lxml.etree.tostring(elem))
Этот подход создает новый элемент на основе существующего, используя сериализацию и повторную десериализацию. Хотя это может быть эффективно в некоторых случаях, стоит обратить внимание на возможные нежелательные последствия, такие как потеря контекста или атрибутов. Возможно, есть более предпочтительные методы клонирования элементов, такие как deepcopy()
, которые могут быть более безопасными и надежными в использовании.
В 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
позволяет вам манипулировать элементами более эффективно, избегая ненужного дублирования дочерних узлов.
Для всех, кто заглянет сюда из будущего:
Если вам нужно клонировать весь элемент, используйте метод append
.
new_tree = ET.Element('root')
for elem in a_different_tree:
new_tree.append(elem)
@dennis-williamson оставил комментарий об этом, который я упустил, и в конце концов наткнулся на ответ здесь: https://stackoverflow.com/a/6533808/4916945
Как изменить порядок столбцов в DataFrame?
'pip' не распознан как командa внутреннего или внешнего формата
Почему statistics.mean() работает так медленно?
Преобразование строки даты JSON в datetime в Python
Есть ли разница между поднятием экземпляра класса Exception и самого класса Exception?