当我向已解析的树添加标记时,lxml中的漂亮打印失败了



我有一个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标签附加到x标签。但是我得到了相同的结果。

如果我不解析文件,只是一次创建所有标签,它将正确打印。所以我认为这与解析文件有关。

我怎样才能让漂亮的打印工作?

这与lxml如何处理空白有关——详细信息请参阅lxml FAQ。

要解决这个问题,将文件的加载部分更改为以下内容:

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

我没有测试它,但是它应该可以很好地缩进你的文件。

我在写入文件时遇到了同样的问题,对于其他有此问题的人:

我创建了一个辅助函数,它在运行主函数后pretty_print。

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)

最新更新