【问题标题】:Python xml.etree formatting beautify?Python xml.etree 格式化美化?
【发布时间】:2017-02-09 13:29:13
【问题描述】:

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

这导致组被添加为子组,但是在组的结束标记之后没有换行符并且第一个标记只有一个制表符,无论我在新组字符串中放入了多少制表符。

<group>
        <uuid>f60e6b30-eec9-11e6-a5d4-2c768aabceca</uuid>
        <id>2</id>
        <name>newgroup</name>
        <desc>Testing groups</desc>
    </group></access>

我想知道为什么它为 group 的孩子正确地使用了空格,但却弄乱了 group 标签本身的格式。

第二种方法是用它的孩子构建一个组的 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 呢?

【问题讨论】:

    标签: python xml string


    【解决方案1】:

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

    【讨论】:

    • 我修复了带有 hor 和 ver 参数的递归调用(没有这个,如果不是默认值,它们将无法正常工作)。另外,请投票赞成答案(上三角形)并获得批准。谢谢。
    猜你喜欢
    • 2014-10-15
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多