首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python xml.etree格式美化?

Python xml.etree格式美化?
EN

Stack Overflow用户
提问于 2017-02-09 13:29:13
回答 1查看 1.3K关注 0票数 2

我得到了一个脚本,它使用xml.etree.ElementTree来解析XML-文件,并且应该向元素中添加一个子元素。我有两种方法,这两种方法在技术上都能工作,但当我使用ET.dump(root)转储整个xml时,这两种方法都会导致格式/空格混乱。

我使用的第一个方法是First字符串

代码语言:javascript
复制
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字符串中放入了多少制表器。

代码语言:javascript
复制
<group>
        <uuid>f60e6b30-eec9-11e6-a5d4-2c768aabceca</uuid>
        <id>2</id>
        <name>newgroup</name>
        <desc>Testing groups</desc>
    </group></access>

我想知道为什么它为组的子类正确地使用了空白空间,但却破坏了组标记本身的格式设置。

第二种方法是和孩子们一起建立一支队伍

代码语言:javascript
复制
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)

但是,整个新组树出现在一行中,根本没有换行符和制表符:

代码语言:javascript
复制
<group><uuid>f60e6b30-eec9-11e6-a5d4-2c768aabceca</uuid><id>2</id><name>newgroup</name><desc>Testing groups</desc></group></access>

我对python并不熟悉,也不知道如何格式化字符串。那么,我如何才能美化这个东西,使我从脚本中获得良好的XML格式呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-10 14:15:20

使用任何方法创建XML ,而不必担心格式问题,然后在根元素上使用如下通用缩进函数:

代码语言:javascript
复制
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写入文件时已经产生了类似的效果。顺便说一句,这几乎是不可配置的方法。因此,使用自定义缩进函数,您可以在本例中配置您想要学习的任何行为。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42138024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档