XML을 처음 접하고 사용하기 시작한게 2000년 경이었을테니, 얼추 7년정도 사용한듯 하다. 2000년에는 XML문서버젼관리 시스템 프로젝트를 했었고, 그 뒤에는 PlayAction이란 사이트 겸 CMS를 만드는데도 사용했었고, 회사다니면서는 각종 설정파일, 유틸리티, 메타정보등을 생성/관리하는데 사용해왔다. 그리고, C++로 xml pulling parser방식의 인터페이스를 가진 라이브러리도 고민했었다. (libxml을 이용한 DOM라이브러리로 전환하긴 했지만..) 이렇듯 프로그래머로서의 삶에 깊숙하게 침투하신 이 분을 어떻게 요리할까라는 생각이 재개된건, 졸업프로젝트로 고려중인 Simulation Engine제작 때문인게 크긴 하다.
각설하고, XML을 분석하는 관점은 크게 Well-formed Document와 Valid Document라고 볼 수 있다. Well-formed는 XML의 기본 문법에 맞는지의 여부이고, Vaild는 문서정의 (DTD나 XML Schema)에 맞는지의 여부다. 이 두가지 관점을 항상 같이 고민하다보니 문제가 어려워졌던 것 같다. 오랜만에 다가온 Eureka!!는 실로 반갑다. 자 그럼 그 Eureka!!가 무엇이냐 하면.. (사실 별거 아니다)
XML을 가장 간단하게 분석하는 방법은 <와 >로 묶인 태그라는 점이다. XML의 가장 기본적인 요소인 Element외에도 DocType(<!DOCTYPE >)이나 Processing Instruction(<? ?>), Comment(<!– –>), CDATA(<![CDATA[ ]]>)등도 결국은 <와 >로 묶인 태그였다. 이렇게 관점을 바꿔놓고 보니 몇가지 재미있는 속성들이 발견되었다.
- <![ 로 시작되는 태그들은 ]]>로 닫힌다.
- <! 로 시작되는 태그들은 >로 닫힌다.
- <? 로 시작되는 태그들은 ?>로 닫힌다.
- <로 시작되는 태그들은 >로 닫힌다.
이런걸 왜 이제야 생각했는지 모르겠다. -_-
XML의 전체 스펙을 생각하고 파서를 작성하려고 들면, 일이 복잡해진다. 하지만, 위의 4가지 속성만 고려하고 작성한다면, 규모가 작아지고 작성이 간단해질 것 같다. – 기존에 사용하던 state_machine클래스를 사용하면 더욱더 간단히 🙂 –
또한, 각 태그들을 Event로 간주한다면, 트리기반의 DOM이나 콜백기반의 SAX와는 달리, XML문서를 Event의 리스트로 관리할 수 있게 된다. SAX의 단점이라면, 역시 수정이 불가능하다는 것이고, DOM의 문제라면 메모리를 많이 차지한다는 점일텐데, 이 두 문제점 사이에서 적절히 타협할 수 있는 안이 되지 않을까 라는 생각이 들었다. 그리고, Event의 리스트로 관리하게 되면 복잡하긴 하겠지만, 트리형태의 Access도 불가능한 것은 아닐거라 생각한다.
남은 일은, 구현하는 일이지만… 회사일과 졸업논문, 각종 시험과 과제가 발목을 잡고 있는 현실이 안타까울 따름….. 응??