0

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

4

1 回答 1

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 等)。

tin然后,我根据您给出的 XML 字符串构建两棵树——输入一棵树;tou,输出一,最初为空,除了根元素。

tin剩下的就是对' 根的所有子元素的一个非常简单的循环:对于每一个,都会构建一个合适的子树并将其附加到tou' 根的子元素——这就是它的全部内容。

最后两行显示了生成的树(由于空格问题,不漂亮,但在 XML 结构方面完全正确;-)。

于 2010-03-10T04:24:44.357 回答