无法转储或写入ElementTree元素

时间:2011-06-30 10:52:29

标签: python xml elementtree

即使是最简单的Element(Tree)实例也输出了问题。如果我在Python 2.7.1中尝试以下代码

>>> from xml.etree.ElementTree import Element, SubElement, tostring
>>> root = Element('parent')
>>> child = Element('child')
>>> SubElement(root, child)
>>> tostring(root)

我收到错误:

TypeError: cannot serialize <Element 'root' at 0x9a7c7ec> (type Element)

我必须做错事,但文档并没有指出任何明显的事情。

4 个答案:

答案 0 :(得分:8)

SubElement不会将元素作为第二个参数。 API docs将签名设为

SubElement(parent, tag, attrib={}, **extra)

即。第二个参数是子元素的标记(即名称)

ElementTree docs提供更多详情

要添加子元素,请查看元素上的append方法,例如

root.append(child)

答案 1 :(得分:4)

http://docs.python.org/library/xml.etree.elementtree.html#xml.etree.ElementTree.SubElement

SubElement的第二个参数是tag(str)而不是Element,它自己创建Element实例:

>>> SubElement(root, 'child')
0: <Element 'child' at 0x1f2dfb0>
>>> tostring(root)
1: '<parent><child /></parent>'

答案 2 :(得分:1)

SubElement的第二个参数是一个String - 您要添加到根元素的标记的名称。如果您正在处理append,则需要insertElement

答案 3 :(得分:0)

问题已经很久了,但是也许这句话可以帮助某人: 当XML对象是使用例如创建时,也可能引发``无法序列化''。 lxml和.tostring是从另一个库中调用的,例如xml.etree.ElementTree

(肮脏的)解决方案的示例(此处未显示针对无效参数的保护措施

inxml = elxml.getroot() if hasattr(elxml, 'getroot') else elxml
try:
    from lxml import etree as ETS
    outstr = ETS.tostring(inxml)
except:
    try:
        import xml.etree.cElementTree as ETS
    except:
        import xml.etree.ElementTree as ETS
    outstr = ETS.tostring(inxml)
return outstr