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

时间:2018-02-14 13:55:07

标签: python xml lxml indentation

我正在动态生成大量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 ++)来解决这个问题,但我想知道为什么会发生这种情况。

1 个答案:

答案 0 :(得分:2)

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

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

这将删除所有可忽略的空格,让随后的漂亮打印从头开始#34;