etree克隆节点

时间:2010-10-23 20:43:35

标签: python xml.etree

如何在Python Element中克隆xml.etree个对象?我正试图在程序上移动和复制(然后修改它们的属性)节点。

6 个答案:

答案 0 :(得分:42)

您只需使用copy.deepcopy()制作该元素的副本即可。 (顺便说一句,这也适用于lxml)。

答案 1 :(得分:7)

一个不同的,有点令人不安的解决方案:

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

答案 2 :(得分:1)

至少在Python 2.7中,etree Element有一个复制方法: http://hg.python.org/cpython/file/2.7/Lib/xml/etree/ElementTree.py#l233

这是一个浅层副本,但在某些情况下这是优选的。

在我的情况下,我复制了一些SVG元素并添加了一个转换。复制儿童不会用于任何目的,因为相关时他们已经继承了父母的变换。

答案 3 :(得分:0)

如果您有Element elem parent的句柄,可以致电

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

否则你可能想尝试

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

但不建议这样做。

答案 4 :(得分:0)

如果您使用循环在程序中移动树,则可以使用 insert 直接克隆 ( insert(index, subelement) ) 和树索引(均在 documentation 中):

import xml.etree.ElementTree as ET
mytree = ET.parse('some_xml_file.xml')  # parse tree from xml file
root = mytree.getroot()  # get the tree root
    
for elem in root:  # iterate over children of root
   if condition_for_cloning(elem) == True:      
      elem.insert(len(elem), elem[3])  # insert the 4th child of elem to the end of the element (clone an element)  

或者对于有一些标签的孩子:

for elem in root:
   children_of_interest = elem.findall("tag_of_element_to_clone")
   elem.insert(len(elem), children_of_interest[1])

答案 5 :(得分:-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