2009-11-02 11 views
10

Actualmente estoy usando la función toprettyxml() del módulo xml.dom en un script python y tengo algunos problemas con las nuevas líneas. Si no utiliza el parámetro newl o si uso toprettyxml (newl = '\ n') en realidad muestra varias líneas nuevas en lugar de solo una.problema con las nuevas líneas cuando uso toprettyxml()

Por ejemplo

f = open(filename, 'w') 
f.write(dom1.toprettyxml(encoding='UTF-8')) 
f.close() 

exhibidas:

<params> 


    <param name="Level" value="#LEVEL#"/> 


    <param name="Code" value="281"/> 


</params> 

¿alguien sabe dónde está el problema proviene y cómo lo puedo usar? FYI Estoy usando Python 2.6.1

Respuesta

10

toprettyxml() es bastante horrible. No es una cuestión de Windows y '\ r \ n'. Probar cualquier cadena como el parámetro newl muestra que se están agregando demasiadas líneas. No solo eso, sino también otros espacios en blanco (que pueden causarle problemas cuando una máquina lee el xml) también se agregan.

Algunas soluciones disponibles en
http://ronrothman.com/public/leftbraned/xml-dom-minidom-toprettyxml-and-silly-whitespace

+1

gracias Xv mucho! De hecho, ahora, estoy tratando de usar toprettyxml() el menor número posible, pero es bueno saber que hay una solución alternativa para este problema molesto. Y la publicación es muy clara – PierrOz

-1

¿Está viendo el archivo resultante en Windows? Si es así, intente usar toprettyxml(newl='\r\n').

+0

La solución no funciona – Igal

1

Si no le importa instalar paquetes nuevos, intente beautifulsoup. Tuve muy buenas experiencias con su xml prettyfier.

4

toprettyxml(newl='') me funciona en Windows.

+0

Trabajar en Ubuntu 16.04 (bash) también – renedet

4

he encontrado otra gran solución:

f = open(filename, 'w') 
dom_string = dom1.toprettyxml(encoding='UTF-8') 
dom_string = os.linesep.join([s for s in dom_string.splitlines() if s.strip()]) 
f.write(dom_string) 
f.close() 

encima solución elimina básicamente las nuevas líneas no deseadas de la dom_string que son generados por toprettyxml().

entradas tomadas de ->What's a quick one-liner to remove empty lines from a python string?

+1

Para python3, debe ser '' 'dom_string = b '\ n'.join ([s para s en dom_string.splitlines() si s.strip()]) '' ' –

0

Ésta es una pregunta bastante viejo pero supongo que saben lo que el problema es:

Minidoms impresión bonita tiene un método bastante sencillo. Simplemente agrega los caracteres que especificó como argumentos. Eso significa que duplicará los caracteres si ya existen.

E.g. Si analizar un archivo XML que tiene este aspecto:

<parent> 
    <child> 
     Some text 
    </child> 
</parent> 

ya hay caracteres de nueva línea y entrantes dentro del DOM. Esos son tomados como nodos de texto por minidom y todavía están allí cuando lo analiza en un objeto dom.

Si ahora procede a convertir el objeto dom en una cadena XML, esos nodos de texto seguirán allí. Significa que aún quedan caracteres de línea nuevos y pestañas de sangría. Usando pretty print now, solo agregará más líneas nuevas y más pestañas. Es por eso que en este caso, no usar nada de impresión o especificar newl='' dará como resultado la salida deseada.

Sin embargo, usted genera el dom en su secuencia de comandos, los nodos de texto no estarán allí, por lo tanto, la impresión bonita con newl='\r\n' y/o addindent='\t' resultará bastante bonita.

TL; DR sangrías y saltos de línea se conservan de analizar e imprimir bastante simplemente añade más

Cuestiones relacionadas