2011-02-23 16 views
10

Después de leer un archivo existente con el XML "feo" y hacer algunas modificaciones, la impresión bonita no funciona. Lo intenté etree.write(FILE_NAME, pretty_print=True).Impresora XML bonita de Python con lxml

tengo el siguiente código XML:

<testsuites tests="14" failures="0" disabled="0" errors="0" time="0.306" name="AllTests"> 
    <testsuite name="AIR" tests="14" failures="0" disabled="0" errors="0" time="0.306"> 
.... 

y lo uso como esto:

tree = etree.parse('original.xml') 
root = tree.getroot() 

...  
# modifications 
... 

with open(FILE_NAME, "w") as f: 
    tree.write(f, pretty_print=True) 

Respuesta

33

Para mí, esta cuestión no se resolvió hasta que me di cuenta de este dato poco aquí:

http://lxml.de/FAQ.html#why-doesn-t-the-pretty-print-option-reformat-my-xml-output

versión corta:

Leer en el archivo con este comando:

>>> parser = etree.XMLParser(remove_blank_text=True) 
>>> tree = etree.parse(filename, parser) 

Eso va a "restablecer" la sangría ya existente, lo que permite la salida para generar su propia sangría correctamente. Luego pretty_print como de costumbre:

>>> tree.write(<output_file_name>, pretty_print=True) 
6
fp = file('out.txt', 'w') 
print(e.tree.tostring(...), file=fp) 
fp.close() 
+0

¿Qué es e.tree? –

7

Pues bien, de acuerdo con el API docs, no existe un método "escritura" en el lxml etree module. Tienes un par de opciones con respecto a obtener una bonita cadena xml impresa en un archivo. Usted puede utilizar el método toString de este modo:

f = open('doc.xml', 'w') 
f.write(etree.tostring(root, pretty_print=True)) 
f.close() 

O, si su fuente de entrada es menos que perfecto y/o si desea más mandos y botones para configurar su hacia fuera puesto que podría utilizar una de las envolturas de Python para la ordenado lib.

http://utidylib.berlios.de/

import tidy 
f.write(tidy.parseString(your_xml_str, **{'output_xml':1, 'indent':1, 'input_xml':1})) 

http://countergram.com/open-source/pytidylib

from tidylib import tidy_document 
document, errors = tidy_document(your_xml_str, options={'output_xml':1, 'indent':1, 'input_xml':1}) 
f.write(document) 
2

No estoy seguro de por qué otras respuestas no mencionaron esto. Si desea obtener la raíz del xml, hay un método llamado getroot(). Espero haber respondido tu pregunta (aunque un poco tarde).

tree = et.parse(xmlFile) 
root = tree.getroot() 
Cuestiones relacionadas