Вопрос-Ответ

Pretty printing XML in Python

Красивая печать XML на Python

Каков наилучший способ (или существуют различные способы) красивой печати XML в Python?

Переведено автоматически
Ответ 1
import xml.dom.minidom

dom = xml.dom.minidom.parse(xml_fname) # or xml.dom.minidom.parseString(xml_string)
pretty_xml_as_string = dom.toprettyxml()
Ответ 2

lxml появился недавно, обновлен и включает в себя красивую функцию печати

import lxml.etree as etree

x = etree.parse("filename")
print etree.tostring(x, pretty_print=True)

Ознакомьтесь с руководством по lxml:
https://lxml.de/tutorial.html

Ответ 3

Другое решение - позаимствовать эту indent функцию для использования с библиотекой ElementTree, встроенной в Python начиная с версии 2.5. Вот как это будет выглядеть:

from xml.etree import ElementTree

def indent(elem, level=0):
i = "\n" + level*" "
j = "\n" + (level-1)*" "
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 subelem in elem:
indent(subelem, level+1)
if not elem.tail or not elem.tail.strip():
elem.tail = j
else:
if level and (not elem.tail or not elem.tail.strip()):
elem.tail = j
return elem

root = ElementTree.parse('/tmp/xmlfile').getroot()
indent(root)
ElementTree.dump(root)
Ответ 4

У вас есть несколько вариантов.

xml.etree.ElementTree.indent()

Батарейки в комплекте, простота в использовании, красивый результат.

Но требуется Python 3.9+

import xml.etree.ElementTree as ET

element = ET.XML("<html><body>text</body></html>")
ET.indent(element)
print(ET.tostring(element, encoding='unicode'))

BeautifulSoup.prettify()

BeautifulSoup может быть самым простым решением для Python < 3.9.

from bs4 import BeautifulSoup

bs = BeautifulSoup(open(xml_file), 'xml')
pretty_xml = bs.prettify()
print(pretty_xml)

Вывод:


<?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. Аргументы по умолчанию работают как есть. Но текстовое содержимое распределено по отдельным строкам, как если бы они были вложенными элементами.

lxml.etree.parse()

Более красивый вывод, но с аргументами.

from lxml import etree

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>

У меня это работает без проблем.


xml.dom.minidom.parse()

Никаких внешних зависимостей, кроме постобработки.

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()])

Вывод такой же, как указано выше, но это больше кода.

python