¿Cómo consigo que el ElementTree de Python se imprima bastante en un archivo XML?

Fondo

Estoy utilizando SQLite para acceder a una base de datos y recuperar la información deseada. Estoy usando ElementTree en Python versión 2.6 para crear un archivo XML con esa información.

Código

import sqlite3 import xml.etree.ElementTree as ET # NOTE: Omitted code where I acccess the database, # pull data, and add elements to the tree tree = ET.ElementTree(root) # Pretty printing to Python shell for testing purposes from xml.dom import minidom print minidom.parseString(ET.tostring(root)).toprettyxml(indent = " ") ####### Here lies my problem ####### tree.write("New_Database.xml") 

Intentos

He intentado usar tree.write("New_Database.xml", "utf-8") en lugar de la última línea de código anterior, pero no editó el diseño del XML en absoluto, sigue siendo un desastre.

También decidí juguetear y traté de hacer:
tree = minidom.parseString(ET.tostring(root)).toprettyxml(indent = " ")
en lugar de imprimir esto en el shell de Python, que da el error AttributeError: el objeto ‘unicode’ no tiene el atributo ‘write’ .

Preguntas

Cuando escribo mi árbol en un archivo XML en la última línea, ¿hay alguna forma de imprimir el archivo XML como lo hace en el shell de Python?

¿Puedo usar toprettyxml() aquí o hay una forma diferente de hacerlo?

Cualquiera que sea su cadena XML, puede escribirla en el archivo de su elección abriendo un archivo para escribir y escribir la cadena en el archivo.

 from xml.dom import minidom xmlstr = minidom.parseString(ET.tostring(root)).toprettyxml(indent=" ") with open("New_Database.xml", "w") as f: f.write(xmlstr) 

Existe una posible complicación, especialmente en Python 2, que es menos estricta y menos sofisticada acerca de los caracteres Unicode en las cadenas. Si su método toprettyxml devuelve una cadena Unicode ( u"something" ), es posible que desee convertirla en una encoding de archivo adecuada, como UTF-8. Por ejemplo, reemplazar la línea de una escritura con:

 f.write(xmlstr.encode('utf-8')) 

Instalar bs4

 pip install bs4 

Utilice este código para imprimir bastante:

 from bs4 import BeautifulSoup x = your xml print(BeautifulSoup(x, "xml").prettify()) 

Echa un vistazo al módulo vkbeautify .

La entrada y la salida pueden ser cadenas / archivos en cualquier combinación. Es muy compacto y no tiene ninguna dependencia.

 import vkbeautify as vkb a) pretty_text = vkb.xml(your_xml_text) #return String b) vkb.xml(your_xml_text, 'path/to/dest/file') #save in file 

Si uno quiere usar lxml, se podría hacer de la siguiente manera:

 from lxml import etree xml_object = etree.tostring(root, pretty_print=True, xml_declaration=True, encoding='UTF-8') with open("xmlfile.xml", "wb") as writter: writter.write(xml_object)` 

Si ve espacios de nombres xml, por ejemplo, py:pytype="TREE" , es posible que desee agregar antes de la creación de xml_object

 etree.cleanup_namespaces(root) 

Esto debería ser suficiente para cualquier adaptación en su código.