본문 바로가기
C++ 200제/코딩 IT 정보

안드로이드 XML 파싱 예제 - 구글맵 XmlPullParser

by vicddory 2017. 3. 23.

졸업 논문 중 일부를 발췌하여 블로그에 남깁니다.


안드로이드에서는 구글맵을 도구로써 사용하여 사용자 정의 지도 생성 및 편집을 할 수 있다. (XML 파싱을 통해서) 사용자가 지정한 특정 위치와 그에 해당하는 위치 좌표, 지리적 정보 등을 유추할 수 있는데 이를 위해서 프로그래밍 측면의 캔버스가 필요하다. 각종 마커가 그려진 캔버스의 역할은 키홀 위성사진이 맡게 되는데, 다운로드 되어 사용되는 맵에 겹쳐진다.


즉, 사용자가 편집한 지도는 다운로드 된 Android 구글맵과 위성사진이 겹쳐진 채 관련 정보를 XML에 담아 사용자에게 제공하는 것이며, 키홀 위성사진과 XML 파일은 지도의 메모리 역할에 비유할 수 있다.

일반적인 XML parsing은 XML 파일을 하나의 자원으로써 사용할 수 있도록 지원한다. parsing을 담당하는 파서는 컴파일러 일부로서 문장 구조를 파악하는 구문 분석을 하는 프로그램이다.


안드로이드 SDK에는 XML 파일을 다루기 위한 몇 가지 수단이 있는데, SAX, XmlPull v1, DOM Level2 Core 등이 존재한다. 구글어스를 통하여 생성된 KML 파일은 기존의 XML과 문법구조가 유사하므로 XML 파싱 방법으로 데이터 추출이 가능하다.


위의 그림은 파싱 단계에서 이루어지는 Event Type 별 진행 단계이다. .next() Android 메서드는 전 단계에서 다음 단계로 넘어갈 수 있게 이벤트 타입의 전환을 알려주는 메서드다.


안드로이드 구글맵을 주제로한 본 논문에서는 몇 가지 parsing 기법 중 빠르고 효율적이며 네트워크 대응 응용 프로그램에서 자주 사용되는 XMLPullParser를 이용한다.


XML 파싱 - 이벤트 타입 순서[Android Googlemap] XML 파싱 - 이벤트 타입 순서


XMLPULL V1 API에서 제공되는 기능 분석 정의 인터페이스로, FEATURE_PROCESS_DOCDECL은 True로 설정될 때 XML 1.0 스펙에서 Non-Valdating과 Validating Parser가 정의된다. (XML 파싱 방법 중 하나)


XmlPullParser Android 클래스에서 사용하는 두 개의 메서드는 높은 레벨에 이어지는 next()와 하위 레벨에 이어지는 nextToken()이다. next() 메서드로 이벤트가 전달되며 파싱이 이뤄지는데, 이벤트 전달 시, 사용자의 애플리케이션에서는 XML 버전, Standalone, Encoding의 반환 값이 올바른지 확인한다. 만약 parsing 대상 파일의 문서 정보 버전 값이 1.0과 다르면 파일을 인식하지 못한다.


문서 확인 과정을 거친 후, "START_TAG"로 XML의 Start 태그를 읽고, “TEXT”로 getText() 메서드를 발생시켜 XML 파일의 Name 별 태그 본문을 읽고, "END_TAG"로 end 태그를 읽은 후 "END_DOCUMENT"로 이벤트를 종료시킨다. 안드로이드 구글맵을 위한 KML 파싱 준비가 완료된 것이다.


XML 파싱에 이어, KML 파싱을 위해선 KML이 링크된 사이트의 주소가 필요한데, URL의 객체를 생성한 후 "new URL("KML 바로가기 주소")"와 같이 정의하면, 파싱될 대상인 KML 파일로의 연결이 가능하다. Android KML 파일에서 필요한 데이터의 추출을 위해서 필요한 클래스는 XmlPullParserFactory와 XmlPullParser이다.

XmlPullParser는 태그와 해당 Text를 읽는 즉시 처리하게 되는 일반적 특성이 있으며, XmlPull v1이 수행할 parsing에 대한 동작을 정의하고, 정리되지 않은 KML의 내용을 안드로이드에서 직접 추출하여 사용할 수 있도록 재정의되어 XmlPullParser의 객체에 담긴다.


getName() 메서드를 통하여 태그별로 데이터들을 분류할 수 있고, getAttributeValue() 메서드를 통하여 위치 마크, 이미지, 다각형 등의 정보들을 추출할 수 있다.


items.add((getPoint(la, lo), "name"))로 추출된 데이터들을 미리 정의된 안드로이드 구글맵 관련 Overlay 클래스로 전송한다. 코드 중 getPoint 함수로 전달되는 “la”는 위도(Latitude)의 값, “lo”는 경도(Longitude)의 값을 나타내며, 마커를 터치했을 경우 화면상에서 나타나는 마커(현재 시공된 지점의 정보)의 시공 위치에 대한 정보를 담는 "name" 변수도 포함된다. (XML 파싱을 거쳤을 경우)


아래 코드는 각각 생성된 좌표의 정보들을 토대로 화면상에 라인(현재 시공되어 매설된 상수도관)을 생성하여 그려주는 코드이다.


1
2
for(int cnt = 0; cnt < NodePipe.Length; cnt++)
    pipe.add(getPoint(NodePipe.x, NodePipe.y));
cs


본 논문에서 제안한 애플리케이션에서 사용되는 지하매설물은 상수도 관망을 이용하는데 상수도 관망이 매설될 당시의 지리적 특징과 매설 가능 공간에 따라 휘어지는 구간이 발생하기 때문에 여러 좌표를 갖는 것이 불가피하다.


이렇게 전달된 데이터는 ArrayList의 객체에 담기고 overlayItem()과 createItem() 메서드가 데이터들을 리턴하며 실제 안드로이드 구글맵 위에 겹쳐지게 된다.

안드로이드 구글맵 - XML의 파싱 순서와 방법[Android Googlemap] 연동 위한 XmlPullParser 파싱 방법

이처럼 본 논문에서는 실제 시공 구간의 지리적 정보들을 토대로 Android 스마트폰 기반의 애플리케이션을 구현한다.


ps. 출처는 제가 예전에 썼던 논문이며, NDigester란 XML parsing 오픈 소스도 존재하니 다양하게 알아보시면 되겠습니다.


xml 구글맵 관련 글

파이썬, 기상청 xml 데이터 가져와서 날씨 뿌리기 (rss 파싱)

구글어스 KML 파일이란, GoogleMaps의 데이터베이스

구글맵(Google Earth) 구글 위성지도 적용 사례

댓글