Другое решение - позаимствовать эту indent функцию для использования с библиотекой ElementTree, встроенной в Python начиная с версии 2.5. Вот как это будет выглядеть:
from xml.etree import ElementTree
defindent(elem, level=0): i = "\n" + level*" " j = "\n" + (level-1)*" " iflen(elem): ifnot elem.text ornot elem.text.strip(): elem.text = i + " " ifnot elem.tail ornot elem.tail.strip(): elem.tail = i for subelem in elem: indent(subelem, level+1) ifnot elem.tail ornot elem.tail.strip(): elem.tail = j else: if level and (not elem.tail ornot elem.tail.strip()): elem.tail = j return elem
<?xml version="1.0" encoding="utf-8"?> <issues> <issue> <id> 1 </id> <title> Add Visual Studio 2005 and 2008 solution files </title> </issue> </issues>
Это мой ответ goto. Аргументы по умолчанию работают как есть. Но текстовое содержимое распределено по отдельным строкам, как если бы они были вложенными элементами.
x = etree.parse(FILE_NAME) pretty_xml = etree.tostring(x, pretty_print=True, encoding=str)
Производит:
<issues> <issue> <id>1</id> <title>Add Visual Studio 2005 and 2008 solution files</title> <details>We need Visual Studio 2005/2008 project files for Windows.</details> </issue> </issues>
Никаких внешних зависимостей, кроме постобработки.
import xml.dom.minidom as md
dom = md.parse(FILE_NAME) # To parse string instead use: dom = md.parseString(xml_string) pretty_xml = dom.toprettyxml() # remove the weird newline issue: pretty_xml = os.linesep.join([s for s in pretty_xml.splitlines() if s.strip()])
Вывод такой же, как указано выше, но это больше кода.