Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python DOM API로 XML 문서 파싱하기: minidom 완벽 가이드

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 레퍼런스를 참고하시기 바랍니다.