2010-10-23 122 views
24

如何在Python中克隆Element對象xml.etree?我試圖按程序移動並複製(然後修改它們的屬性)節點。etree克隆節點

回答

30

您可以使用copy.deepcopy()複製該元素。 (這也適用於lxml)。

+4

這是一個副本,但沒有添加到樹中。你需要做一個'append()'或'insert()'來做到這一點。 – 2013-02-20 22:51:15

+0

這也適用於cElementTree ;-) – Thierry 2017-10-09 15:30:28

0

如果您對Elementelemparent句柄就可以調用

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

否則,你可能會想嘗試

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

但這是不明智的。

+2

我認爲他們不復制子節點.. 。 – 2010-10-23 21:06:05

+0

@SHiNKiROU你可以比較'id(old_element)'和'id(new_element)'來看看它是否真的在內存中創建了一個不同的對象。這有幫助嗎? – 2010-10-23 21:19:56

+0

正如@明唐提到的,這**不會**複製孩子。 – halloleo 2016-02-16 02:58:40

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

對於任何人使用這個和以後用* lxml.etree *替換* xml.etree.ElementTree *的想法,注意'Element.copy()'不存在在應用於'lxml.etree.Element'時,* lxml.etree *和'copy.copy()'也會複製兒童。 – meowsqueak 2016-07-20 00:48:29

+0

不適用於cElementTree(Python 2.7)。因此,更喜歡copy.copy()(淺拷貝)或copy.deepcopy()代碼演變。 – Thierry 2017-10-09 15:29:41

-1

供將來參考。

最簡單的方法複製節點(或樹),並保持它的孩子,而無需導入ANOTHERONLY爲:

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 2015-08-17 20:42:21