2017-02-09 610 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

我用固定霍版本參數遞歸調用(不這樣做,他們將無法正常工作,如果沒有默認值)。另外,請和贊成一起投票答覆(上邊三角形)。謝謝。 –