gpt4 book ai didi

Python xml.etree 格式化美化?

转载 作者:行者123 更新时间:2023-12-01 03:19:07 42 4
gpt4 key购买 nike

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

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com