在lxml中添加标签时漂亮打印失败

40 投票
2 回答
16454 浏览
提问于 2025-04-17 05:02

我有一个xml文件,我用lxml库里的etree来处理它。但是当我往里面添加标签时,格式化输出似乎不太好。

>>> from lxml import etree
>>> root = etree.parse('file.xml').getroot()
>>> print etree.tostring(root, pretty_print = True)

<root>
  <x>
    <y>test1</y>
  </x>
</root>

到目前为止还不错。但是现在

>>> x = root.find('x')
>>> z = etree.SubElement(x, 'z')
>>> etree.SubElement(z, 'z1').attrib['value'] = 'val1'
>>> print etree.tostring(root, pretty_print = True)

<root>
  <x>
    <y>test1</y>
  <z><z1 value="val1"/></z></x>
</root>

它看起来就不美观了。我还试过“反向操作”,先创建z1标签,然后创建z标签,把z1加到z里,再把z加到x里。但结果还是一样。

如果我不解析文件,直接一次性创建所有标签,输出就会正确。所以我觉得这和解析文件有关。

我该怎么才能让格式化输出正常工作呢?

2 个回答

2

我在写文件的时候也遇到了同样的问题,给其他有这个问题的人分享一下:

我创建了一个辅助函数,用来在我运行主函数之后进行漂亮的打印。

from lxml import etree

def ppxml(xml):
    parser = etree.XMLParser(remove_blank_text=True)
    tree = etree.parse(xml, parser)
    tree.write(xml, encoding='utf-8', pretty_print=True, xml_declaration=True)

在我的主程序文件中

if __name__ == '__main__':
    main()
    ppxml(xml)
63

这和 lxml 是怎么处理空格有关——具体可以查看 lxml 的常见问题解答

要解决这个问题,可以把文件加载的部分改成下面这样:

parser = etree.XMLParser(remove_blank_text=True)
root = etree.parse('file.xml', parser).getroot()

我没有测试过,但这个改动应该能很好地给你的文件加上缩进。

撰写回答