Android 개발/Retrofit, RxJava, RxAndroid, OKHttp

안드로이드에서 Retrofit + SimpleXmlParser 사용하기

Developer88 2016. 12. 26. 23:02
반응형

공공데이터 앱을 만들려고 API를 들여다보면, XML을 다뤄야 하는 경우가 많습니다.

특히나, JSON이 지원된다고 적혀있지만, 어떻게 하면 JSON으로 받을 수 있는지도 나와있지 않는 경우도 종종 있구요;;.

오늘은 이럴때 필요한 XML파싱에 대해서 정리해 보겠습니다.


제가 계속 적용해오고 있는 Retrofit + OKHTTP와 RxAndroid의 조합에 

SimpleXML을 컨버터로 사용해 파싱해 보겠습니다.

참고로, Retrofit은 SimpleXML에 대해서만 컨버터가 제공되고, 

구글에서 추천하는 XMLPullParser에 대해서는 컨버터가 제공되지 않고 있습니다~.


1. XML분석


http://www.w3schools.com/xml/note.xml

에서 제공해주시는 매우 간단한 형태의 xml을 분석해보도록 하겠습니다.


note, to, from, heading, body의 5가지 요소(Element)로 구성되어 있네요.



2. 라이브러리 설정


본격적인 코딩전에 라이브러리 설정부터 하겠습니다.

보통은 dependency에서 검색해서 추가했었지만,

안타깝게도, 직접 코드로 적고, exclude를 추가해줘야 익셉션이 나지 않습니다.

적어도 저의 환경에서는요.(오늘날짜 기준 최신버전 안드로이드스튜디오, RxAndroid 1.2.1, retrofit2, )


더좋은 해결방법을 발견하면 업데이트 하도록 하겠습니다~.

우선은 gradle파일에 직접 아래와 같이 써주셔야 합니다.


compile ('com.squareup.retrofit2:converter-simplexml:2.1.0'){

exclude group: 'stax', module: 'stax-api'

exclude group: 'stax', module: 'stax'

exclude group: 'xpp3', module: 'xpp3'

}



3. Retrofit 컨버터 추가


레트로핏을 빌드하면서 converterFactory()메소드를 사용하여, SimpleXMLConverter를 추가해줍니다.




4. Retrofit Interface정의 


이제 인터페이스를 정의해 볼 차례입니다. GET메소드를 사용하도록 정의하였습니다.




5. XML구조에 맞춰 데이터 클래스 생성하기


참고로, Gson의 경우에 JSON구조에 맞춰서 데이터클래스를 생성했었는데요.

SimpleXML도 이와 유사하게 XML의 구조에 맞춰서 클래스를 만들어주면 됩니다~.

여기에 추가로 Retrofit처럼 Annotation을 사용해서, Root와 Element 를 표시해줍니다.

Root가 뿌리고, Element가 그 아래 요소들로 봐주시면 됩니다. (;; 너무 당연한 말이네요.)

위에 있는 XML이미지 참조해 주세요~.



(길이상 getter와 setter는 화면에 넣지 않았습니다.)



6. JAVA파일에서 호출해 사용하기


이제 retrofit이 자신의 컨버터로 파싱해서 객체를 보내주기 때문에

저희는 그냥 받아오기만 하면됩니다.

단순하게 StringBuffer에 실어서 토스트 팝업으로 보이도록 하였습니다.



어서 XML이 사라지고, JSON으로 대통합되기를 바라는 마음이 많지만, 

우선은 이 조합으로 잘 사용해 보아야 겠네요~.

728x90