메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

한빛랩스 - 지식에 가능성을 머지하다 / 강의 콘텐츠 무료로 수강하시고 피드백을 남겨주세요. ▶︎

IT/모바일

파이썬으로 XML 다루기

한빛미디어

|

2004-01-08

|

by HANBIT

15,850

저자: 세언 맥그래쓰(Sean McGrath), 전순재 역

우리가 추진하고 있는 XML"99 다루기의 일부로서, 여러분에게 이 맛보기를 보여주게 되어 기쁘게 생각한다. 이 기사는 세언 맥그래쓰(Sean McGrath)가 이끌고 있는 튜토리얼에서 "파이썬으로 XML 작업하기(Working with XML in Python)"를 발췌한 것이다.

들어가는 말

바로 1 세기전 HTML과 CGI라는 파도로 넘실거릴 때, 펄(Perl)이 웹 프로그래밍 세계를 지배했었다. 웹에서 중심이 XML로 이동하면서, 웹 개발자들의 마음과 감정은 경쟁으로 끓어 오르고 있다. 지금 시점에서 많은 관심을 끄는 언어 하나는 바로 파이썬이다.

이 기사에서는 높은 수준에서 파이썬을 살펴 보겠다. 전통적으로 사용되어 온 "Hello world" 예제 프로그램을 사용하여 파이썬이라는 언어의 원초적인 특징을 예시하여 보겠다. 그리고 나서 파이썬이 보유한 XML 처리 능력을 자세히 살펴 보겠다.

파이썬은 자유롭다

파이썬은 자유롭다. python.org에 가면 이미-컴파일된 실행화일 뿐만 아니라 소스도 내려 받을 수 있다는 것을 알게 될 것이다. 아시다시피, "무료의(free)"라는 단어는 인터넷에 엄청나게 올라오는 그러한 단어들 중의 하나이다. 걱정하지 마라. 파이썬의 자유라는 말은 무료라는 의미가 아니라 대문자 "F"인 자유라는 말이다. 본질적으로 여러분은 파이썬으로 원하는 모든 것을 자유롭게 할 수 있다. 심지어 파이썬을 상업적인 용도로 사용할 수 있으며 파이썬으로부터 만들어진 파생물도 역시 상업적인 용도로 자유롭게 사용할 수 있다.

파이썬은 통역이 된다

파이썬은 통역되는(interpreted) 언어이다. 프로그램은 자신을 담은 평범한 텍스트 파일로부터 직접 실행될 수 있다. 전형적으로 파이썬 파일은 .py라는 확장자를 가진다. 프로그래머에 관한 한 컴파일이라는 단계가 전혀 필요 없다. 그냥 편집하고 실행하라!

파이썬은 이식성이 있다

파이썬은 이식성(portable)이 있다. 파이썬은 기본적으로 메인프레임에서부터 팜 파일럿까지 현재 알려져 있는 모든 컴퓨팅 플랫폼에서 실행된다. 파이썬은 개념적으로 자바 가상 기계와 유사한 가상 기계 골격구조(architecture)를 사용한다. 파이썬 인터프리터는 프로그램을 가상 기계 코드로 바로바로(on-the-fly) "컴파일한다". 이렇게 컴파일된 (전형적으로 .pyc라는 확장자를 가지는) 파일도 역시 이식성이 있다. 다시 말해, 최종-사용자에게 소스 파일을 감추고 싶다면 이렇게 컴파일된 .pyc 파일을 선적하면 된다.

파이썬은 이해하기 쉽다

파이썬은 정말 이해하기 쉽다. 다음 파이썬 프로그램은 문자열 "Hello world"를 인쇄한다:

  print "Hello world"

"Hello world" 어플리케이션으로서는 이 보다 더 쉬울 수는 없다는 것을 여러분도 인정하리라 생각한다! 이 프로그램을 실행하려면, 이 코드를 텍스트 파일에, 예를 들면 Hello.py이라는 이름으로 저장하고, 그 파일을 파이썬 인터프리터에게 다음과 같이 넘겨주자:

  python Hello.py

출력 결과는 놀랍다:

  Hello world

Hello.py 프로그램에는 구문적인 부담이 전혀 없다는 것을 주목하라. 이런 간단한 작업을 완수하는데는 필수적인 키워드도 필요 없으며 쌍-반점도 전혀 불필요하다. 이렇게 깔끔하고 군더더기 없이 구문에 접근하는 법은 파이썬의 대표적인 특징중의 하나이며 방대한 파이썬 프로그램에도 역시 똑 같이 잘 적용된다.

파이썬은 상호작용적이다

파이썬 인터프리터를 요청하면 (전형적으로 UNIX/Linux 시스템에서는 python이라고 타자하거나 윈도우에서는 "IDLE"이라는 어플리케이션을 실행하면), 여러분이 파이썬 서술문들과 상호작용하면서 실행할 수 있는 환경에 있다는 것을 깨닫을 것이다. 예를 들어, 다음에 다시 "Hello world" 어플리케이션을 예로 들겠다:

  >>> print "Hello world"

이 코드는 다음을 결과로 출력할 것이다:

  Hello world

위에 있는 ">>>" 표시는 파이썬의 명령어 프롬프트이다. 상호작용 모드는 파이썬을 가지고 놀기 위한 탁월한 환경이다. 또한 이 환경은 완전하게 기능이 갖추어진 계산기로서도 필수 불가결하다!

파이썬은 위지위그(WYSIWYG)이다

어떤때는 파이썬이 위지위그(WYSIWYG) 프로그래밍 언어로 지칭되기도 한다. 이렇게 불리는 이유는 파이썬 코드에서 들여쓰기가 그 코드가 어떻게 실행될지를 제어하기 때문이다. 파이썬은 코드 서술문들을 그룹짓기 위해 begin/end 키워드나 또는 괄호를 전혀 가지지 않는다. 파이썬은 그냥 그런 것들이 필요하지 않을 뿐이다. 다음의 파이썬 조각코드를 살펴 보자:

  if x > y:
    print x
    if y > z:
      print y
      print z
    else:
      print z

코드에서 사용된 들여쓰기는 실행의 목적을 위하여 어떻게 서술문들이 그룹지어져 있는지 통제한다. 위의 코드를 보면 if 절이 else 절과 관련이 있다는 것에는 절대 모호할 수가 없다. 왜냐하면 두 서술문 모두 같은 수준의 들여쓰기를 가지기 때문이다.

파이썬이 보유한 함수들

"Hello world" 프로그램을 다음과 같은 파이썬 함수로 변환할 수 있다:

  def Hello():
    print "Hello world"

함수 몸체 안에 있는 서술문들이 그 함수를 도입하고 있는 def Hello() 라인 안쪽으로 들여쓰기 되어 있는 것을 주목하라. 반괄호는 함수 매개변수들에 대한 위치 보유자(place holder)이다. 다음 함수는 그의 매개변수들인 xy 뿐만 아니라 "Hello world"라는 문자열을 인쇄한다:

  def Hello(x,y):
    print "Hello world",x,y
파이썬 모듈

파이썬 프로그램은 전형적으로 다수의 모듈(modules)로 구성된다. 어떤 파이선 소스 파일도 모듈로 기능을 할 수 있으며 또 하나의 파이썬 프로그램에 수입될 수 있다. 예를 들어, 위에 있는 Hello 함수가 Greeting.py라는 파일안에 있다면 그 함수를 다른 파이썬 프로그램에 수입할 수 있으며 다음과 같이 그 함수를 호출할 수 있다:

  # Hello 함수를 Greeting 모듈로부터 수입하라
  from Greeting import Hello
  # Hello 함수를 호출하라
  Hello()
더 큰 프로그램에 대한 모듈로 기능하는 프로그램들

파이썬을 사용하면 독립적으로 사용될 수 있는 프로그램을 쉽게 작성할 수 있을 뿐만 아니라 다른 프로그램에 대한 모듈로 사용될 수 있는 프로그램을 어느쪽이라도 쉽게 작성할 수 있다.

다음은 Greeting.py를 수정한 버전으로서 "Hello world"를 인쇄할 뿐만 아니라 여전히 다른 프로그램에 수입될 수도 있다:

  def Hello():
  print "Hello world"

  if __name__ == "__main__":
    # 매인 프로그램으로 실행되고 있는지
    # Hello 함수를 테스트하라
    Hello()

위 코드에서 __name__이라는 특수 변수에 주목하라. 프로그램이 직접적으로 실행되고 있으면 이 변수에는 자동으로 "__main__"이 설정된다. 만약 또다른 프로그램에 수입되어 있다면, __name__에는 그 모듈의 이름이 설정된다. 이 경우에는 "Greeting"이 설정될 것이다.

파이썬은 객체-지향적이다

파이썬은 대단히 객체-지향적인 언어이다. 다음은 "Hello world" 프로그램을 확장한 버전으로서 Message.py이라고 부르며, MessageHolder 객체를 통해서 어떠한 메시지도 인쇄할 수 있다:

  # MessageHolder라고 부르는 클래스 하나를 만들어라
    class MessageHolder:
      # 이 클래스의 객체가 하나 만들어질 때
      # 구성자는 - 자동으로 호출된다
      def __init__(self,msg):
      self.msg = msg

  # 저장된 메시지 문자열을 반환하는 함수
    def getMsg(self):
    return self.msg

들여쓰기가 소스 코드의 구조에 어떻게 사용되고 있는지 주목하라. getMsg 함수는 MessageHolder 함수의 안쪽에 들여쓰기 되고 있기 때문에 MessageHolder 클래스와 관련이 된다. 객체와 관련된 함수들은 더 일반적으로는 메쏘드(methods)라고 알려져 있다.

이제 모든 메시지가 대문자로 반환되도록 MessageHolder 클래스에 약간 변화가 필요하다고 가정해 보자. MessageHolder를 하부클래스화(subclassing)하면 그렇게 할 수 있는데, 상속받고자 하는 클래스를 클래스 이름뒤에 있는 괄호 안에 지정하면 된다:

  # 기존의 MessageHolder 클래스를 Message.py로부터 수입하라
  from Message import MessageHolder

  # MessageUpper라고 부르는 MessageHolder의 하부-클래스 하나를 만들어라
  class MessageUpper(MessageHolder):
    # 구성자
    def __init__(self,msg):
    # 상위 클래스(superclass)의 구성자를 호출하라
      Message.__init__(msg)

    # getMsg에 새로운 기능을
    # 오버-라이드(Over-ride)하라
    def getMsg(self):
      return string.upper(self.msg)
파이썬은 확장성이 있다

파이썬 언어는 자그마한 코어와 방대한 모듈 집단으로 구성된다. 이런 모듈 중에는 파이썬으로 작성된 것도 있고 어떤 것은 C로 작성되어 있다. 파이썬 모듈의 사용자로서는 그 차이를 느낄 수 없다. 예를 들어:

  import xmlproc
  import pyexpat

첫 번째 서술문은 라스 마리우스 가르숄(Lars Marius Garshol)이 순수하게 파이썬으로 구현한 XML 해석기(parser)를 수입한다. 두 번째 서술문은 제임스 클라크(James Clark)가 C로 작성한 expat XML 해석기(parser)에 대한 파이썬 포장(wrapping)을 수입한다.

이러한 모듈들을 사용하는 프로그램은 그 모듈들이 어떤 언어로 구현되었는지 알 수가 없다. 예상하다시피, expat에 기초한 프로그램은 XML 해석기(parser)가 순수하게 C로 구현되어 속도가 빠르다는 이점 덕분에 전형적으로 더 빠르다.

파이썬 모듈을 C로 작성하는 것은 놀랍도록 쉽다. 이런 능력은 방대한 파이썬 시스템에서 속도가 중요한 부분에 대하여 대단히 유용하다. 또한, expat을 포장한 것처럼 쉽게 기존의 C 라이브러리들을 파이썬 모듈로 "포장(wrap)"할 수도 있다. C API를 공개한 많은 테크놀러지들이 파이썬 모듈로 포장되었다. 예를 들면 Oracle, Win32 API, 그리고 wxWindows GUI 모둠, 등등이 그것이다.

XML 프로그래밍 지원

코어 파이썬 배포본(현재 버전 1.5.2)에는 xmllib라고 불리우는 간단하고 유효성검사 기능이 없는 XML 해석기(parser) 모듈이 있다. 파이썬의 XML 지원의 상당부분은 애드-온 모듈의 형태로 XML-SIG( 파이썬으로 XML 처리를 하기 위한 SIG)에서 적극적으로 개발되고 있는 중이다. 파이썬이 XML을 어떻게 지원하는지 보여 주기 위해, 관심을 돌려 "Hello world" 프로그램이라는 XML 1.0 버전을 파일로 하나 만들어 처리해 보겠다:

  
  
  Hello world
  
SAX

SAX는 XML에 대한 간단한 API로서, 데이비드 메긴슨(David Megginson)이 이끌고 있으며 XML-dev 메일링 리스트에서 협력적인 노력으로 개발되고 있다. 파이썬 구현은 라스 마리우스 가르숄(Lars Marius Garshol)에 의해서 개발되었다.

Greeting.xml에 있는 단어들을 세는 파이썬 SAX 어플리케이션은 다음과 같이 보인다:

  from xml.sax import saxexts, saxlib, saxutils
  import string

  # 문서 사건(events)을 처리하는 클래스 하나를 만들어라 
  class docHandler(saxlib.DocumentHandler):
    # 문서 처리자(document handler) 시작
    def startDocument(self):
    # Initialize storage for character data
    self.Storage = ""
  
  # 문서 처리자(document handler) 끝
  def endDocument(self):
    # string.split 함수가 반환하는
    # 단어들을 담은 리스트에 존재하는
    # 원소의 개수를 세어서 
    # 대략적인 단어의 개수를 인쇄하라
    print len(string.split(self.Storage))
 
  def characters(self,str,start,end):
    # 문자 데이타를 누적하라
    self.Storage = self.Storage + str[start:end]
  
  # 해석기(parser)를 하나 만들어라
  parser = saxexts.make_parser()

  # 만들어진 해석기(parser)에 문서 처리자(document handler)를 공급하라 
  parser.setDocumentHandler(docHandler())

  # Greeting.xml 파일을 해석하라(Parse) 
  parser.parseFile(open("Greeting.xml"))
DOM

DOM은 XML(그리고 HTML)에 대한 API를 표준화하기 위해 W3C가 발기한 초안이다. 파이썬에는 두 개의 DOM 구현이 있다. 하나는 XML-SIG 모듈에 있으며 앤드류 쿠클링(Andrew Kuchling)과 스테판 퍼미어(Stéfane Fermigier)의 작품이다. 다른 하나는 4DOM이라고 부르며 Fourthought사의 작품으로서, 이 회사는 파이썬으로 XSLT과 XPath 구현을 만들기도 했다.

다음은 샘플 DOM 어플리케이션으로서 Greeting.xml에 존재하는 단어들을 센다:

  from xml.dom import utils,core
  import string

  # XML 문서를 DOM 객체로 읽어 들여라
  reader = utils.FileReader("Greeting.xml")

  # 최상위 수준 DOM 문서 객체를 열람하라
  doc = reader.document

  Storage = ""
  # 노드들을 방문하라
  for n in doc.documentElement.childNodes:
    if n.nodeType == core.TEXT_NODE:
    # 텍스트 노드들의 내용들을 누적하라
    Storage = Storage + n.nodeValue
  print len(string.split(Storage))
파이썬에 고유한 API들

산업 표준의 API들 뿐만 아니라, 파이썬에는 Pyxie라고 알려진 파이썬에 고유한 XML 처리 라이브러리가 있다.

Pyxie는 Python용 오픈 소스 XML 처리 라이브러이다. 이 라이브러리는 2000년 1월에 공개적으로 사용가능하게 될 것이다. Pyxie는 파이썬의 특징을 최대한 이용하여 XML 처리를 간결하게 하고자 시도한다.

다음은 Pyxie를 사용하여 개발된 단어 세기 어플리케이션이다:

  from pyxie import *

  # XML을 트리 구조로 적재하라
  t = File2xTree("Greeting.xml")
  Storage = ""
  # 데이타 노드들을 담은 리스트를 반복하라
  for n in Data(t):
    Storage = Storage + t.Data
  print len(string.split(Storage))
결론을 내리며

지금까지 파이썬의 주요 특징들을 높은 수준에서 살펴 보았다. 또한 대충이나마 XML 처리 능력도 가능하다는 것을 살펴 보았다. 파이썬으로 하는 프로그래밍에 관한 정보가 더 필요하면, http://www.python.org/에서 시작하기를 추천한다.

TAG :

이전 글 : Singleton 패턴

다음 글 : GRASP 패턴

댓글 입력
자료실

최근 본 상품0