2016-07-13 2 views
2

나는이 XML을 파이썬에서 dataframe하고 난 팬더의 데이터 프레임으로 해석 할 :구문 분석 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> 

을이 내 파이썬 코드 :

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

당신은 반영이 내부 루프에서 키를 반복 한 경우 먼저 값을 덮어 쓰는, 당신은 또한 당신이 만드는 같은 DICT/루프에서 객체 이렇게 변경에 참조를 추가하는 두 가지 문제가 어디서나 마지막 값을 매번 볼 수 있습니다.

당신은 새로운 객체마다 추가 할 수 있도록 내부 루프 내부의 DICT를 만들어야합니다 : 나는 당신이 원하는 정확히 어떤 형식 확실하지 않다,

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에 대해 조금 이해하고 싶습니다. 객관화하고 일반적으로 Python으로 XML을 데이터 프레임으로 구문 분석하는 방법을 알고 싶습니다. 나는 거대한 XML 파일을 가지고 있으며 더 나은 독서를 위해이를 표 형식의 파일로 변환하려고합니다. 감사!! 너 나 많이 도와 줬어. :) –

+0

@JulianaRivera, 아무 문제, 당신은 환영합니다. –