본문 바로가기

프로젝트 수행/진욱아야식사와

[나름 테크노트] xStream으로 XML을 쉽게 쉽게!!

'맵로그'를 만드는 중에 제가 맡은 부분인 GPS 경로 Parsing을 하다보니

XML을 쓸 일이 많았습니다.

Maplog ver 0.2.0까지는 그냥 while문을 돌면서

"줄파싱" 을 했었는데 -_-;;;;;

(이것 참 부끄러워서 줄파싱 소스는 공개할 수 가 없습니다 ㅠ_ㅠ)

우선 첫째로는 XML을 쓰면서 줄파싱 + Substr 콤보를 쓰면 안된다는 양심의 호소-_-

그리고 비록 인턴 나부랭이 이지만

'나름 개발자' (뭐 저야 개발새발할때의 그 개발자-_-이지만요)로서의 자존심? 가오? 간지? +_+

그래서 Xstream을 써보기로 했습니다 +_+

사용자 삽입 이미지

http://xstream.codehaus.org/index.html


두둥!!!

xstream 홈페이지에 가면 2분 튜토리얼 이라는게 있는데

엄청 잘 써놨습니다. 그러나, 제가 필요한 방법으로는

쓸 수가 없다는 단점이 ㅠ_ㅠ


그럼 제가 썼던 방법대로 설명을 하도록 하겠습니다.

우선 타겟이 될 XML 형식을 분석해야 하는데요

아래와 같은 파일을 읽어와서 파싱을 해보도록 하겠습니다.
사용자 삽입 이미지

장담은 못하지만 클릭하면 크게 나올수도 있습니다.


우선 가장 먼저 할 일은 위의 XML구조대로 클래스를 만드는 것입니다.

원래는 각 노드별로 클래스를 만들어야 되는데

(대충 봐도 위의 파일을 파싱하려면 클래스만 대여섯개 만들어야겠죠?)

클래스가 너무 많아지면 복잡해지니까..

아래와 같은 꽁수를 씁니다~

사용자 삽입 이미지

바로 inner class를 사용하는 것인데요. 이렇게 하면 하나의 XML파일당 하나의 클래스만

만들면 되니까 소스가 깔끔해지겠죠?+_+

Tutorial에는 getter와 setter를 쓸 필요도 없고 private이던 public이던

아무 상관이 없다고 하지만 그래도 예의상 적어줬습니다! >ㅇ<

---------------------------------

그런데 위에 빨간색 XML을 다시 살펴보면

trkseg 속의 "trkpt" (트랙 포인트)는 여러번 반복이 됩니다.

(이부분이 xstream의 웹페이지의 튜토리얼에 잘 나와있지 않습니다 ㅠ_ㅠ)


private List<Trkpt> trkseg = new ArrayList<Trkpt>();



이럴때는 위에서 보이는 것처럼 리스트를 쓰면 되는데

중요한 점은 new ArrayList 뒤에 <Trkpt>와 마찬가지로 형식을 지정해 줘야 한다는점!! >ㅇ<

(이게 안나와 있어서 한참을 고생했습니다 ㅠㅠ)

이제는 위에서 설정한 클래스를 어떻게 쓰는지 알아봅시다!!!  ;ㅇ;

사용자 삽입 이미지

파일을 읽어와서... 저렇게 쓰면 되요 =_= 간단하죠??

attribute로 되어있는 "lat" 과 "lon"은 useAttributeFor 라는 메소드를 사용하면 되구요

(밑에있는 registerConverter는 신경스지 않아도 됩니다.)


그리고 바로

xstream.fromXML(fis);

(fis 는 file input stream의 준말입죠^^) 를 사용하시면 

Gpx 형식의 xml이 툭 튀어나와서 myGpx속에 담기게 됩니다 +_+

생각보다 쉽죠?+_+

그럼 다음시간에는 XStream을 이용한 XML 형식변환을 해보도록 하겠습니다 !!
^^