2012-01-26 32 views
7

Trong phạm vi lxml, có thể cho một phần tử, di chuyển toàn bộ nội dung ở nơi khác trong tài liệu xml mà không phải đọc tất cả các con của nó và tạo lại không? Ví dụ tốt nhất của tôi sẽ thay đổi cha mẹ. Tôi đã lục lọi quanh các tài liệu một chút nhưng không có nhiều may mắn. Cảm ơn trước!Di chuyển toàn bộ phần tử bằng lxml.etree

Trả lời

14

.append, .insert và các hoạt động khác làm điều đó theo mặc định

>>> from lxml import etree 
>>> tree = etree.XML('<a><b><c/></b><d><e><f/></e></d></a>') 
>>> node_b = tree.xpath('/a/b')[0] 
>>> node_d = tree.xpath('/a/d')[0] 
>>> node_d.append(node_b) 
>>> etree.tostring(tree) # complete 'b'-branch is now under 'd', after 'e' 
'<a><d><e><f/></e><b><c/></b></d></a>' 
>>> node_f = tree.xpath('/a/d/e/f')[0] # Nothing stops us from moving it again 
>>> node_f.append(node_a) # Now 'a' is deep under 'f' 
>>> etree.tostring(tree) 
'<a><d><e><f><b><c/></b></f></e></d></a>' 

Hãy cẩn thận khi di chuyển các nút có một văn bản đuôi. Trong văn bản đuôi lxml thuộc về nút và di chuyển xung quanh nó. (Ngoài ra, khi bạn xóa một nút, văn bản đuôi của nó cũng bị xóa)

>>> tree = etree.XML('<a><b><c/></b>TAIL<d><e><f/></e></d></a>') 
>>> node_b = tree.xpath('/a/b')[0] 
>>> node_d = tree.xpath('/a/d')[0] 
>>> node_d.append(node_b) 
>>> etree.tostring(tree) 
'<a><d><e><f/></e><b><c/></b>TAIL</d></a>' 

Đôi khi đó là một hiệu quả mong muốn, nhưng đôi khi bạn sẽ cần một cái gì đó như thế:

>>> tree = etree.XML('<a><b><c/></b>TAIL<d><e><f/></e></d></a>') 
>>> node_b = tree.xpath('/a/b')[0] 
>>> node_d = tree.xpath('/a/d')[0] 
>>> node_a = tree.xpath('/a')[0] 
>>> # Manually move text 
>>> node_a.text = node_b.tail 
>>> node_b.tail = None 
>>> node_d.append(node_b) 
>>> etree.tostring(tree) 
>>> # Now TAIL text stays within its old place 
'<a>TAIL<d><e><f/></e><b><c/></b></d></a>' 
+0

Chính xác những gì tôi cần. Cảm ơn! – Cryptite

+0

Loại-o ?: node_a phải là node_b trên dòng "node_f.append (node_a) # Bây giờ 'a' nằm sâu dưới 'f'" (cũng sửa bình luận 'a') –

0

Bạn có thể sử dụng .append(), .insert() phương pháp để thêm một subelement tới phần tử hiện có:

>>> from lxml import etree 
>>> from_ = etree.fromstring("<from/>") 
>>> to = etree.fromstring("<to/>") 
>>> to.append(from_) 
>>> etree.tostring(to) 
'<to><from/></to>' 
Các vấn đề liên quan