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-8el encabezado no está incluido. Además, sietera 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 .stres el mismo tipo de objeto quebytesPython 3. La salida de bytes es completamente correcta, usarunicodecomo 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.Elementa 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
unicodeoutf-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
strtipo 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 conElementdevuelve 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. Elstrtipo es una cadena de bytes en Python 2 (elstrtipo de Python 3 se llamaunicodeen Python 2).unicodecadena 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 2Salida
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