(python) XML 파일을 데이터프레임으로 만들기

XML 파일에 대해 알아보고 , 이를 데이터프레임으로 변환해보자.



(python) XML 파일을 데이터프레임으로 만들기



데이터 분석은 csv, xlsx, xml, json과 같은 다양한 형식(확장자)으로
저장된 데이터원본을 불러오는 일에서부터 시작된다.

이번 포스팅에서는 xml에 대해 알아보고
xml파일을 데이터프레임으로 변환하는 방법에 대해 다뤄볼 것이다.




1. XML이란?

1-1. XML의 정의


XML은 Extensible Markup Language의 약자로써,
데이터 교환에 목적을 두고 만들어진 마크업 언어를 뜻한다.

여기서 마크업 언어란,
태그 등을 이용하여 문서나 데이터의 구조를 나타내는 언어를 뜻한다.



1-2. XML의 특징(장점)



XML은 다양한 장점을 가지고 있다.

  • 많은 API가 개발되어 있다.
  • 텍스트 형식으로 데이터를 저장하여 직관적이다.
  • 유니코드를 사용하여 전세계 언어를 지원한다.
  • 특정 어플리케이션에 구애받지 않고 실행 가능하다.
  • 사전정의 태그가 없으며 태그를 자유롭게 지정할 수 있다.

특정 어플리케이션에 구애 받지않는다는 점과,
사전 정의 태그가 없다는 점은 HTML과 구별되는 특징이다.
(HTML은 웹에서만 구현 가능 / 사전 태그 존재 )




2. XML을 판다스 데이터프레임으로 불러오기


( 그림 1. xml )


(그림2. 데이터프레임)

nameemailgradeage
Johnjohn@mail.comA16
Alicealice@mail.comB17
Bobbob@mail.comC16
Hannahhannah@mail.comA17



xml 파일을 판다스를 이용해 데이터프레임으로 변환해보자.
(그림 1 –> 그림 2)

이 작업을 위해 , 파이썬 모듈인
xml.etree.ElementTree 을 사용한다.

import xml.etree.ElementTree as et
xtree= et.parse("file_name.xml")
xroot= xtree.getroot()  



이 모듈은 xml파일의 데이터 구조를 트리(tree)구조로 바꿔준다.
각 칼럼의 레코드를 개별 노드에 저장하고 ,
이 노드들을 데이터프레임에 넣어주는 것이다.

# xml to df 코드
  
import pandas as pd
import xml.etree.ElementTree as et
  
xtree=et.parse("students.xml")
xroot=xtree.getroot()
  
df_cols=["name","email","grade","age"]
row=[]
  
for node in xroot:
  s_name=node.attrib.get("name")
  s_mail=node.find("email").text if node is not None else None
  s_grade=node.find("grade").text if node is not None else None
  s_age=node.find("age").text if node is not None else None
  
  rows.append({"name":s_name, "email":s_mail,
               "grade":s_grade, "age" : s_age})
  
 out_df= pd.DataFrame(rows,colums=df_cols) 



name은 email,grade,age와 달리
node.attrib.get( )을 이용하여 구해줬다.

이는 name이 속성에 저장되어 있기 때문이다.

email,grade,age는 name 하위 구조로 존재한다.
이 세 변수는 node.find( ) 를 이용하여 구해주면 된다. ( 그림 1. xml 참고)

아래처럼 function으로 미리 만들어서 사용해도 된다.

import pandas as pd
import xml.etree.ElementTree as et
  
def parse_XML(xml_file,df_cols):  
    xtree=et.parse("students.xml")
    xroot=xtree.getroot()
    row=[]
  
    for node in xroot:
  	res=[]
   	res.append(node.attrib.get(df_cols[0]))
    	for el in f_cols[1:]:
   	  if node is not None and node.find(el) is not None:
     		res.append(node.find(el).text)
  	  else:
   		res.append(None)
        row.append({df_cols[i]:res[i] 
  		    for i,_ in enumerate(df_cols)})
  
    out_df=pd.DataFrame(rows,columns=df_cols)
    return out_df
  
    out_df= pd.DataFrame(rows,colums=df_cols) 
  
#   parse_XML( "students.xml", ["name","email","grade","age"])




✋🏾 참고링크 : https://medium.com/@robertopreste/from-xml-to-pandas-dataframes-9292980b1c1c


© 2024. All rights reserved.