2011-10-26 11 views
18

Tengo un archivo xml con el que estoy usando etree de lxml para trabajar, pero cuando le agrego etiquetas, parece que la impresión bonita no funciona .La impresión bonita en lxml falla cuando agrego etiquetas a un árbol analizado

>>> from lxml import etree 
>>> root = etree.parse('file.xml').getroot() 
>>> print etree.tostring(root, pretty_print = True) 

<root> 
    <x> 
    <y>test1</y> 
    </x> 
</root> 

Hasta ahora todo bien. Pero ahora

>>> x = root.find('x') 
>>> z = etree.SubElement(x, 'z') 
>>> etree.SubElement(z, 'z1').attrib['value'] = 'val1' 
>>> print etree.tostring(root, pretty_print = True) 

<root> 
    <x> 
    <y>test1</y> 
    <z><z1 value="val1"/></z></x> 
</root> 

ya no es bonita. También traté de hacerlo "hacia atrás", donde creo la etiqueta z1, luego creo la etiqueta z y anexo z1 a ella, luego agrego la etiqueta z a la etiqueta x. Pero obtengo el mismo resultado.

Si no analizo el archivo y simplemente creo todas las etiquetas de una vez, se imprimirá correctamente. Entonces creo que tiene algo que ver con analizar el archivo.

¿Cómo puedo obtener una bonita impresión para trabajar?

Respuesta

30

Tiene que ver con cómo lxml trata el espacio en blanco - ver lxml FAQ para más detalles.

Para solucionar este problema, cambiar el área de carga del archivo en el siguiente:

parser = etree.XMLParser(remove_blank_text=True) 
root = etree.parse('file.xml', parser).getroot() 

no he probado, pero se debe sangrar su archivo muy bien con este cambio.

+1

Ah, bien, esto parece estar funcionando. Había visto esa pregunta de preguntas frecuentes, pero creo que la leí mal. Pensé que estaba diciendo que solo debería importar si tienes datos de texto con espacios en blanco, lo que no hice. Pero supongo que importa si tienes _todos elementos con datos de texto. Gracias por la solución rápida. –

Cuestiones relacionadas