用Python打印XML的最佳方法(或各种方法)是什么?


当前回答

我在寻找“如何漂亮地打印html”时发现了这个问题

使用这篇文章中的一些想法,我调整了XML解决方案,以适用于XML或HTML:

from xml.dom.minidom import parseString as string_to_dom

def prettify(string, html=True):
    dom = string_to_dom(string)
    ugly = dom.toprettyxml(indent="  ")
    split = list(filter(lambda x: len(x.strip()), ugly.split('\n')))
    if html:
        split = split[1:]
    pretty = '\n'.join(split)
    return pretty

def pretty_print(html):
    print(prettify(html))

使用时是这样的:

html = """\
<div class="foo" id="bar"><p>'IDK!'</p><br/><div class='baz'><div>
<span>Hi</span></div></div><p id='blarg'>Try for 2</p>
<div class='baz'>Oh No!</div></div>
"""

pretty_print(html)

返回:

<div class="foo" id="bar">
  <p>'IDK!'</p>
  <br/>
  <div class="baz">
    <div>
      <span>Hi</span>
    </div>
  </div>
  <p id="blarg">Try for 2</p>
  <div class="baz">Oh No!</div>
</div>

其他回答

LXML是最近更新的,包含一个漂亮的打印函数

import lxml.etree as etree

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

查看lxml教程: http://lxml.de/tutorial.html

from yattag import indent

pretty_string = indent(ugly_string)

它不会在文本节点中添加空格或换行,除非你要求它:

indent(mystring, indent_text = True)

您可以指定缩进单位和换行符的样式。

pretty_xml_string = indent(
    ugly_xml_string,
    indentation = '    ',
    newline = '\r\n'
)

该文件在http://www.yattag.org主页上。

你有几个选择。

xml etree ElementTree。缩进()

包括电池,使用简单,输出漂亮。

但需要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版本="1.0"编码="utf-8"?> <问题> <问题> <标识> 1 < / id > <标题> 添加Visual Studio 2005和2008解决方案文件 < /名称> > < /问题 > < /问题

这是我要回答的。默认实参按原样工作。但是文本内容在单独的行上展开,就好像它们是嵌套的元素一样。

lxml.etree.parse()

更漂亮的输出,但是带有参数。

from lxml import etree

x = etree.parse(FILE_NAME)
pretty_xml = etree.tostring(x, pretty_print=True, encoding=str)

生产:

<问题> <问题> <标识> 1 > < / id <title>添加Visual Studio 2005和2008解决方案文件 <details>我们需要Visual Studio 2005/2008的Windows项目文件 > < /问题 > < /问题

这对我来说没什么问题。


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

输出与上面相同,但是代码更多。

你可以使用流行的外部库xmltodict, unparse和pretty=True,你会得到最好的结果:

xmltodict.unparse(
    xmltodict.parse(my_xml), full_document=False, pretty=True)

full_document=False <?xml version="1.0" encoding="UTF-8"?>在最上面。

XML pretty print for python看起来很适合这个任务。(名字也很恰当。)

另一种方法是使用pyXML,它有一个PrettyPrint函数。