Changing the default indentation of etree.tostring in lxml

Question:

I have an XML document which I’m pretty-printing using lxml.etree.tostring

print etree.tostring(doc, pretty_print=True)

The default level of indentation is 2 spaces, and I’d like to change this to 4 spaces. There isn’t any argument for this in the tostring function; is there a way to do this easily with lxml?

Asked By: Eli Courtwright

||

Answers:

As said in this thread, there is no real way to change the indent of the lxml.etree.tostring pretty-print.

But, you can:

  • add a XSLT transform to change the indent
  • add whitespace to the tree, with something like in the cElementTree library

code:

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
Answered By: ThibThib

Since version 4.5, you can set indent size using indent() function.

etree.indent(root, space="    ")
print(etree.tostring(root))
Answered By: kuch

You may check this solution. Changing the space value allows you to get any indent you want. It can be different amount of spaces or tab "t" character(s).

Answered By: Mikaelblomkvistsson

This can be easily done, using XMLParser and indent. There is no need for pretty_print :

parser = etree.XMLParser(remove_blank_text=True)
tree = etree.parse('myfile.xml',parser) 
etree.indent(tree, space="    ")
tree.write('myfile.xml', encoding='UTF-8')
Answered By: Sami Fennich
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.