2016-07-13 6 views
2

私はこのXMLを持っていると私はパンダのデータフレームに解析する:解析XML

<DISTRITO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <NOME_DISTRITO>BRAGANCA</NOME_DISTRITO> 
    <CPE>PT0002000022161425NP</CPE> 
    <CPE>PT0002000022161458JH</CPE> 
    <CPE>PT0002000022161471ZP</CPE> 
    <CPE>PT0002000022161505SL</CPE> 
</DISTRITO> 

と、これは私のPythonコードです:

from lxml import objectify 
from lxml import etree 
import pandas as pd 

path = '/TestFile.xml' 
xml = objectify.parse(open(path)) 
root = xml.getroot() 
data = [] 

for i in root:  
    el_data = {} 
    for child in root.getchildren():   
     el_data[child.tag] = child.pyval 
     # print el_data 
     data.append(el_data) 

df = pd.DataFrame(data) 

問題があります私は結果を得るとき、それは唯一の最後のノード「」の値を返すこと:

    CPE NOME_DISTRITO 
0 PT0002000022161505SL  BRAGANCA 
1 PT0002000022161505SL  BRAGANCA 
2 PT0002000022161505SL  BRAGANCA 
3 PT0002000022161505SL  BRAGANCA 
4 PT0002000022161505SL  BRAGANCA 

を私は少し私のXMLファイルに掘ったと私が見つかりました。それは私がノードのために同じ名前を得るとき起こること。たとえば、私のファイルがこの場合:

<DISTRITO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <NOME_DISTRITO>BRAGANCA</NOME_DISTRITO> 
    <CPE1>PT0002000022161425NP</CPE1> 
    <CPE2>PT0002000022161458JH</CPE2> 
    <CPE3>PT0002000022161471ZP</CPE3> 
    <CPE4>PT0002000022161505SL</CPE4> 
</DISTRITO> 

問題はありません。私はたくさんの検索をしていますが、私は解決策を見つけることができません。あなたが私を助け、そのファイルを解析する別の方法を見つけることができれば、私はそれを正しく動作させることができません。

ありがとう!

答えて

1

あなたは内側のループ内のキーを繰り返している場合は、最初のあなたが値を上書きしている、あなたはまた、あなたが作るので、すべての変更が反映されているループ内で同じ辞書/オブジェクトから参照を追加され、二つの問題を持っていますどこでも、最後の値は毎回しか表示されません。

あなたは新しいオブジェクトを毎回追加取得するので、あなたは内側のループ内の辞書を作成する必要があります:

for child in root.getchildren(): 
    data.append({child.tag: child.pyval}) 

上記はあなたにすべての値を与える、私はあなたが望む正確などのような形式を確認していません私はあなたのループがやっているはずのことをまったくフォローしないので。これは、あなたが望むものに近いかもしれない:

あなたを与えるだろう
x = """<DISTRITO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<NOME_DISTRITO>BRAGANCA</NOME_DISTRITO> 
    <CPE>PT0002000022161425NP</CPE> 
    <CPE>PT0002000022161458JH</CPE> 
    <CPE>PT0002000022161471ZP</CPE> 
    <CPE>PT0002000022161505SL</CPE> 
</DISTRITO>""" 

root = etree.fromstring(x) 
from lxml import objectify 
import pandas as pd 

root = objectify.fromstring(x) 


df = pd.DataFrame(((child.tag, child.pyval) for child in root.getchildren())) 

print(df) 

:あなたの応答のための

     0   1 
0   NOME_DISTRITO BRAGANCA 
1 PT0002000022161425NP  CPE 
2 PT0002000022161458JH  CPE 
3 PT0002000022161471ZP  CPE 
4 PT0002000022161505SL  CPE 
+0

感謝を。私はちょうどetreeについて少し理解したい、オブジェクト化し、一般的にXMLをPythonでデータフレームに構文解析する方法を理解したい。私は巨大なXMLファイルを持っており、より良い読書のためにそれを表形式のファイルに変換したい。ありがとう!!あなたは私をたくさん助けました。 :) –

+0

@JulianaRivera、確かに、あなたは大歓迎です。 –