更改lxml中etree.tostring的默认缩进

16 投票
4 回答
9378 浏览
提问于 2025-04-15 13:25

我有一个XML文档,我正在用 lxml.etree.tostring 来格式化它,让它看起来更整齐。

print etree.tostring(doc, pretty_print=True)

默认的缩进是2个空格,但我想把它改成4个空格。可是 tostring 函数里没有这个参数,我想知道有没有简单的方法可以用lxml来实现这个?

4 个回答

1

这件事可以很简单地完成,只需要用到XMLParser和indent。其实不需要使用pretty_print这个功能:

parser = etree.XMLParser(remove_blank_text=True)
tree = etree.parse('myfile.xml',parser) 
etree.indent(tree, space="    ")
tree.write('myfile.xml', encoding='UTF-8')
14

从4.5版本开始,你可以通过使用 indent() 函数来设置缩进的大小。

etree.indent(root, space="    ")
print(etree.tostring(root))
5

正如在这个讨论帖中提到的,实际上没有办法直接改变lxml.etree.tostring的缩进格式。

不过,你可以尝试以下方法:

  • 添加一个XSLT转换来改变缩进
  • 使用像cElementTree库那样的方法,给树结构添加空白

代码:

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

撰写回答