2012-01-26 29 views
7

lxml içinde, tüm öğelerini okumak ve yeniden oluşturmak zorunda kalmadan xml belgesindeki başka bir şeyi tüm nesneyi taşımak için bir öğe verildiğinde mümkün mü? En iyi örneğim ebeveynleri değiştiriyor. Dokümanları biraz karıştırdım ama çok şansım olmadı. Şimdiden teşekkürler!Tüm öğeyi lxml.etree ile taşıyın.

cevap

14

.append, .insert ve diğer işlemler sahip düğümleri taşırken varsayılan olarak

>>> 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>' 

dikkatli olun bunu bir kuyruk metni. Lxml kuyruğunda metin, düğüme aittir ve onunla birlikte hareket eder.

>>> 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>' 

Bazen istenen bir etki var (eğer bir düğüm silerken Ayrıca, kuyruğu metin de silinir), ama bazen böyle bir şey gerekir: Ben gerekli

>>> 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

Tam olarak ne. Teşekkürler! – Cryptite

+0

Type-o ?: node_a, node_b on line olmalıdır "node_f.append (node_a) # Now" a "," f "nin altındadır (ayrıca 'a' yorumunu düzeltin) –

0

Sen Mevcut öğeye bir cihazmda eklemek için .append(), .insert() yöntemleri kullanabilirsiniz:

>>> from lxml import etree 
>>> from_ = etree.fromstring("<from/>") 
>>> to = etree.fromstring("<to/>") 
>>> to.append(from_) 
>>> etree.tostring(to) 
'<to><from/></to>' 
İlgili konular