Líneas vacías mientras se utiliza minidom.toprettyxml

He estado usando un minidom.toprettyxml para prettificar mi archivo xml. Cuando estoy creando un archivo XML y estoy usando este método, todo funciona bien, pero si lo uso después de haber modificado el archivo xml (por ejemplo, he agregado nodos adicionales) y luego lo estoy escribiendo en XML Estoy obteniendo líneas vacías, cada vez que lo actualizo, obtengo más líneas vacías …

mi código :

file.write(prettify(xmlRoot)) def prettify(elem): rough_string = xml.tostring(elem, 'utf-8') //xml as ElementTree reparsed = mini.parseString(rough_string) //mini as minidom return reparsed.toprettyxml(indent=" ") 

y el resultado:

       

alguna sugerencia ?

Gracias.

Encontré una solución aquí: http://code.activestate.com/recipes/576750-pretty-print-xml/

Luego lo modifiqué para tomar una cadena en lugar de un archivo.

 from xml.dom.minidom import parseString pretty_print = lambda data: '\n'.join([line for line in parseString(data).toprettyxml(indent=' '*2).split('\n') if line.strip()]) 

Salida:

       

Esto puede ayudarte a trabajarlo en tu función un poco más fácil:

 def new_prettify(): reparsed = parseString(CONTENT) print '\n'.join([line for line in reparsed.toprettyxml(indent=' '*2).split('\n') if line.strip()]) 

Encontré una solución fácil para este problema, solo con cambiar la última línea de ustedes, prettify () para que sea:

 def prettify(elem): rough_string = xml.tostring(elem, 'utf-8') //xml as ElementTree reparsed = mini.parseString(rough_string) //mini as minidom return reparsed.toprettyxml(indent=" ", newl='') 

Usa esto para resolver problemas con las líneas.

toprettyxml(indent=' ', newl='\r', encoding="utf-8")

Estoy teniendo el mismo problema con Python 2.7 (32b) en una máquina con Windows 10. El problema parece ser que cuando Python analiza un texto XML a un objeto ElementTree, agrega algunas alimentaciones de línea molestas a los atributos de “texto” o “cola” de cada elemento.

Este script elimina tales caracteres de salto de línea:

 def removeAnnoyingLines(elem): hasWords = re.compile("\\w") for element in elem.iter(): if not re.search(hasWords,str(element.tail)): element.tail="" if not re.search(hasWords,str(element.text)): element.text = "" 

Use esta función antes de “imprimir en forma bonita” su árbol:

 removeAnnoyingLines(element) myXml = xml.dom.minidom.parseString(xml.etree.ElementTree.tostring(element)) print myXml.toprettyxml() 

Funciono para mi Espero que te funcione!