Siempre que llamo ElementTree.tostring(e)
, recibo el siguiente mensaje de error:
AttributeError: 'Element' object has no attribute 'getroot'
¿Hay alguna otra forma de convertir un objeto ElementTree en una cadena XML?
Rastrear:
Traceback (most recent call last):
File "Development/Python/REObjectSort/REObjectResolver.py", line 145, in <module>
cm = integrateDataWithCsv(cm, csvm)
File "Development/Python/REObjectSort/REObjectResolver.py", line 137, in integrateDataWithCsv
xmlstr = ElementTree.tostring(et.getroot(),encoding='utf8',method='xml')
AttributeError: 'Element' object has no attribute 'getroot'
python
xml
marshalling
elementtree
Stevoisiak
fuente
fuente
<?xml version='1.0' encoding='utf8'?>
encabezado. Cuando esutf-8
el encabezado no está incluido. Además, siet
era un ElementTree, debes aprobaret.getroot()
.encoding='utf8'
devuelve una cadena de bytes en lugar de una cadena. Recomiendo usar en sutostring(xml, encoding="unicode")
lugar .str
es el mismo tipo de objeto quebytes
Python 3. La salida de bytes es completamente correcta, usarunicode
como salida es esencialmente una adición que le permite evitar tener que decodificar si necesita una cadena Unicode en su lugar para su caso de uso específico.help
, soloencoding="unicode"
devolverá una cadena.¿Cómo convierto
ElementTree.Element
a una cadena?Para Python 3:
xml_str = ElementTree.tostring(xml, encoding='unicode')
Para Python 2:
xml_str = ElementTree.tostring(xml, encoding='utf-8')
Para compatibilidad con Python 2 y 3:
xml_str = ElementTree.tostring(xml).decode()
Uso de ejemplo
from xml.etree import ElementTree xml = ElementTree.Element("Person", Name="John") xml_str = ElementTree.tostring(xml).decode() print(xml_str)
Salida:
<Person Name="John" />
Explicación
A pesar de lo que implica el nombre,
ElementTree.tostring()
devuelve una cadena de bytes por defecto en Python 2 y 3. Este es un problema en Python 3, que usa Unicode para cadenas .Fuente: Portando el código de Python 2 a Python 3
Si sabemos qué versión de Python se está utilizando, podemos especificar la codificación como
unicode
outf-8
. De lo contrario, si necesitamos compatibilidad con Python 2 y 3, podemos usardecode()
para convertir al tipo correcto.Como referencia, he incluido una comparación de
.tostring()
resultados entre Python 2 y Python 3.ElementTree.tostring(xml) # Python 3: b'<Person Name="John" />' # Python 2: <Person Name="John" /> ElementTree.tostring(xml, encoding='unicode') # Python 3: <Person Name="John" /> # Python 2: LookupError: unknown encoding: unicode ElementTree.tostring(xml, encoding='utf-8') # Python 3: b'<Person Name="John" />' # Python 2: <Person Name="John" /> ElementTree.tostring(xml).decode() # Python 3: <Person Name="John" /> # Python 2: <Person Name="John" />
Gracias a Martijn Peters por señalar que el
str
tipo de datos cambió entre Python 2 y 3.¿Por qué no usar str ()?
En la mayoría de los escenarios, usar
str()
sería la forma " canónica " de convertir un objeto en una cadena. Desafortunadamente, usar esto conElement
devuelve la ubicación del objeto en la memoria como una cadena hexadecimal, en lugar de una representación de cadena de los datos del objeto.from xml.etree import ElementTree xml = ElementTree.Element("Person", Name="John") print(str(xml)) # <Element 'Person' at 0x00497A80>
fuente
ElementTree.tostring()
también genera una cadena de bytes. Elstr
tipo es una cadena de bytes en Python 2 (elstr
tipo de Python 3 se llamaunicode
en Python 2).unicode
cadena de regreso.Extensión de respuesta no latina
Extensión de la respuesta de @ Stevoisiak y manejo de caracteres no latinos. Solo una forma le mostrará los caracteres no latinos. El único método es diferente tanto en Python 3 como en Python 2.
Entrada
xml = ElementTree.fromstring('<Person Name="크리스" />') xml = ElementTree.Element("Person", Name="크리스") # Read Note about Python 2
Salida
ElementTree.tostring(xml) # Python 3 (크리스): b'<Person Name="크리스" />' # Python 3 (John): b'<Person Name="John" />' # Python 2 (크리스): <Person Name="크리스" /> # Python 2 (John): <Person Name="John" /> ElementTree.tostring(xml, encoding='unicode') # Python 3 (크리스): <Person Name="크리스" /> <-------- Python 3 # Python 3 (John): <Person Name="John" /> # Python 2 (크리스): LookupError: unknown encoding: unicode # Python 2 (John): LookupError: unknown encoding: unicode ElementTree.tostring(xml, encoding='utf-8') # Python 3 (크리스): b'<Person Name="\xed\x81\xac\xeb\xa6\xac\xec\x8a\xa4" />' # Python 3 (John): b'<Person Name="John" />' # Python 2 (크리스): <Person Name="크리스" /> <-------- Python 2 # Python 2 (John): <Person Name="John" /> ElementTree.tostring(xml).decode() # Python 3 (크리스): <Person Name="크리스" /> # Python 3 (John): <Person Name="John" /> # Python 2 (크리스): <Person Name="크리스" /> # Python 2 (John): <Person Name="John" />
fuente