2017-02-09 1 views
1

xml.etree.ElementTreeを使ってXMLファイルを解析するスクリプトがあり、要素に子を追加することになっています。私は、両方のは技術的に動作しますが、私が使用して、私はET.dumpを使用して、全体のXML(ルート)をダンプする際の書式/空白めちゃめちゃPython xml.etreeのフォーマットは美しいですか?

第一の方法では、両方の結果は、これがその結果

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

をfromstringという、二つの方法がありますこのグループは子として追加されますが、グループの終了タグの後に改行がなく、最初のタグには1つのタブしかありません。

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

それはグループのチャイルズ正しく空白を取りますが、グループタグ自体の書式設定を台無しに私はなぜだろうか。

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

I:それは子供

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ツリーがすべてで改行やタブずに1行に表示されていて

第二の方法は、グループのetreeを構築しました。 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

horとverの引数を持つ再帰呼び出しを固定しました(これがなければ、デフォルトでないと正しく動作しません)。また、承認と一緒に回答(上三角)を投票してください。ありがとうございました。 –

関連する問題