Làm thế nào để sao chép các đối tượng Element
trong Python xml.etree
? Tôi đang cố gắng di chuyển và sao chép theo thủ tục (sau đó sửa đổi các thuộc tính của họ) các nút.etree Clone Node
Trả lời
Bạn chỉ có thể sử dụng copy.deepcopy() để tạo bản sao của phần tử. (điều này cũng sẽ làm việc với lxml bằng cách này).
Nếu bạn có một tay cầm ở Element
elem
's parent
bạn có thể gọi
new_element = SubElement(parent, elem.tag, elem.attrib)
Nếu không, bạn có thể muốn thử
new_element = makeelement(elem.tag, elem.attrib)
nhưng điều này là không đúng đắn.
Tôi nghĩ rằng họ không sao chép các nút con .. –
@SHiNKiROU Bạn có thể so sánh 'id (old_element)' với 'id (new_element)' để xem nó có thực sự tạo một đối tượng khác trong bộ nhớ hay không. Không giúp đỡ à? –
Như @ Ming-Tang đề cập, điều này ** không ** sao chép trẻ em. – halloleo
Một khác nhau, và có phần đáng lo ngại giải pháp:
new_element = lxml.etree.fromstring(lxml.etree.tostring(elem))
Ít nhất bằng Python 2.7 etree phần tử có một phương thức sao chép: http://hg.python.org/cpython/file/2.7/Lib/xml/etree/ElementTree.py#l233
Nó là một bản sao cạn, nhưng đó là một lợi thế trong một số trường hợp .
Trong trường hợp của tôi, tôi đang sao chép một số phần tử SVG và thêm biến đổi. Trẻ em sao chép sẽ không phục vụ bất kỳ mục đích nào kể từ khi có liên quan mà chúng đã thừa hưởng biến đổi của cha mẹ chúng.
Đối với bất kỳ ai sử dụng điều này và nghĩ đến việc thay thế * xml.etree.ElementTree * bằng * lxml.etree * trong tương lai, lưu ý rằng 'Element.copy()' không tồn tại trong * lxml.etree *, và 'copy.copy()' cũng sao chép trẻ em, khi được áp dụng cho một 'lxml.etree.Element'. – meowsqueak
Không hoạt động với cElementTree (Python 2.7). Vì vậy, thích copy.copy() (bản sao nông) hoặc copy.deepcopy() cho mã evolutivity. – Thierry
Để tham khảo sau này.
đơn giản nhất cách để sao chép một nút (hoặc cây) và giữ nó là trẻ em, mà không cần phải nhập khẩu KHÁC thư viện CHỈ cho rằng:
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
Để rõ ràng, đây không phải là một bản sao sâu. (Có, bài viết nói "và giữ con cái của nó", nhưng tôi vẫn cảm thấy cần phải kiểm tra ý nghĩa của nó.) – harpo
- 1. Duplicate/Clone Node trong JavaFX 2.0
- 2. Làm thế nào để lưu một đối tượng etree xml? tiết kiệm bốc lxml vấn đề đối tượng etree
- 3. Node-PerfectAPI vs Restify.js so với ExpressJS vs Node-APIServer
- 4. typedef struct node * NODE chỉ ra điều gì?
- 5. Python kiểm soát etree định dạng thẻ trống
- 6. Lỗi clone Hudson git
- 7. Hàng bảng jQuery Clone
- 8. Clone Controls - C# (Winform)
- 9. Clone Tổng Object Graph
- 10. git clone localhost?
- 11. clone hàng bảng
- 12. Node JS Lỗi: ENOENT
- 13. Node-webkit WinAPI
- 14. Node Express Content-Length
- 15. Arbor Js - Node Onclick?
- 16. d3 Node Labeling
- 17. git clone https/ssl lỗi
- 18. Clone một repo git (sâu)
- 19. .Net MemberwiseClone vs Java Clone
- 20. Node MySQL escape LIKE statement
- 21. Node JS LDAP Auth tài
- 22. Xác định Node của DOMElement
- 23. Node script ném uv_signal_start EINVAL
- 24. Đọc First Node từ XMLDocument
- 25. Node-waf: không tìm thấy
- 26. là gì sự khác biệt giữa --mirror git clone git clone và --bare
- 27. Đồng bộ hóa tệp với node.js: unision == tcp == node ----- [http] ----- node == tcp == unison
- 28. Mục đích của nút "đầu tiên" trong khai báo: "typedef struct node {- - -} Node;"?
- 29. jquery clone chọn không giữ giá trị
- 30. git push/clone vào máy chủ mới
Điều đó tạo một bản sao, nhưng nó không được thêm vào cây. Bạn sẽ cần phải làm một 'append()' hoặc 'insert()' để làm điều đó. –
điều này cũng làm việc với cElementTree bằng cách này ;-) – Thierry