我得到了一个脚本,它使用xml.etree.ElementTree来解析XML-文件,并且应该向元素中添加一个子元素。我有两种方法,这两种方法在技术上都能工作,但当我使用ET.dump(root)转储整个xml时,这两种方法都会导致格式/空格混乱。
我使用的第一个方法是First字符串
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))这将导致将组作为子组添加,但是在group的结束标记之后没有换行符,并且第一个标记只有1个选项卡,不管我在newgroup字符串中放入了多少制表器。
<group>
<uuid>f60e6b30-eec9-11e6-a5d4-2c768aabceca</uuid>
<id>2</id>
<name>newgroup</name>
<desc>Testing groups</desc>
</group></access>我想知道为什么它为组的子类正确地使用了空白空间,但却破坏了组标记本身的格式设置。
第二种方法是和孩子们一起建立一支队伍
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)但是,整个新组树出现在一行中,根本没有换行符和制表符:
<group><uuid>f60e6b30-eec9-11e6-a5d4-2c768aabceca</uuid><id>2</id><name>newgroup</name><desc>Testing groups</desc></group></access>我对python并不熟悉,也不知道如何格式化字符串。那么,我如何才能美化这个东西,使我从脚本中获得良好的XML格式呢?
发布于 2017-02-10 14:15:20
使用任何方法创建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写入文件时已经产生了类似的效果。顺便说一句,这几乎是不可配置的方法。因此,使用自定义缩进函数,您可以在本例中配置您想要学习的任何行为。
https://stackoverflow.com/questions/42138024
复制相似问题