XML이란 무엇인가?
XML은 '확장 가능 마크업 언어(Extensible Markup Language)'의 약자입니다. 주로 웹 페이지에서 구조화된 데이터를 표현하는 데 사용되며, 시작 태그와 종료 태그로 정의되는 요소(element)로 구성됩니다. 태그(tag)는 < 로 시작하여 > 로 끝나는 마크업 구조를 의미하고, 시작 태그와 종료 태그 사이의 문자들이 해당 요소의 내용(content)이 됩니다. 또한 요소 내부에는 다른 요소를 포함할 수 있으며, 이를 '자식 요소(child element)'라고 부릅니다.
예제 XML 파일
이 글에서 사용할 XML 파일의 예시는 아래와 같습니다.
<?xml version="1.0"?>
<Tutorials>
<Tutorial id="Tu101">
<author>Vicky, Matthew</author>
<title>Geo-Spatial Data Analysis</title>
<stream>Python</stream>
<price>4.95</price>
<publish_date>2020-07-01</publish_date>
<description>Learn geo Spatial data Analysis using Python.</description>
</Tutorial>
<Tutorial id="Tu102">
<author>Bolan, Kim</author>
<title>Data Structures</title>
<stream>Computer Science</stream>
<price>12.03</price>
<publish_date>2020-1-19</publish_date>
<description>Learn Data structures using different programming lanuages.</description>
</Tutorial>
<Tutorial id="Tu103">
<author>Sora, Everest</author>
<title>Analytics using Tensorflow</title>
<stream>Data Science</stream>
<price>7.11</price>
<publish_date>2020-1-19</publish_date>
<description>Learn Data analytics using Tensorflow.</description>
</Tutorial>
</Tutorials>xml.etree.ElementTree로 XML 읽기
xml.etree.ElementTree 모듈을 사용하면 XML 파일의 루트(root)에 접근할 수 있으며, 이를 통해 내부 요소들의 내용도 손쉽게 확인할 수 있습니다. 아래 예제에서는 text 속성을 이용해 각 요소의 내용을 출력합니다.
예제 코드
import xml.etree.ElementTree as ET
xml_tree = ET.parse('E:\\TutorialsList.xml')
xml_root = xml_tree.getroot()
# 헤더 출력
print('Tutorial List :')
for xml_elmt in xml_root:
for inner_elmt in xml_elmt:
print(inner_elmt.text)실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Tutorial List : Vicky, Matthew Geo-Spatial Data Analysis Python 4.95 2020-07-01 Learn geo Spatial data Analysis using Python. Bolan, Kim Data Structures Computer Science 12.03 2020-1-19 Learn Data structures using different programming lanuages. Sora, Everest Analytics using Tensorflow Data Science 7.11 2020-1-19 Learn Data analytics using Tensorflow.
XML 속성(Attribute) 가져오기
루트 태그에 포함된 속성 목록과 그 값을 조회할 수 있습니다. 속성 정보를 미리 파악해 두면 XML 트리를 훨씬 쉽게 탐색할 수 있다는 장점이 있습니다.
예제 코드
import xml.etree.ElementTree as ET
xml_tree = ET.parse('E:\\TutorialsList.xml')
xml_root = xml_tree.getroot()
# 헤더 출력
print('Tutorial List :')
for movie in xml_root.iter('Tutorial'):
print(movie.attrib)실행 결과
위 코드를 실행하면 각 Tutorial 요소의 id 속성 값이 출력됩니다.
Tutorial List :
{'id': 'Tu101'}
{'id': 'Tu102'}
{'id': 'Tu103'}결과 필터링하기
findall() 함수를 활용하면 XML 트리에서 원하는 조건에 맞는 결과만 골라낼 수 있습니다. 아래 예제에서는 가격(price)이 12.03인 강좌의 id를 찾아 출력합니다.
예제 코드
import xml.etree.ElementTree as ET
xml_tree = ET.parse('E:\\TutorialsList.xml')
xml_root = xml_tree.getroot()
# 헤더 출력
print('Tutorial List :')
for movie in xml_root.findall("./Tutorial/[price ='12.03']"):
print(movie.attrib)실행 결과
가격이 12.03인 강좌는 Tu102 하나뿐이므로, 아래와 같은 결과가 나옵니다.
Tutorial List :
{'id': 'Tu102'}DOM API를 활용한 XML 파싱
xml.dom 모듈을 사용하면 minidom 객체를 생성할 수 있습니다. minidom 객체는 XML 파일로부터 빠르게 DOM 트리를 만들어 주는 간단한 파서 메서드를 제공합니다. parse(file [,parser]) 함수를 호출하면 지정된 XML 파일이 DOM 트리 객체로 변환됩니다.
예제 코드
from xml.dom.minidom import parse
import xml.dom.minidom
# minidom 파서로 XML 문서 열기
DOMTree = xml.dom.minidom.parse('E:\\TutorialsList.xml')
collection = DOMTree.documentElement
# 컬렉션의 모든 Tutorial 요소 가져오기
tut_list = collection.getElementsByTagName("Tutorial")
print("*****Tutorials*****")
# 각 Tutorial의 상세 정보 출력
for tut in tut_list:
strm = tut.getElementsByTagName('stream')[0]
print("Stream: ", strm.childNodes[0].data)
prc = tut.getElementsByTagName('price')[0]
print("Price: ", prc.childNodes[0].data)실행 결과
위 코드를 실행하면 각 강좌의 스트림(stream)과 가격(price) 정보가 순서대로 출력됩니다.
*****Tutorials***** Stream: Python Price: 4.95 Stream: Computer Science Price: 12.03 Stream: Data Science Price: 7.11
마무리
지금까지 Python에서 XML 데이터를 처리하는 대표적인 두 가지 방법, 즉 xml.etree.ElementTree 모듈과 xml.dom.minidom(DOM API)을 살펴보았습니다. ElementTree는 가볍고 직관적인 인터페이스로 간단한 XML 파싱 작업에 적합하며, DOM 방식은 문서 전체를 트리 구조로 메모리에 올려 정교한 조작이 필요할 때 유용합니다. 상황에 맞는 모듈을 선택해 효율적으로 XML 데이터를 다뤄보시기 바랍니다.