Saltar al contenido

Convertir Python ElementTree en string

Después de consultar con especialistas en el tema, programadores de varias ramas y maestros hemos dado con la respuesta al problema y la compartimos en esta publicación.

Solución:

Element los objetos no tienen .getroot() método. Soltar esa llamada, y el .tostring() la llamada funciona:

xmlstr = ElementTree.tostring(et, encoding='utf8', method='xml')

Solo necesitas usar .getroot() si tienes un ElementTree ejemplo.

Otras notas:

  • Esto produce un cadena de bytesque en Python 3 es el bytes escribe.
    Si debe tener un str objeto, tienes dos opciones:

    1. Decodifique el valor de bytes resultante, de UTF-8: xmlstr.decode("utf8")

    2. Utilizar encoding='unicode'; esto evita un ciclo de codificación / decodificación:

      xmlstr = ElementTree.tostring(et, encoding='unicode', method='xml')
      
  • Si quería el valor de cadena de bytes codificado en UTF-8 o está usando Python 2, tenga en cuenta que ElementTree no detecta correctamente utf8 como la codificación XML estándar, por lo que agregará un declaración. Utilizar utf-8 o UTF-8 (con un guión) si desea evitar esto. Cuando usas encoding="unicode" no se agrega ningún encabezado de declaración.

¿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')

Lo siguiente es compatible con Python 2 y 3, pero solo funciona con caracteres latinos:

xml_str = ElementTree.tostring(xml).decode()

Ejemplo de uso

from xml.etree import ElementTree

xml = ElementTree.Element("Person", Name="John")
xml_str = ElementTree.tostring(xml).decode()
print(xml_str)

Producción:



Explicación

A pesar de lo que su nombre implica, ElementTree.tostring() devuelve una cadena de bytes de forma predeterminada en Python 2 y 3. Este es un problema en Python 3, que usa Unicode para cadenas.

En Python 2 podrías usar el str escriba 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 funcionaba para cualquier tipo de datos, a veces no. […]

Para que la distinción entre texto y datos binarios sea más clara y pronunciada, [Python 3] hecho de texto y datos binarios tipos distintos que no pueden ser ciegamente mixed juntos.

Fuente: Portar 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 en el tipo correcto.

Como referencia, he incluido una comparación de .tostring() resultados entre Python 2 y Python 3.

ElementTree.tostring(xml)
# Python 3: b''
# Python 2: 

ElementTree.tostring(xml, encoding='unicode')
# Python 3: 
# Python 2: LookupError: unknown encoding: unicode

ElementTree.tostring(xml, encoding='utf-8')
# Python 3: b''
# Python 2: 

ElementTree.tostring(xml).decode()
# Python 3: 
# Python 2: 

Gracias a Martijn Peters por señalar que el str el tipo de datos cambió entre Python 2 y 3.


¿Por qué no usar str()?

En la mayoría de los escenarios, usando str() sería la forma “canónica” de convertir un objeto en un string. Desafortunadamente, usar esto con Element devuelve la ubicación del objeto en la memoria como una cadena hexadecimal, en lugar de un string representación de los datos del objeto.

from xml.etree import ElementTree

xml = ElementTree.Element("Person", Name="John")
print(str(xml))  # 

Te mostramos comentarios y puntuaciones

Si crees que ha resultado de ayuda este artículo, sería de mucha ayuda si lo compartieras con el resto programadores y nos ayudes a extender nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *