He encontrado una nueva manera de evitar nuevas bibliotecas y reparsing el código XML. Sólo tiene que pasar su elemento raíz de esta función (véase más adelante la explicación):
def indent(elem, level=0):
i = "\n" + level*" "
if len(elem):
if not elem.text or not elem.text.strip():
elem.text = i + " "
if not elem.tail or not elem.tail.strip():
elem.tail = i
for elem in elem:
indent(elem, level+1)
if not elem.tail or not elem.tail.strip():
elem.tail = i
else:
if level and (not elem.tail or not elem.tail.strip()):
elem.tail = i
Hay un atributo denominado "tail" en casos xml.etree.ElementTree.Element. Este atributo se puede establecer una cadena después de un nodo:
"<a>text</a>tail"
me encontré con un enlace desde 2004 hablando de un Element Library Functions que utiliza esta "cola" para sangrar un elemento.
Ejemplo:
root = ET.fromstring("<fruits><fruit>banana</fruit><fruit>apple</fruit></fruits>""")
tree = ET.ElementTree(root)
indent(root)
# writing xml
tree.write("example.xml", encoding="utf-8", xml_declaration=True)
resultado de "example.xml":
<?xml version='1.0' encoding='utf-8'?>
<fruits>
<fruit>banana</fruit>
<fruit>apple</fruit>
</fruits>
Gracias Steven. Esto es lo que terminé haciendo. –