ElementTree является хорошим и простым для «чтения» и «письма».
Ваш первый пример XML (я редактировал свой вопрос просто добавить форматирование, поэтому было бы читаемым!) Является недействительным, я предполагаю, что пропавшие близкие-теги для b
и d
, употребляемые в то, что вы называете «поддерево» (который выглядит ничего подобного поддерева для меня, но похоже, что он предназначен как переписывание вашей первой формы).
Net вопросы «prettyfication» (например, добавление новых строк и отступов, чтобы полученный 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 at the start пытается использовать версии C для модулей на «нормальных» платформах, где они доступны, в противном случае возвращаются к модулям pure-Python (для App Engine, Jython, IronPython, ...).
Затем я строю два дерева - tin
, входной, из строки XML, которую вы даете; tou
, выходный, изначально пустой, за исключением корневого элемента.
Всего остальное очень просто петля на все подэлементы из tin
«корня s: для каждого из них подходит поддерево построено и добавляется к подэлементам tou
» s корень - это все, что есть в ней.
Последние две строки показывают полученное дерево (не очень, из-за проблем с пробелами, но совершенно правильное с точки зрения структуры XML ;-).