如何在python中使用prettyprinting xml时缩进属性?

Che*_*eso 9 python lxml pretty-print

假设我有这样的XML:

 <graph label="Test" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cy="http://www.cytoscape.org" xmlns="http://www.cs.rpi.edu/XGMML"  directed="1">
    <foo>...</foo>
 </graph>
Run Code Online (Sandbox Code Playgroud)

第一个元素名称及其所有属性都出现在一行中.

我已经看到如何使用lxml打印元素树,代码如下:

from lxml import etree
 ...
def prettyPrintXml(filePath):
    assert filePath is not None
    parser = etree.XMLParser(resolve_entities=False, remove_blank_text=True, 
                             strip_cdata=False)
    document = etree.parse(filePath, parser)
    print(etree.tostring(document, pretty_print=True, encoding='utf-8'))
Run Code Online (Sandbox Code Playgroud)

...但是使用它,每个元素都出现在一行上.

是否有一个神奇的咒语告诉漂亮的打印机在元素属性之间插入换行符,例如,行长度不超过80个字符?

我希望结果看起来像这样:

<graph label="Test"
       xmlns:dc="http://purl.org/dc/elements/1.1/"
       xmlns:xlink="http://www.w3.org/1999/xlink"
       xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
       xmlns:cy="http://www.cytoscape.org"
       xmlns="http://www.cs.rpi.edu/XGMML"  directed="1">
  <foo>...</foo>
</graph>
Run Code Online (Sandbox Code Playgroud)

ps:我不想诉诸subprocessxmllint

Ste*_*een 3

lxml有一个漂亮的内置打印功能:这里有一个教程,描述了打印 xml 的几种方法。但它有一些限制(根据 lxml,xml 规范中的限制)。

这个 stackoverflow 问题有几个答案,或多或少有一些巧妙的解决方案来漂亮地打印 xml,我认为您可以至少对基于正则表达式的答案进行建模以满足您的需求。

Fredrik LundhElementTree出名)对打印 xml有一个非常低级的描述,您还可以自定义换行符和缩进属性。