ElementTreeは、「読み取り」と「書き込み」の両方に適したシンプルなものです。
最初のXMLの例(読みやすいようにフォーマットを追加するためだけに質問を編集しました!)は無効です。 「サブツリー」と呼ばれるもの(私にはサブツリーのようには見えません)のクローズタグが欠落しているbと思います。 d、ただし、最初のフォームの書き直しとして意図されているように見えます)。
「きれいさ」の問題を除いて(たとえば、結果のXMLをきれいに見せるために改行とインデントを追加する;-)、私があなたを正しく理解していれば、このコードはあなたが求めていることを実行するはずです:
try:
import xml.etree.cElementTree as et
import cStringIO as sio
except ImportError:
import xml.etree.ElementTree as et
import StringIO as sio
xmlin = sio.StringIO('''<a>
<b>
<c>Hello</c>
</b>
<d>
<e>Hi</e>
</d>
</a>
''')
tin = et.parse(xmlin)
top = tin.getroot()
tou = et.ElementTree(et.Element('root'))
newtop = tou.getroot()
for child in top.getchildren():
subtree = et.Element(top.tag)
subtree.append(child)
newtop.append(subtree)
import sys
tou.write(sys.stdout)
最初のtry/exceptは、利用可能な「通常の」プラットフォームでモジュールのCバージョンを使用しようとしますが、それ以外の場合は純粋なPythonモジュールにフォールバックします(App Engine、Jython、IronPythonなど)。
次にtin、指定されたXML文字列から2つのツリー(入力ツリー)を作成します。tou、出力のもの。ルート要素を除いて、最初は空です。
残りはすべて、tinルートのすべてのサブ要素に対する非常に単純なループです。それぞれについて、適切なサブツリーが構築され、ルートのサブ要素に追加されtouます。これですべてです。
最後の2行は、結果のツリーを示しています(空白の問題のため、きれいではありませんが、XML構造に関しては完全に正しいです;-)。