如何在Python中漂亮打印XML时缩进属性?

12

假设我有以下 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>

第一个元素的名称和其所有属性都出现在同一行。

我已经看到了如何使用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'))

... 但是使用这种方式,每个元素都会出现在一行上。

有没有一个神奇的咒语可以告诉漂亮的打印机在元素属性之间插入换行符,以便例如行长度不超过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>

附注:我不想依赖于 subprocessxmllint

1个回答

3

lxml内置了一个漂亮的打印函数:这里有一个教程,介绍了几种打印xml的方法。但是根据lxml所说,它有一些限制(在xml规范中的限制)。

这个stackoverflow问题有几个答案,提供了更或多或少hacky的解决方案来漂亮地打印xml,我认为你可以模仿至少基于正则表达式的答案来满足你的需求。

Fredrik Lundh(著名的ElementTree)对打印xml有一个非常底层的描述,你也可以自定义换行符和缩进属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接