2012-01-26 5 views
7

lxml内で要素を指定すると、その要素をすべて読み込んで再作成しなくても、xml文書のどこかで要素全体を移動できますか?私の最も良い例は両親を変えることです。私は少しドキュメントの周りをうろついたが、多くの運がなかった。前もって感謝します!要素全体を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>' 

は注意してくださいことをやりますテールテキスト。 lxmlのテールテキストでは、ノードに属していて、それに沿って移動します。 (ノードを削除する場合も、その尾のテキストも削除されます)

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

Type-o ?: node_aはnode_f.append(node_a)行のnode_bでなければなりません# 'a'は 'f'の下にあります(コメント 'a'も修正します)。 –

0

既存の要素にサブ要素を追加する.append().insert()メソッドを使用することができます。

>>> from lxml import etree 
>>> from_ = etree.fromstring("<from/>") 
>>> to = etree.fromstring("<to/>") 
>>> to.append(from_) 
>>> etree.tostring(to) 
'<to><from/></to>' 
関連する問題