2012-01-26 6 views
7

lxml के भीतर एक संपूर्ण तत्व को ले जाएं, क्या यह संभव है, तत्व को दिया गया है, एक्सएमएल दस्तावेज़ में पूरी चीज को अपने सभी बच्चों को पढ़ने के बिना और इसे फिर से बनाने के लिए? मेरा सबसे अच्छा उदाहरण माता-पिता को बदल देगा। मैं दस्तावेज़ों के चारों ओर थोड़ा सा rummaged है लेकिन बहुत भाग्य नहीं है। अग्रिम में धन्यवाद!lxml.etree

उत्तर

14

.append, .insert और अन्य कार्यों है कि डिफ़ॉल्ट रूप से

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

करते समय सावधान रहें नोड्स चलती होने एक पूंछ पाठ। एलएक्सएमएल पूंछ पाठ में नोड से संबंधित है और इसके साथ घूमता है। (इसके अलावा, जब आप एक नोड हटा सकते हैं, इसकी पूंछ पाठ भी हटा दी जाती है)

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

कभी कभी यह एक वांछित प्रभाव है, लेकिन कभी कभी आप ऐसा ही कुछ की आवश्यकता होगी: मैं

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

वास्तव में क्या जरूरत है। धन्यवाद! – Cryptite

+0

टाइप-ओ ?: node_a लाइन पर node_b होना चाहिए "node_f.append (node_a) # अब 'ए' 'f' के अंतर्गत गहरा है" (टिप्पणी 'ए' भी ठीक करें) –

0

आप मौजूदा तत्व को एक subelement जोड़ने के लिए .append(), .insert() तरीकों का उपयोग कर सकते हैं:

>>> from lxml import etree 
>>> from_ = etree.fromstring("<from/>") 
>>> to = etree.fromstring("<to/>") 
>>> to.append(from_) 
>>> etree.tostring(to) 
'<to><from/></to>' 
संबंधित मुद्दे