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?
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
Since version 4.5, you can set indent size using indent()
function.
etree.indent(root, space=" ")
print(etree.tostring(root))
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).
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')
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?
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
Since version 4.5, you can set indent size using indent()
function.
etree.indent(root, space=" ")
print(etree.tostring(root))
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).
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')