2. 나무를 타고 노는 법: ElementTree

파이썬에서 방대한 XML 데이터를 조작할 때 가장 사랑받는 도구가 바로 xml.etree.ElementTree 모듈입니다. 이 마법사는 평범한 XML 텍스트 문서를 데이터들이 구조적으로 연결된 아름다운 생명의 나무 형태(Tree)로 변신시켜 줍니다!

: 편의를 위해 보통 import xml.etree.ElementTree as ET 로 줄여 부릅니다.

2.1 문서 나무 심기 (Parsing)

디스크에 있는 data.xml 파일을 읽어 멋진 파이썬 나무 트리로 만드는 마법 주문은 parse 입니다.

import xml.etree.ElementTree as ET

# 파일에서 묘목(데이터)을 가져와 나무를 통째로 생성합니다.
tree = ET.parse('country_data.xml')

# 나무의 가장 꼭대기(줄기)인 Root 요소를 가져옵니다.
root = tree.getroot()

print("최상위 태그 이름:", root.tag)
# 출력: 최상위 태그 이름: data

2.2 거대한 나무에서 보물(태그) 찾기

나무 구조의 장점은 탐색이 무척 빠르고 직관적이라는 것입니다. 가지에서 또 다른 가지로 건너갈 수 있죠.

  • for i in root: : 줄기 아래 달린 큰 가지(자식 노드)들을 하나씩 다 확인할 때!
  • find('태그명') : 수많은 가지 중에 ‘태그명’과 똑같은 첫 번째가지 딱 하나만 찾고 싶을 때.
  • findall('태그명') : ‘태그명’과 똑같은 모든 가지를 수확해서 리스트에 몽땅 담아올 때!
# root 아래에 있는 몬스터 정보를 다 뽑아보자!
for monster in root.findall('monster'):
    # 속성(attribute) 읽어오기
    name = monster.get('name')
    
    # 텍스트(text) 값 가져오기
    hp = monster.find('hp').text
    
    print(f"야생의 {name}이(가) 나타났다! 체력: {hp}")

2.3 내 손으로 나무 기르기 (XML 작성)

우리가 파이썬 코드상에서 새로운 노드를 덧붙여서 완전한 XML 문서를 만들어낼 수도 있습니다. 다 완성된 나무 뼈대는 tostring으로 텍스트로 뽑아내거나, write로 파일로 저장하면 끝입니다.

import xml.etree.ElementTree as ET

# 1. 뿌리 뼈대 세우기
root = ET.Element("game_data")

# 2. 새로운 서브 뼈대(자식) 붙이기
player1 = ET.SubElement(root, "player", level="99") # level은 속성!
player1.text = "Dragon Slayer" 

# 3. 콘솔 화면에 멋지게 텍스트로 뽑아보기!
xml_string = ET.tostring(root, encoding="unicode")
print(xml_string)
# 출력: <game_data><player level="99">Dragon Slayer</player></game_data>

# + 4. 파일로 저장하고 싶다면?
# tree = ET.ElementTree(root)
# tree.write('my_game.xml')

XML로 튼튼한 데이터 창고를 짓는 파이썬 요정의 마법, 훌륭하죠?

서브목차