Я искал в точности то же самое, и наткнулся на этот пост. (отступ, предоставленный в xml.dom.minidom, сломал другой инструмент, который я использовал для манипулирования XML, и мне нужно было сделать отступ). Я попробовал принятое решение на несколько более сложном примере, и это было результатом:
In [1]: import pxdom
In [2]: xml = '<a><b>fda</b><c><b>fdsa</b></c></a>'
In [3]: doc = pxdom.parseString(xml)
In [4]: doc.domConfig.setParameter('format-pretty-print', True)
In [5]: print doc.pxdomContent
<?xml version="1.0" encoding="utf-16"?>
<a>
<b>fda</b><c>
<b>fdsa</b>
</c>
</a>
Прекрасно напечатанный XML не отформатирован правильно, и я не слишком доволен патчами обезьян (т.е. я едва знаю, что это значит, и понимаю, что это плохо), поэтому я искал другое решение.
Я записываю вывод в файл, чтобы я мог использовать программу xmlindent для Ubuntu ($ sudo aptitude install xmlindent). Поэтому я просто записываю неотформатированный файл, а затем вызываю xmlindent из программы python:
from subprocess import Popen, PIPE
Popen(["xmlindent", "-i", "2", "-w", "-f", "-nbe", file_name],
stderr=PIPE,
stdout=PIPE).communicate()
Ключ -w вызывает перезапись файла, но досадно оставляет имя, например. "myfile.xml ~", который вы, вероятно, захотите удалить. Другие переключатели предназначены для правильного форматирования (для меня).
P.S. xmlindent - это средство форматирования потока, т.е. вы можете использовать его следующим образом:
cat myfile.xml | xmlindent > myfile_indented.xml
Так что вы можете использовать его в скрипте Python без записи в файл, если вам нужно.