XML

지각생 연습장

목차

개요

XML 라이브러리들

원본 : http://hiya.byus.net/prog/archives/2004/07/xml_oaiee.html#more 2004-07-09

  • 앞으로 XML 파일이 TXT 파일을 대체할 날이 올 것입니다. 물론 TXT 처럼 단일한 표준이 있지는 않겠지만 몇 가지 안이 널리 사용 것이라고 봅니다. 텍스트 파일은 표현이 너무 한정되어 있지만 XML은 훨씬 다양하고 유현하게 표현할 수 있으니까요. (어쨌든 SGML은 XML보다 사람에게는 관대하지만 기계입장에서는 다루기 어렵기 때문에 사장되는 분위기이므로 논외로 하겠습니다.)
  • MS Word의 .doc 파일이나 .pdf 파일은 사실상 정보 공유에는 .txt를 압도하지 못했습니다. 이들은 공개된 표준이냐 아니냐를 떠나 단지 정보 공유를 목표로하지를 않았기 때문입니다. 반면에 XML은 최초의 TXT와 마찬가지로 정보의 공유를 목표로 하였으며 앞으로 몇 년간의 혼란기를 지나면 실질적으로 우리의 삶에 영향을 끼칠 것입니다. 사실 아직까지도 변변한 오픈소스 GUI XML 편집기가 없다는 것이 이해가 안 됩니다. (어쨌든 emacs나 vi는 "일반(?)" 사용자 용은 아니니까요. 좀 더 casual한 툴을 말하는 것입니다.)
  • 개발자 입장에서는 XML은 좀 더 가까이 와닿고 있습니다. 개발 언어와 GUI 툴 킷에서 XML의 지원이 보편화되는 것입니다. MS의 Xen은 소스 코드에 XML 문장을 섞어 쓸 수 있으며, Mozilla와 Longhorn은 XML을 사용하여 UI를 표현합니다. (XUL과 XAML이라고 합니다.) 저도 개인적으로 XUL을 모델로하여 GUI 툴 킷을 만들고 있습니다. :)

Mozilla XUL

XUL Spec 1.0 : 아직 완전한 스펙은 아닌데 진행이 지지부진하네요.

제가 XUL를 프로젝트를 진행하면서 여러 표준들과 다른 라이브러리들을 참고하게 되었습니다.

1) DOM

DOM은 Netscape가 JavaScript와 웹 스크립트의 시대를 연 사건으로부터 파생되었다고 할 수 있습니다. JavaScript는 웹 문서의 내용을 프로그램 언어로 분석하고 변형할 수 있었는데, 이 때 사용하는 인터페이스를 표준화한 것이 DOM입니다.

하지만, DOM은 아주 범용적이기 때문에 HTML뿐만 아니라 모든 XML 문서를 DOM을 사용하여 다루기에 충분합니다. DOM은 무척이나 복잡한 API라서 이를 제대로 구현하는 소프트웨어가 별로 없을 정도입니다. -_-;

The DOM in Mozilla

DOM 표준은 현재 Level 1부터 3까지 있는데, 레벨이 높을 수록 복잡하기 때문에 사용자가 알아서 취사 선택하면 됩니다. 보통 웹 브라우저들은 레벨 1의 수준을 제공하고 있습니다. 또한 DOM은 전체 스펙을 Core, HTML, Style, Events, Traversal, Range 등으로 나누어 놓았습니다.

보통의 웹 브라우저들은 HTML의 카테고리를 지원하고 있는데, HTML은 Core 인터페이스에 HTML만의 기능들을 추가한 것입니다. DOM은 너무나 일반적이어서 실제 소프트웨어의 기대에 100% 부합하지 못할 수도 있습니다. 따라서 이런 식의 기능 추가는 일반적일 것으로 보입니다. Mozilla의 XUL 시스템도 DOM 인터페이스를 따르고 있지만, DOM에 XUL만의 속성과 함수가 추가된 형태를 띄고 있습니다. 이처럼 HTML을 위한 DOM도 있고 XUL을 위한 DOM도 있어도 (말하자면 어딘가에 XYZ의 DOM이 있다고 해도) 이들 DOM이 모두 똑같은 것은 아닐 수 있는 것입니다.

DOM 표준은 객체 지향적인 인터페이스이며 이를 IDL로 정형화해 놓았습니다. 하지만, DOM은 garbage collection을 기본으로한 비교적 높은 수준의 언어를 전제로 하였습니다. 따라서 JavaScript를 포함하여 Java, C#과 같은 고수준의 프로그래밍 언어에 적합합니다. C++마저도 DOM을 그대로 표현하지 못하고 약간의 용법상의 변형이 불가피합니다. (C는 더 심각하구요.)

이들을 위하여 비표준으로 다른 언어를 위한 별도의 바인딩 방법이 제안되어 있군요.

DOM Bindings: C, C++과 같은 언어를 위한 '비표준' 바인딩들

DOM은 무척이나 복잡한 표준입니다. 특히 Level이 높아갈 수록 그 복잡성은 상상을 초월합니다. 그럼에도 불구하고 DOM은 아주 대중적입니다. 홈페이지를 한 번 만들어본 사람들은 대개 DOM이 뭔지는 모르지만, 실제로 DOM을 많이 이용하고 있습니다.

그만큼 XML을 다루는 소프트웨어를 개발하는 입장에서 DOM은 선택이 아니라 필수라고 할 수 있습니다. 다른 개발자를 위한 라이브러리이나 사용자 스크립트를 지원하는 소프트웨어라면 당연히 DOM 인터페이스를 제공하는 것이 다른 전용의 인터페이스를 제공하는 것보다 유리할 것입니다. DOM은 이미 많은 사람들에게 친숙하니까요.


2) SAX

  • SAX도 DOM과 같은 XML을 다루는 API이며, Java를 기준으로 제안되었으나 C 언어를 위해서 구현된 것도 있습니다. SAX는 DOM과는 다른 관점으로 XML 데이터를 접근합니다. DOM은 모든 XML 데이터를 메모리에 올려서 조회하거나 변형하는 것이지만, SAX는 XML 데이터를 앞에서부터 읽어 내려가면서 순서대로 파악하는 방식입니다. (이벤트 기반이라고도 합니다.)
  • SAX와 같은 이벤트 방식은 처리하기 전에 메모리에 XML 데이터를 로드할 필요가 없으므로 불필요한 메모리를 차지하지 않으며 가볍습니다. SAX는 DOM과 함께 가장 많이 사용되는 접근 방법이라고 할 수 있습니다. 하지만, 이 둘은 서로 목적과 용도가 다르기 때문에 적절히 선택해서 사용하여야 할 것입니다.

3) XML 라이브러리

XML 라이브러리들 중에서는 DOM이나 SAX를 구현한 것들도 있지만, 위의 표준들과 상관없이 자체적인 API를 제공하는 것도 있습니다. 그렇다고 해도 위의 API에서 영향을 받았기 때문에 대체로 비슷한 형태를 가지고 있습니다. 많이 참조되는 라이브러리들은 다음과 같은 몇 가지가 있는 것 같습니다. 그러나 프로젝트 내부적으로 혹은 개인적으로 만들어 쓰는 경우가 더 많은 것 같습니다.

  • expat: 가장 오래된 고전 라이브러리로서 이벤트 기반 API를 제공하고 있습니다. 외부 라이브러리를 같이 사용하면 SAX 표준 인터페이스로도 이용할 수 있습니다. 최초 개발자는 DocBook SGML의 표준 변환기인 Jade를 만든 James Clark씨라고 하네요.
  • libxml2: DOM에 영향을 받았으나 완전히 DOM을 따르지는 않았습니다. Gnome에서 기본으로 채택한 라이브러리이며, C 언어를 사용하였습니다. libxml2를 기반으로 하여 DOM을 정식으로 따르는 libgdome이 있습니다.
  • Apache Xerces-C++: C++로 작성되었으며 W3C에 비표준 C++ 바인딩으로 제안되어 있습니다.

Posted by Kain at July 9, 2004 11:53 PM

개인 도구