혹시 간단하게 dict 타입으로 변환해서 처리하고 싶다면 다음 글을 참고하세요.(개인적으로 추천)
https://yeslab.tistory.com/142
아래글은 ElementTree 오브젝트로 읽어 처리하는 방법입니다.
2019-07-18 작성 내용
빅데이터 관련 업무를 하다보면
TSV(Tab Separated Value), XML(Extensible Markup Language), JSON(JavaScript Object Notation)
이 3가지의 형태의 데이터를 자주 접하게 된다.
TSV나 JSON의 경우 Dictionary로 읽으면 매우 쉽지만
XML의 경우 Tree 형식으로 구성되어 있기 때문에 엑세스가 편하지 않다.
그렇다면 왜 아직까지 XML을 쓴는 것일까.....
대충 검색해봤을때는 Namespace 등 Json보다는 로직적으로 구현가능한 내용이 많아서 같다.
업계에서도 요즘은 대체로 유연한 JSON을 사용한다.
나 또한 Python으로는 다루기 쉬운 JSON을 주로 활용한다.
아무튼 가끔 XML 관련 작업을 해야할 때 참고하기 위해 정리한다!
Python에서 XML을 Parsing하면 EelementTree 형태가 된다.
Elemnet Object에 대해서 먼저 알아보자
tag : 어떤 데이터를 표현하는지에 대해 서술 (element type이라고도 한다)
text
tail : element와 관련된 추가적인 데이터를 저장한다.
attrib :
이런 Element Object가 Tree 형태로 있다고 보면 된다.
그렇게 때문에 기본적으로 Tree를 탐색하는 방법으로 데이터를 찾는다고 보면 된다.
보통 Iteration으로를 통해 Children element들을 Fully Access한다.
Nested 된 Tree의 경우 이는 매우 비효율 적이기 때문에 적절히 tag 등을 확인하여 적절히 최적화를 해주는 것이 좋다.
Example Data
<?xml version="1.0"?>
<data>
<country name="Liechtenstein">
<rank>1</rank>
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor name="Austria" direction="E"/>
<neighbor name="Switzerland" direction="W"/>
</country>
<country name="Singapore">
<rank>4</rank>
<year>2011</year>
<gdppc>59900</gdppc>
<neighbor name="Malaysia" direction="N"/>
</country>
<country name="Panama">
<rank>68</rank>
<year>2011</year>
<gdppc>13600</gdppc>
<neighbor name="Costa Rica" direction="W"/>
<neighbor name="Colombia" direction="E"/>
</country>
</data>
1. File에서 읽는 방법
import xml.etree.ElementTree as ET
tree = ET.parse('country_data.xml')
root = tree.getroot()
2. String을 읽는 방법
root = ET.fromstring(country_data_as_string)
ElementTree 형태에서 root는 tag와 attributes dictionary 를 갖는다.
>>> root.tag
'data'
>>> root.attrib
{}
3. for loop을 통해 iteration 하는 예시
for child in root:
print(child.tag, child.attrib)
country {'name': 'Liechtenstein'}
country {'name': 'Singapore'}
country {'name': 'Panama'}
3. iter method를 활용한 iteration 예시
for neighbor in root.iter('neighbor'):
print(neighbor.attrib)
{'name': 'Austria', 'direction': 'E'}
{'name': 'Switzerland', 'direction': 'W'}
{'name': 'Malaysia', 'direction': 'N'}
{'name': 'Costa Rica', 'direction': 'W'}
{'name': 'Colombia', 'direction': 'E'}
4. index를 이용한 예시
>>> root[0][1].text
'2008'
5. findall method 활용
>>> for country in root.findall('country'):
... rank = country.find('rank').text
... name = country.get('name')
... print(name, rank)
...
Liechtenstein 1
Singapore 4
Panama 68
'Computer Science > Python' 카테고리의 다른 글
[conda-forge/miniforge] 미니포지 삭제 - 맥(MAC) OS (0) | 2022.07.18 |
---|---|
[Python] 예약어, 키워드 (keywords, reserved word) (0) | 2022.07.10 |
[Python] enumerate를 활용한 for loop (0) | 2022.07.03 |
[Python] json.dumps 한글깨짐 해결 (0) | 2021.04.07 |
[Python] 파이썬 call by reference, call by value (0) | 2020.04.28 |