我有一个XML(以树的形式),我需要从中创建子树。
例如:
<a>
<b>
<c>Hello</c>
<d>
<e>Hi</e>
</a>
子树将是
<root>
<a>
<b>
<c>Hello</c>
</b>
</a>
<a>
<d>
<e>Hi</e>
</d>
</a>
</root>
python中最好的XML库是什么?任何已经执行此操作的算法也会有所帮助。注意:XML文档不会那么大,它很容易适合内存。
答案 0 :(得分:4)
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,.. )。
然后我从你给出的XML字符串中构建两个树 - tin
,输入一个; tou
,输出一,最初为空,除了根元素。
所有其余部分都是tin
根的所有子元素上的一个非常简单的循环:对于每个子元素,构建一个合适的子树并附加到tou
的根的子元素 - 这就是全部有它。
最后两行显示生成的树(由于空白问题而不是很漂亮,但在XML结构方面完全正确; - )。