안드로이드의 XML 파서 : DOM, SAX 그리고 Pull 파서

대표적인 XML 파서의 종류는 SAX 파서와 DOM 파서다. 안드로이드에는 이 두가지 외에 하나가 더 내장되어 있는데, Pull 파서다. 그 위치는 다음과 같다.

  • DOM 파서 : org.w3c.dom.*
  • SAX 파서 : org.xml.sax.*
  • Pull 파서 : org.xmlpull.v1.*

보통 DOM 파서와 SAX 파서의 차이는 많이 알려져 있다. 이 두개부터 간단히 소개하면 DOM 파서는 문서의 처음부터 끝까지 모두 읽은 후에 이를 트리 형태의 자료구조로 만든 후에 사용자가 필요한 처리를 한다. 전체를 모두 메모리에 올려두었기 때문에 같은 노드를 여러번 읽을 수도 있고 속도도 빠르다. SAX 파서는 XML을 읽으면서 이벤트(문서 시작, 문서 끝, 엘리먼트 시작, 엘리먼트 끝 등)가 발생하면 이에 대한 처리를 하는 방법이다.  마지막으로 Pull 파서는 문서를 처음부터 읽으면서 처리하는 것은 SAX와 비슷하지만, 이벤트 기반이 아니라 읽으면서 바로 처리한다.  XML 파서에 대한 내용은 매우 많으므로 안드로이드에서 어떤 파서를 쓰는 것이 좋을 지 개인적인 의견을 적어본다.

첫번째 고민할 부분은 안드로이드가 모바일 기기라는 점이다. 그면에서 SAX 파서나 Pull 파서가 좋다. 기본적으로 값을 각 아이템(엘리먼트의 시작과 끝을 포함해서 부르는데, 대체적으로 데이터 1줄이라고 생각해도 무방하다.) 별로 반복문을 통해 읽기 때문에, 필요한 값만 뽑아내는 경우 비교적 적은 자원 소비로 XML을 파싱할 수 있다. 이에 비해 DOM은 보통 XML을 트리형태의 데이터 구조로 메모리에 올린 후에 XML의 전체를 탐색할 수 있도록 한다.

둘째로 생각할 부분은 어느것이 더 편리한지 생각해봐야 한다. 위에 간단한 설명처럼 SAX 파서는 이벤트 기반(callback을 이용한)으로 파싱한다는 것이고, Pull 파서는  읽으면서 바로 처리한 다는 것이다.  SAX는 코드상 경직된 구조와 예상치 못한 XML값의 변경에 대응이나 디버깅이 어렵다. 이에 비해 Pull은 XML을 스트링으로 주르륵 읽어서 처리하는 것으로 코드는 지저분 할 수 있지만 스트링을 유연하게 확인하거나 변경할 수 있다.

안드로이드에서 메모리 문제와 XML 량이 많지 않다는 점 때문에, 개인적으로는 Pull 파서를 애용한다.

참고

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.