我有一个脚本,它使用xml.etree.ElementTree来解析XML文件,并且应该将子项添加到元素中。我有两种方法,这两种方法在技术上都有效,但是当我使用ET.dump(root)转储整个xml时,两种方法都会导致格式化/空格混乱
我使用fromstring
的第一个方法import xml.etree.ElementTree as ET
tree = ET.parse('test.xml')
root = tree.getroot()
#snip
newgroup='''
<group>
<uuid>%s</uuid>
<id>%s</id>
<name>%s</name>
<desc>%s</desc>
</group>
''' % (g_uuid, g_id, g_name, g_desc)
access = root.find('access')
access.append(ET.fromstring(newgroup))
这导致组被添加为子组,但是在组的endtag没有换行符并且第一个标签只有1个选项卡之后,无论我将多少个制表符放入新组字符串中。
<group>
<uuid>f60e6b30-eec9-11e6-a5d4-2c768aabceca</uuid>
<id>2</id>
<name>newgroup</name>
<desc>Testing groups</desc>
</group></access>
我想知道为什么对于群组的孩子正确地使用空格,但是会弄乱群组标签本身的格式。
第二种方法是用它的孩子建立一个小组的etree
newgroup = ET.Element('group')
ET.SubElement(newgroup, 'uuid').text = '%s' % g_uuid
ET.SubElement(newgroup, 'id').text = '%s' % g_id
ET.SubElement(newgroup, 'name').text = '%s' % g_name
ET.SubElement(newgroup, 'desc').text = '%s' % g_desc
access = root.find('access')
access.append(newgroup)
然后整个newgroup-tree出现在一行中,根本没有换行和标签:
<group><uuid>f60e6b30-eec9-11e6-a5d4-2c768aabceca</uuid><id>2</id><name>newgroup</name><desc>Testing groups</desc></group></access>
我是python的新手,并不知道如何格式化字符串。那么我怎样才能美化这个东西,以便从脚本中获得格式良好的XML?
答案 0 :(得分:2)
使用任何方法创建XML 而不用担心格式化,然后在根元素上使用这样的通用缩进函数:
def indent(elem, level=0, hor='\t', ver='\n'):
i = ver + level * hor
if len(elem):
if not elem.text or not elem.text.strip():
elem.text = i + hor
if not elem.tail or not elem.tail.strip():
elem.tail = i
for elem in elem:
indent(elem, level + 1, hor, ver)
if not elem.tail or not elem.tail.strip():
elem.tail = i
else:
if level and (not elem.tail or not elem.tail.strip()):
elem.tail = i
另一个解决方案是使用lxml
第三方库,它在使用关键字参数pretty_print=True
写入文件时已经具有类似的效果。顺便说一下,这几乎是不可配置的方法。因此,使用自定义缩进功能,您可以配置您希望在此示例中学习的任何行为。