我正在动态生成大量XML数据。每个文档都旨在测试处理它的软件中的特定功能。
文档由多个不同的块组成。为了简单起见,我们可以说上面的文档就是我的工作:
<doc>
<attributes>
<attr/>
<attr/>
</attributes>
<items>
<item/>
<item/>
<item/>
</items>
</doc>
attr
个元素的数量会有所不同,同样适用于item
元素的数量。但是每个的结构都不会改变(只有里面的数据)。
为了保持我的Python脚本更具可读性,我已经存储了一堆模板XML文件,每个文件都代表一个重复元素(如果有的话,包含所有子元素)。在使用lxml
的主脚本中,我创建了doc
,attributes
和items
。给定用于定义生成的XML文档中需要多少item
和attr
元素的参数,我只需执行循环,加载相应的模板,调整内部数据,然后将其附加到相应的父级(此处attributes
和items
元素):
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 ++)来解决这个问题,但我想知道为什么会发生这种情况。
答案 0 :(得分:2)
创建XML解析器时使用remove_blank_text=True
:
parser=etree.XMLParser(remove_blank_text=True, remove_comments=True)
这将删除所有可忽略的空格,让随后的漂亮打印从头开始#34;