¿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 .
En Python 2, podría usar el str
tipo tanto para texto como para datos binarios . Desafortunadamente, esta confluencia de dos conceptos diferentes podría conducir a un código frágil que a veces funciona para cualquier tipo de datos, otras no. [...]
Para que la distinción entre texto y datos binarios sea más clara y pronunciada, [Python 3] hizo que el texto y los datos binarios fueran tipos distintos que no se pueden mezclar a ciegas .
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
o utf-8
. De lo contrario, si necesitamos compatibilidad con Python 2 y 3, podemos usar decode()
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 con Element
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>
<?xml version='1.0' encoding='utf8'?>
encabezado. Cuando esutf-8
el encabezado no está incluido. Además, siet
era un ElementTree, debes aprobaret.getroot()
.