在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里,再把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()
我没有测试过,但这个改动应该能很好地给你的文件加上缩进。