XML 파싱 패키지 TclXML

admin의 아바타

http://tclxml.sourceforge.net

TclXML은 Tcl과 C로 제작 되어졌으며, XML문서 파싱의 목적을 가집니다. Tcl과 같이 오픈 소스 형태로 개발이 되고 있으며, 위의 싸이트로부터 새로운 정보와 버전을 다운로드할 수 있습니다. TclXML은 Tcl8.3 이상을 권장하고 있으며, Tcl8.1 이후의 국제화 기능이 포함된 Tcl을 사용한다면, 한글이나 일본어등의 2바이트 언어권의 XML 포맷도 읽을수 있습니다.

소개

TclXML의 프로젝트는 크게 아래 3가지로 나뉘어 집니다.

TclXML TclXML은 XML 문서 처음부터 읽어가며 태그를 해석하는 파서 라이브러리입니다.
TclDOM TclDOM의 DOM은 Document Object Model로 불립니다. XML의 문서를 처음부터 읽는것이 아닌, 트리 오브젝트(Tree Object)로 액세스 하기위한 목적이며, HTML과 XML문서를 연결시켜주는 프로그래밍 인터페이스입니다. DOM을 이용하면 개발자는 XML문서를 만들수 있고, XML문서 구조를 탐색 할수 있으며 그의 요소를 추가/수정/삭제를 할수 있습니다.
TclXSLT TclXSLT의 XSLT는 XSL Transoformations의 약자입니다. TclXSLT는 XML문서와 XSL의 스타일 시트를 결합하여, HTML문서를 생성해주는 라이브러리입니다.

XML파서/DOM파서/XSLT 프로세서의 라이브러리로써, C로 쓰여진 오픈소스의 유명한 라이브러리가 몇개 알려져 있습니다. 호환성을 중시하며 순수 Tcl언어로 쓰여진 TclXML 파서에, C로 제작된 오픈소스 라이브러리의 힘을 빌려, 고속 파싱 및 처리를 일괄적으로 담당 하고자 하는 것이 TclXML 프로젝트의 목적이라 할수있습니다.

TclXML 파서는 현재 tcl과 expat를 지원합니다. tcl은 순수 Tcl언어로만 쓰여진 XML파서이고, expat는 오픈소스의 expat를 이용한 파서입니다.

TclXML의 아카이브 중에는 expat의 소스가 포함되어 있기 때문에 별도로 준비할 필요는 없습니다. (expat는 2바이트 언어권을 지원하지 않습니다.) 앞으로 TclXML은 The XML C Library for GNOME(libxml2)와 Apache Xerces-C의 지원도 할것으로 보입니다. TclDOM 파서는 Tcl언어로 쓰여진것과, The XML C Library for GNOME(libxml2) 파서 두가지가 있습니다. 그리고 가장 복잡한 프로그램인, XSLT 프로세서를 내장한 TclXSLT는, 순수 Tcl 언어로 쓰여져 있지 않고 XSLT 프로세서인 libxslt, libexslt 에 의존하고 있어, 이것들을 사전에 설치해둘 필요가 있습니다.

설치

Windows ActiveTcl 경우

Windows의 ActiveTcl인 경우는 ActiveTcl바이너리 배포판에 바로 사용가능토록 미리 컴파일이된 TclXML+TclDOM+TclXSLT가 포함되어 있기 때문에, 설치를 하시면 곧바로 사용할 수 있습니다.

Tcl용 파서만 설치의 경우

wish install.tcl

만약 Tcllib8.0 이후 버전이 설치되어 있는데도, tcllib8.0을 찾을수 없다는 에러가 난다면, install.data 파일의

Require tcllib 0.8

package require tcllib

로 수정하세요.

Tcl 파서 + Expat 파서 설치경우

% cd tclxml-2.4
% sh configure; make
# make install 
% cd expat
% sh configure; make
# make install 

샘플 XML문서

여기서는 XML 포맷으로 작성한 메모를 사용해 보겠습니다.

memo.xml

<?xml version="1.0"?>
<?xml:stylesheet type="text/xsl" href="메모.xsl"?>
<!DOCTYPE 메모 SYSTEM "메모.dtd" >
<메모>
   <헤더>
      <송신자> & </송신자>
      <수신자> 홍길동 </수신자>
      <수신자> 이순신 </수신자>
      <날짜>
         <년> 2000 </년>
         <월> 12 </월>
         <일> 9 </일>
      </날짜>
      <제목> XML의 기본개념 과 활용방안 </제목>
      <키워드> XML </키워드>
      <키워드> 문서구조 </키워드>
      <키워드> DTD </키워드>
   </헤더>
   <텍스트>
      <내용> 이글은 XML과 관련된 연재입니다. 다음과 같은 차례로 이루어져 있습니다.  </내용>
      <목록 타입="도형">
         <항목> XML이란?  </항목>
         <항목> XML 문서의 처리 - 엘리먼트, 속성, 엔터티..  </항목>
         <항목> XML, XSL 그리고 웹브라우저 </항목>
         <항목> XML 응용 분야 및 발전 가능성 </항목>
      </목록>
   </텍스트>
</메모>

TclXML의 사용

TclXML을 사용하여 위의 XML문서의 태그를 분석해봅니다.

xmlparse.tcl

package require xml
 
set filename [lindex $argv 0]
 
proc clearlog {} {
   set fout [open "tclxml.log" w];
   close $fout
}
 
proc loglog msg {
   set fout [open "tclxml.log" a]
   puts $fout $msg;
   close $fout
}
 
# 태그가 시작되면 불립니다.
# 태그요소의 이름, args 속성이 있을때는 속명명과 속성값의 리스트
proc estartCmd {hvar ename args} {
   upvar $hvar h
   lappend h $ename
   loglog "ESTART: $ename / $args"
}
 
# 태그가 끝나면 불립니다.
proc eendCmd {hvar ename args} {
   upvar $hvar h
   set h [lreplace $h end end]
   loglog "EEND: $ename / $args"
}
 
# 데이타가 나타나면 불립니다.
proc cdataCmd {hvar data} {
   upvar $hvar h
   if {[string length [string trim $data]] > 0} {
      loglog "CDATA: $data"
       set elementPath [join $h .]
      puts "$elementPath=\[$data\]"
   }
}
 
proc defaultCmd {args} { puts "DEFAULT: $args" }
# XML파일의 내용을 읽습니다.
set fin [open $filename r];
set buf [read $fin];
close $fin
 
# 로그파일의 초기화
clearlog
 
set h {}
set parser [::xml::parser\
   -characterdatacommand "cdataCmd h" \
   -elementstartcommand "estartCmd h" \
   -elementendcommand "eendCmd h" \
   -defaultcommand defaultCmd \
]
 
$parser parse $buf

TclXML의 간단한 사용 방법은 ::xml::parser 커맨드로 파서를 생성합니다. 생성시 -characterdatacommand, -elementstartcommand 등의 옵션으로 데이타나 태그의 시작에 어떤 작업을 할지를 프로시져로 기술해줍니다. 실행을 해보면

tclsh xmlparse.tcl memo.xml

아래와 같은 실행화면을 볼것입니다.

DEFAULT: {<?xml version="1.0"?>}
DEFAULT: {
}
DEFAULT: {
}
DEFAULT: <!DOCTYPE
DEFAULT: { }
DEFAULT: 메모
DEFAULT: { }
DEFAULT: SYSTEM
DEFAULT: { }
DEFAULT: {"메모.dtd"}
DEFAULT: { }
DEFAULT: >
DEFAULT: {
}
DEFAULT: {&}
메모.헤더.수신자=[ 홍길동 ]
메모.헤더.수신자=[ 이순신 ]
메모.헤더.날짜.년=[ 2000 ]
메모.헤더.날짜.월=[ 12 ]
메모.헤더.날짜.일=[ 9 ]
메모.헤더.제목=[ XML의 기본개념 과 활용방안 ]
메모.헤더.키워드=[ XML ]
메모.헤더.키워드=[ 문서구조 ]
메모.헤더.키워드=[ DTD ]
메모.텍스트.내용=[ 이글은 XML과 관련된 연재입니다. 다음과 같은 차례로 이루어져 있습니다.  ]
메모.텍스트.목록.항목=[ XML이란?  ]
메모.텍스트.목록.항목=[ XML 문서의 처리 - 엘리먼트, 속성, 엔터티..  ]
메모.텍스트.목록.항목=[ XML, XSL 그리고 웹브라우저 ]
메모.텍스트.목록.항목=[ XML 응용 분야 및 발전 가능성 ]
DEFAULT: {
}

그리고 생성된 tclxml.log 파일의 내용은 아래와 같습니다.

ESTART: 메모 / {}
ESTART: 헤더 / {}
ESTART: 송신자 / {}
EEND: 송신자 /
ESTART: 수신자 / {}
CDATA:  홍길동
EEND: 수신자 /
ESTART: 수신자 / {}
CDATA:  이순신
EEND: 수신자 /
ESTART: 날짜 / {}
ESTART: 년 / {}
CDATA:  2000
EEND: 년 /
ESTART: 월 / {}
CDATA:  12
EEND: 월 /
ESTART: 일 / {}
CDATA:  9
EEND: 일 /
EEND: 날짜 /
ESTART: 제목 / {}
CDATA:  XML의 기본개념 과 활용방안
EEND: 제목 /
ESTART: 키워드 / {}
CDATA:  XML
EEND: 키워드 /
ESTART: 키워드 / {}
CDATA:  문서구조
EEND: 키워드 /
ESTART: 키워드 / {}
CDATA:  DTD
EEND: 키워드 /
EEND: 헤더 /
ESTART: 텍스트 / {}
ESTART: 내용 / {}
CDATA:  이글은 XML과 관련된 연재입니다. 다음과 같은 차례로 이루어져 있습니다.
EEND: 내용 /
ESTART: 목록 / {타입 도형}
ESTART: 항목 / {}
CDATA:  XML이란?
EEND: 항목 /
ESTART: 항목 / {}
CDATA:  XML 문서의 처리 - 엘리먼트, 속성, 엔터티..
EEND: 항목 /
ESTART: 항목 / {}
CDATA:  XML, XSL 그리고 웹브라우저
EEND: 항목 /
ESTART: 항목 / {}
CDATA:  XML 응용 분야 및 발전 가능성
EEND: 항목 /
EEND: 목록 /
EEND: 텍스트 /
EEND: 메모 /

위의 로그 파일에는 태그가 나열된 순서대로 쓰여져 있습니다.

마치며

요즘의 모든 프로그램들은 대부분 프로젝트 파일을 XML 형식을 채택합니다. 유명한 개발툴인 볼랜드사의 C++ Builder 의 프로젝트 파일인 *.bpr도 XML 포맷입니다. 지금 까지 알아 본것 처럼 TclXML을 사용하면 XML 문서로부터 특정한 값을 갖는 데이타를 얻어낼수 있으며, 데이타 사이의 집계, 계산을 시키는 일도 가능합니다.