用Python打印XML的最佳方法(或各种方法)是什么?
当前回答
你可以使用流行的外部库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"?>在最上面。
其他回答
正如其他人指出的那样,lxml内置了一个漂亮的打印机。
请注意,在默认情况下,它会将CDATA部分更改为普通文本,这可能会产生糟糕的结果。
下面是一个Python函数,它保留输入文件,只改变缩进(注意strip_cdata=False)。此外,它确保输出使用UTF-8作为编码,而不是默认的ASCII(注意encoding=' UTF-8 '):
from lxml import etree
def prettyPrintXml(xmlFilePathToPrettyPrint):
assert xmlFilePathToPrettyPrint is not None
parser = etree.XMLParser(resolve_entities=False, strip_cdata=False)
document = etree.parse(xmlFilePathToPrettyPrint, parser)
document.write(xmlFilePathToPrettyPrint, pretty_print=True, encoding='utf-8')
使用示例:
prettyPrintXml('some_folder/some_file.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>
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主页上。
我看不懂迷你dom的漂亮印花。每当我尝试用给定编码之外的字符漂亮地打印文档时,我会得到一个UnicodeError,例如,如果我在文档中有一个β,我尝试了doc.toprettyxml(encoding='latin-1')。以下是我的解决方法:
def toprettyxml(doc, encoding):
"""Return a pretty-printed XML document in a given encoding."""
unistr = doc.toprettyxml().replace(u'<?xml version="1.0" ?>',
u'<?xml version="1.0" encoding="%s"?>' % encoding)
return unistr.encode(encoding, 'xmlcharrefreplace')
从Python 3.9开始,ElementTree有一个用于漂亮打印XML树的indent()函数。
见https://docs.python.org/3/library/xml.etree.elementtree.html # xml.etree.ElementTree.indent。
示例用法:
import xml.etree.ElementTree as ET
element = ET.XML("<html><body>text</body></html>")
ET.indent(element)
print(ET.tostring(element, encoding='unicode'))
好处是它不需要任何额外的库。欲了解更多信息,请访问https://bugs.python.org/issue14465和https://github.com/python/cpython/pull/15200