현재 개발 중인 HTML 파서는 파싱의 효율성을 위해 기본적으로 DOM과 유사한 방법을 사용한다.
DOM이란?
위키의 설명을 빌리자면 "문서객체모델(DOM; Document Object Model)은 객체 지향 모델로써 구조화된 문서를 표현하는 형식이다." 라고 정의되어 있다. W3C의 공식 표준이며 HTML 문서의 요소(엘레멘트; element : 영문으로는 엘레멘트라 하지만 국내에서는 대부분 "태그"로 말한다)를 제어하기 위해 웹브라우저에서 처음 지원됐다.
DOM의 적합성
결국 DOM을 단순히 말하자면 특정한 구조를 가진 문서에 대해 쉽게 쓸 수 있게 하는 것이라고 생각할 수 있는데, 구조화된 문서는 HTML 파서에 어떤 효용성이 있는지 판단해 보아야한다. XML 문서의 경우 자체적으로 이미 하나의 DOM 객체라고 할 수 있는데 자바스크립트를 이용하면 특정 레벨에 대한 검색이나 태그의 탐색등을 할 수 있는 점이 그 예이다. 즉, 현재 개발하려는 HTML 파서의 목적 중 가장 중요한 기능이라 할 수 있는 특정 정보(특정한 태그나 속성)에 대한 탐색이 용이할 것이라는 판단이 나온다. 그러므로 HTML 파서 개발에서 기본적으로 DOM과 같이 HTML을 이용할 수 있도록 자체적으로 API를 만들것이다.
개발 언어
또 하나의 중요한 관점은 파서의 속도인데, 웹브라우저를 통해 우리가 보게되는 페이지의 정보는 많지 않을지 몰라도 실제 그 문서의 소스코드를 살펴보면 상당히 많은 정보가 들어 있으므로, 많은양의 문서를 파싱해야하는 파서로서는 조금이라도 속도가 빠른것이 용이하다. 그렇다면 포인터를 이용하는 C 나 C++ 이 적합한데, 이 중 객체의 개념을 적용하기 쉽고 코드 이식성을 높일 수 있도록 C++를 사용한다.
HTML 문서의 분석
HTML 문서에서 가장 기본 단위는 태그라고 할 수 있다.
태그에는 기본적으로 태그명, 속성명, 속성값이 포함될 수 있다. 태그명은 하나의 태그에 하나만이 존재하지만, 속성의 경우 아래 예와 같이 다수의 속성명을 포함 할 수 있으므로, 가장 기본 단위의 객체를 태그로 놓아두되, 태그는 속성 객체의 리스트를 멤버로 갖도록 설계해야 한다.
EX) <a id="ex_id" href="ex_href.html">ex_text</a>
또한 속성 객체에는 어떤 멤버가 필요한지 살펴볼 필요가 있다. 위의 a태그의 id 속성만을 놓고 봤을 때, "id"라는 속성명과 "ex_id"라는 속성값이 있다. 속성에 대한 검색과 원형 복원 등을 위해 대문자 속성명(검색용), 쿼테이션마크, 속성값 등에 대한 멤버가 필요하다. 태그에는 태그명, 속성, 텍스트 외에도 몇가지 더 필요한 것이 있다. 단순히 태그에 대해 표현하고자 하는것이 아니라 HTML 문서를 구조화 시키기 위한 것이므로 계층 구조를 만들어 줄 링크가 필요하다. 우선 모든 태그의 부모 태그는 하나 뿐이므로 부모 태그에 대한 링크가 필요하며, 자식 태그의 경우 다수의 자식 태그가 존재할 수 있으므로 자식 태그의 링크를 리스트의 형태로 멤버로 갖도록 한다. 속성과 마찬가지로 검색용 태그명이 필요할 것이며, 해당 태그가 열기 태그인지 닫기 태그인지를 구별할 수 있도록 열기닫기에 대한 플래그를 멤버로 가진다(사실 이 플래그가 크게 중요한 것은 아니다).
HTML 구조화를 간략하게 표현해보면 아래의 그림과 같이 나타낼 수 있게된다. 그림에서 알 수 있듯이 결국 HTML 문서를 최상위 노드(Root Tag)에서 뻗어 나오는 트리 형태의 구조로 그릴 수 있게된다.
여기까지 HTML 파서에서 문서의 구조화에 대해 설명하고 다음에 파서의 필요 기능들과 탐색 기법 등을 설명한다.
TRACKBACK 0 AND
COMMENT 0

이올린에 북마크하기
이올린에 추천하기
PREV