2016-10-18 18 views
0

私は巨大な入れ子構造のXMLを持っています。私は、次の手順入れ子構造のXML構造をPythonでフラットにする方法

from xml.etree import ElementTree as et 

tr = etree.parse(path) 
root = tr.getroot() 

for node in root.getchildren(): 
    for element in node.iter(): 
    if (element.text is not None): 
     node.extend(element) 

私もnode.append(element)と試みたが、それはまた、動作しないと試みた

<root> 
    <node1> 
    <name1>text1</name1> 
    </node1> 
    <node2> 
    <name2>text2</name2> 
    </node2> 
</root> 

に変換したいこの1

<root> 
<node1> 
    <subnode1> 
    <name1>text1</name1> 
    </subnode1> 
</node1> 
<node2> 
    <subnode2> 
    <name2>text2</name2> 
    </subnode2> 
</node2> 
</root> 

同様 は、その要素が追加されます最後に無限ループがあります。 ご了承ください。

答えて

1

ここで言及するいくつかのポイントは:

まず、あなたのテストelement.text is not Noneは常にTrueを返し、各ノードの終わり以来xml.etree.Elementreeを使用して、上記与えられたとして、あなたのXMLファイルを解析する場合は、改行文字が故に、そこにありますそれぞれのテキストを持たないノードのテキストは常に\n文字です。代わりにlxml.etree.parselxml.etree.XMLParserを使用して、以下のように空白のテキストを無視することもできます。

第2に、それを読んでいる間にツリーに追加するのは良いことではありません。問題に関してModifying list while iterating:あなたがここにこの質問のための@Alexマルテッリの答えを見ることができました

>>> a = [1,2,3,4] 
>>> for k in a: 
     a.append(5) 

:このコードは無限ループを与える理由と同様の理由。

したがって、バッファーを XMLツリーにして、トラバース中にツリーを変更するのではなく、それに応じてビルドする必要があります。

from xml.etree import ElementTree as et 
import pdb; 

from lxml import etree 

p = etree.XMLParser(remove_blank_text=True) 
path = 'test.xml' 
tr = et.parse(path, parser = p) 
root = tr.getroot() 

buffer = et.Element(root.tag); 

for node in root.getchildren(): 
    bnode = et.Element(node.tag) 
    for element in node.iter(): 
     #pdb.set_trace() 
     if (element.text is not None): 
      bnode.append(element) 
      #node.extend(element) 
    buffer.append(bnode) 

et.dump(buffer) 

サンプル実行と結果:

Chip [email protected] 01:01:[email protected] ~: python stackoverflow.py 
<root><node1><name1>text1</name1></node1><node2><name2>text2</name2></node2></root> 

注:あなたはいつもここにチュートリアルを次のPythonでlxmlパッケージを使用して、かなりXMLツリーを印刷しようとすることができます:Pretty printing XML in Python私はプリントアウトツリーはかなり恐ろしいですので、肉眼で読む。

+0

これは役立ちます。どうもありがとうございました! –

関連する問題