Python xml.etree 格式化美化?

标签 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))

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

<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 呢?

最佳答案

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

关于Python xml.etree 格式化美化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42138024/

相关文章:

xml - 在条件下否定偏好吗?

java - float 至 java 货币

.net - 为什么 String.Format 是静态的?

python - 使用 pymongo 查询空字段

python - BigQuery : result set in UI and from API have different number of rows. 为什么?

xml - 在哪里声明一个 simpleType 以便它可以在同一个 XSD 中的多个元素中使用?

c - 如何修改这个字符串压缩C代码来处理超过9次的字符重复?

python - AllenNLP 阅读理解结果在 UI Demo 和 Python Library 中不同

python - OpenPyXL + 如何在 Excel 的单元格中搜索内容,如果内容符合搜索条件则更新内容?

javascript - jquery XML 解析最后 3 个文档