2017-02-09 410 views
1

我使用xml.etree.ElementTree解析XML文件,并认为一个孩子为一个元素添加脚本。我有两种方法,即在技术上的工作,但结果都在搞砸格式化/空格当我转储使用ET.dump(根)Python xml.etree格式化美化?

第一种方法将整个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) 

但随后整个新闻组树出现在一行不换行和标签都:

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

我我是python的新手,并不知道如何格式化字符串。那么,如何美化这个东西,以便让脚本中的格式化XML格式化好?

回答

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

+0

我用固定霍版本参数递归调用(不这样做,他们将无法正常工作,如果没有默认值)。另外,请和赞成一起投票答复(上边三角形)。谢谢。 –