【问题标题】:Pretty print in lxml is failing when I add tags to a parsed tree当我将标签添加到解析树时,lxml 中的漂亮打印失败
【发布时间】:2011-10-26 14:02:22
【问题描述】:

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

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

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

【问题讨论】:

    标签: python xml parsing lxml pretty-print


    【解决方案1】:

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

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

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

    我没有对其进行测试,但它应该可以通过此更改缩进您的文件。

    【讨论】:

    • 很好,这似乎有效。我看过那个常见问题解答问题,但我想我读错了。我认为这是说只有当你有带有空格的文本数据时才重要,而我没有。但我想如果你有带有文本数据的 any 元素,这很重要。感谢您的快速修复。
    • 酷!对我有帮助!
    • 如果你可以使用 Python 3.9,有一个新函数 xml.etree.ElementTree.indent 也可以帮助解决这个问题,而无需任何 lxml 依赖项。
    【解决方案2】:

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

    我创建了一个 helper 函数,在我运行我的 main 函数后,它会做 pretty_prints。

    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)
    

    【讨论】:

      猜你喜欢
      • 2018-05-27
      • 1970-01-01
      • 2018-10-08
      • 2013-11-08
      • 1970-01-01
      • 2020-02-27
      • 1970-01-01
      • 1970-01-01
      • 2011-07-02
      相关资源
      最近更新 更多