I'm having a problem outputting even the simplest Element(Tree) instances. If I try the following code in Python 2.7.1
>>> from xml.etree.ElementTree import Element, SubElement, tostring
>>> root = Element('parent')
>>> child = Element('child')
>>> SubElement(root, child)
>>> tostring(root)
I get an error:
TypeError: cannot serialize <Element 'ro开发者_JAVA百科ot' at 0x9a7c7ec> (type Element)
I must be doing something wrong but the documentation isn't pointing me at anything obvious.
SubElement does not take an element as the second parameter. The API docs give the signature as
SubElement(parent, tag, attrib={}, **extra)
i.e. the second parameter is the tag (i.e. name) of the sub element
The ElementTree docs give more detail
To add a child element look at the append method on Element e.g.
root.append(child)
http://docs.python.org/library/xml.etree.elementtree.html#xml.etree.ElementTree.SubElement
SubElement's second argument is tag (str) not Element, it creates Element instance by itself:
>>> SubElement(root, 'child')
0: <Element 'child' at 0x1f2dfb0>
>>> tostring(root)
1: '<parent><child /></parent>'
Problem is pretty old but maybe this remark will help someone: 'cannot serialize' can be thrown also when XML object was created with e.g. lxml and .tostring is called from another library, e.g. xml.etree.ElementTree
Example of (dirty) solution (no protection against invalid args shown here)
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
SubElement
's second parameter is a String -- the name of the tag you'd like to add to the root Element. You either want append
or insert
if you're dealing with Element
s.
精彩评论