Python xml.etree格式化美化?

时间:2017-02-09 13:29:13

标签: python xml string

我有一个脚本,它使用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?

1 个答案:

答案 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写入文件时已经具有类似的效果。顺便说一下,这几乎是不可配置的方法。因此,使用自定义缩进功能,您可以配置您希望在此示例中学习的任何行为。