从树中创建子树,用xml表示 - python

时间:2010-03-10 04:12:29

标签: python xml parsing tree subtree

我有一个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文档不会那么大,它很容易适合内存。

1 个答案:

答案 0 :(得分:4)

ElementTree对于“阅读”和“写作”来说都很简单。

你的第一个XML示例(我编辑你的问题只是为了添加格式以便它可读!)无效,我假设缺少bd的关闭标记,如你所说的那样“子树”(对我来说看起来不像是一个子树,但看起来它的目的是重写你的第一个表格)。

网络上的“漂亮”问题(例如添加换行符和缩进以使生成的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结构方面完全正确; - )。