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 字符串构建两棵树——输入一棵树;tou
,输出一,最初为空,除了根元素。
tin
剩下的就是对' 根的所有子元素的一个非常简单的循环:对于每一个,都会构建一个合适的子树并将其附加到tou
' 根的子元素——这就是它的全部内容。
最后两行显示了生成的树(由于空格问题,不漂亮,但在 XML 结构方面完全正确;-)。