DOM(Document Object Model)이란?
DOM(문서 객체 모델)은 W3C(World Wide Web Consortium)에서 제공하는 크로스 언어(cross-language) API로, XML 문서에 접근하고 수정할 수 있게 해줍니다.
DOM은 랜덤 액세스(random-access)가 필요한 애플리케이션에서 특히 유용합니다. 반면 SAX는 한 번에 문서의 일부분만 볼 수 있어서, 하나의 SAX 요소를 살펴보는 동안에는 다른 요소에 접근할 수 없다는 한계가 있습니다.
minidom을 이용한 XML 파싱
XML 문서를 빠르게 로드하고 minidom 객체를 생성하는 가장 간단한 방법은 xml.dom 모듈을 사용하는 것입니다. minidom 객체는 XML 파일로부터 손쉽게 DOM 트리를 만들어 주는 간단한 파서 메서드를 제공합니다.
아래 예제는 minidom 객체의 parse(file [,parser]) 함수를 호출하여, 지정된 XML 파일을 DOM 트리 객체로 변환하는 과정을 보여줍니다.
예제 코드
#!/usr/bin/python3
from xml.dom.minidom import parse
import xml.dom.minidom
# minidom 파서로 XML 문서 열기
DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):
print("루트 엘리먼트 : %s" % collection.getAttribute("shelf"))
# 컬렉션의 모든 영화 가져오기
movies = collection.getElementsByTagName("movie")
# 각 영화의 상세 정보 출력
for movie in movies:
print("*****Movie*****")
if movie.hasAttribute("title"):
print("제목: %s" % movie.getAttribute("title"))
type = movie.getElementsByTagName('type')[0]
print("장르: %s" % type.childNodes[0].data)
format = movie.getElementsByTagName('format')[0]
print("포맷: %s" % format.childNodes[0].data)
rating = movie.getElementsByTagName('rating')[0]
print("평점: %s" % rating.childNodes[0].data)
description = movie.getElementsByTagName('description')[0]
print("설명: %s" % description.childNodes[0].data)실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
루트 엘리먼트 : New Arrivals *****Movie***** 제목: Enemy Behind 장르: War, Thriller 포맷: DVD 평점: PG 설명: Talk about a US-Japan war *****Movie***** 제목: Transformers 장르: Anime, Science Fiction 포맷: DVD 평점: R 설명: A schientific fiction *****Movie***** 제목: Trigun 장르: Anime, Action 포맷: DVD 평점: PG 설명: Vash the Stampede! *****Movie***** 제목: Ishtar 장르: Comedy 포맷: VHS 평점: PG 설명: Viewable boredom
코드 핵심 포인트 정리
- xml.dom.minidom.parse() — XML 파일을 읽어 DOM 트리 객체로 변환합니다.
- documentElement — DOM 트리의 최상위(루트) 엘리먼트에 접근합니다.
- hasAttribute() / getAttribute() — 엘리먼트의 속성 존재 여부를 확인하고 값을 가져옵니다.
- getElementsByTagName() — 태그 이름으로 하위 엘리먼트 목록을 조회합니다.
- childNodes[0].data — 해당 엘리먼트의 텍스트 내용에 접근합니다.
참고: 위 예제는 Python 3 문법(
print()함수)에 맞게 작성되었습니다. 구버전 Python 2 환경에서는print "..."형태의 출력문을 사용해야 합니다.
마무리
이처럼 minidom을 활용하면 몇 줄의 코드만으로 XML 문서를 구조화된 트리 형태로 다룰 수 있습니다. DOM API에 대한 더 자세한 내용이 필요하다면 Python 공식 문서의 표준 API 레퍼런스를 참고하시기 바랍니다.