在某些元素中插入 ElementTree 时,如何避免在生成的 XML 文件中出现不正确的缩进?

How to avoid incorrect indentation in generated XML file when inserting ElementTree in some Element?

我正在动态生成大量 XML 数据。每个文档都旨在测试处理它的软件中的特定功能。

一个文档由多个不同的块组成。为了简单起见,假设上面的文档是我使用的:

<doc>
  <attributes>
    <attr/>
    <attr/>
  </attributes>
  <items>
    <item/>
    <item/>
    <item/>
  </items>
</doc>

attr 个元素的数量不同,item 个元素的数量也是如此。但是每个的结构都没有改变(只有里面的数据)。

为了让我的 Python 脚本更具可读性,我存储了一堆模板 XML 文件,每个文件代表一个重复元素(如果有的话,还有它的所有子元素)。在我使用 lxml 的主脚本中,我创建了 docattributesitems。给定用于定义生成的 XML 文档中需要多少 itemattr 元素的参数,我只是做一个循环,加载相应的模板,调整里面的数据,然后附加它到各自的父级(此处为 attributesitems 元素):

from lxml import etree

attrs = 2
its = 10

root = etree.Element('doc')
root.addprevious(etree.Comment('...'))
doc = etree.ElementTree(root)

attributes = etree.SubElement(root, 'Attributes')
for a in range(0, attrs):
  attr = etree.parse('attribute.xml', parser=etree.XMLParser(remove_comments=True))
  attributes.append(attr.getroot()

items = etree.SubElement(root, 'Items')
for i in range(0, its):
  item = etree.parse('item.xml', parser=etree.XMLParser(remove_comments=True))
  items.append(item.getroot()

etree.tostring(doc, encoding='UTF-8', xml_declaration=True, pretty_print=True)

虽然我注意到了一件事,这本身并不是错误,但在查看生成的 XML 文档时相当明显 - 缩进在 的位置被弄乱了已插入子树 XML。我可以使用一些 XML 格式化工具(例如 Visual Studio Code 或 Notepad++)来解决这个问题,但我想知道为什么会这样。

在创建 XML 解析器时使用 remove_blank_text=True

parser=etree.XMLParser(remove_blank_text=True, remove_comments=True)

这将删除所有可忽略的空格并让后续的漂亮打印 "start from scratch"。