无法使用 lxml 进行管理,既有漂亮的打印,又没有将 xml 元素转换为自闭合元素

Can't manage with lxml to have both pretty printing and not turning xml elements to self-closing elements

提问人:Autechre 提问时间:10/20/2023 最后编辑:Autechre 更新时间:10/20/2023 访问量:81

问:

我目前正面临两难境地。

下面的代码无法正确打印我的 XML:

import lxml.etree

xml_tree = lxml.etree.parse("myFile.xml")
root = xml_tree.getroot()

for fruit in root:
    if fruit.tag == "apple":
        for apple in fruit:
            if apple.tag == "McIntosh":
                fruit.remove(apple)

tree = lxml.etree.ElementTree(root)
tree.write("output.xml", pretty_print=True, xml_declaration=True, encoding="utf-8")

这是我的XML输入文件:

<fruits>
  <apple>
    <McIntosh/>
  </apple>
</fruits>

这是我的(丑陋的)输出XML文件。缩进不正确:

<?xml version='1.0' encoding='UTF-8'?>
<fruits>
  <apple>
    </apple>
</fruits>

我在某处读到,要让漂亮的打印真正起作用,我不得不使用带有如下选项的选项:lxml.etree.XMLParserremove_blank_text=True

xml_parser = lxml.etree.XMLParser(remove_blank_text=True)
xml_tree = lxml.etree.parse("myFile.xml", xml_parser)

它实际上可以激活漂亮的打印,但另一方面,我的空XML元素现在变成了自闭合元素:

<?xml version='1.0' encoding='UTF-8'?>
<fruits>
  <apple/>
</fruits>

有谁知道如何解决lxml漂亮打印的副作用?

python lxml 漂亮打印

评论


答:

0赞 I like Bananas 10/20/2023 #1

正如您刚才问的这个问题中提到的,使用该功能来修复漂亮的印刷品。indent

关于创建非自闭合标记,发生这种情况是因为 text 属性设置为 None,只需将其设置为空字符串即可。

评论

0赞 Autechre 10/20/2023
谢谢小费!不幸的是,这种技术将开始标签和结束标签粘在同一行上,而我需要开始标签和结束标签在 2 个不同的行上缩进。我已经有一个 python 函数来漂亮地打印 XML 文档,但我想使用 lxml 中已经定义的工具来获得更可靠的东西。看来我将不得不坚持自己的代码。