如何在Python中克隆Element
對象xml.etree
?我試圖按程序移動並複製(然後修改它們的屬性)節點。etree克隆節點
回答
您可以使用copy.deepcopy()複製該元素。 (這也適用於lxml)。
如果您對Element
elem
的parent
句柄就可以調用
new_element = SubElement(parent, elem.tag, elem.attrib)
否則,你可能會想嘗試
new_element = makeelement(elem.tag, elem.attrib)
但這是不明智的。
我認爲他們不復制子節點.. 。 – 2010-10-23 21:06:05
@SHiNKiROU你可以比較'id(old_element)'和'id(new_element)'來看看它是否真的在內存中創建了一個不同的對象。這有幫助嗎? – 2010-10-23 21:19:56
正如@明唐提到的,這**不會**複製孩子。 – halloleo 2016-02-16 02:58:40
甲不同的,並且有些令人不安溶液:
new_element = lxml.etree.fromstring(lxml.etree.tostring(elem))
至少在Python 2.7 etree元件具有複製方法: http://hg.python.org/cpython/file/2.7/Lib/xml/etree/ElementTree.py#l233
它是一種淺拷貝,但是這是在某些情況下優選的。
在我的情況下,我複製了一些SVG元素並添加了一個轉換。重複兒童不會有任何用處,因爲他們已經繼承了父母的轉變。
對於任何人使用這個和以後用* lxml.etree *替換* xml.etree.ElementTree *的想法,注意'Element.copy()'不存在在應用於'lxml.etree.Element'時,* lxml.etree *和'copy.copy()'也會複製兒童。 – meowsqueak 2016-07-20 00:48:29
不適用於cElementTree(Python 2.7)。因此,更喜歡copy.copy()(淺拷貝)或copy.deepcopy()代碼演變。 – Thierry 2017-10-09 15:29:41
供將來參考。
最簡單的方法複製節點(或樹),並保持它的孩子,而無需導入ANOTHER庫ONLY爲:
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
要清楚,這不是一個深層次的副本。 (是的,這個帖子說「保留孩子」,但我仍然需要測試它的含義。) – harpo 2015-08-17 20:42:21
- 1. 節點克隆和刪除
- 2. SceneKit克隆一個節點
- 3. 如何克隆一個節點
- 4. javascript刪除克隆節點父表
- 5. 克隆節點並附加到xml
- 6. JavaFX 2.0中的重複/克隆節點
- 7. YUI - 克隆節點複製事件
- 8. SimpleXML的克隆節點位置
- 9. 拋出:DOMException而克隆XML節點
- 10. JavaScript克隆XML節點問題
- 11. Drupal - 節點克隆替代品
- 12. 在IE中的HTML5節點克隆節點問題
- 13. 克隆的節點不等於原始節點(使用isEqualNode)
- 14. 克隆和點擊?
- 15. 克隆div點擊
- 16. 如何在克隆事件綁定的同時克隆AngularJS節點?
- 17. 詹金斯 - 無法從奴隸節點克隆克隆。 SSH密鑰
- 18. 克隆Morea框架站點
- 19. Java克隆的優點
- 20. WordPress的多站點克隆
- 21. 克隆行不克隆TR
- 22. 克隆或不克隆
- 23. jQuery的克隆不克隆
- 24. SCNNode clone()爲節點添加更多光線,因爲節點被克隆了
- 25. 爲什麼javax.xml.xpath.XPath與克隆節點的行爲不同?
- 26. 克隆節點不工作後更改innerhtml
- 27. 刪除錶行的所有克隆節點在JavaScript
- 28. 用節點克隆重複一個HTML/PHP代碼
- 29. 將JQuery應用於插入的克隆節點
- 30. 的JavaScript在一個表中移動克隆節點
這是一個副本,但沒有添加到樹中。你需要做一個'append()'或'insert()'來做到這一點。 – 2013-02-20 22:51:15
這也適用於cElementTree ;-) – Thierry 2017-10-09 15:30:28