即使是最简单的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)
我必须做错事,但文档并没有指出任何明显的事情。
答案 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
,则需要insert
或Element
。
答案 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