在某些元素中插入 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
的主脚本中,我创建了 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++)来解决这个问题,但我想知道为什么会这样。
在创建 XML 解析器时使用 remove_blank_text=True
:
parser=etree.XMLParser(remove_blank_text=True, remove_comments=True)
这将删除所有可忽略的空格并让后续的漂亮打印 "start from scratch"。
我正在动态生成大量 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++)来解决这个问题,但我想知道为什么会这样。
在创建 XML 解析器时使用 remove_blank_text=True
:
parser=etree.XMLParser(remove_blank_text=True, remove_comments=True)
这将删除所有可忽略的空格并让后续的漂亮打印 "start from scratch"。