XML을 파싱할 일이 생겨서, 이래저래 만져보다가 작업한 내용을 정리 합니다 :)
1. XML Parsing
Android 에서 제공하는 XmlResourceParser 를 사용하기로 했습니다.
XMLResourceParser는 다른 Java XML Parser들에 비해 성능이 좋은게 특징입니다.
이유인 즉은, 다른 Android XML 파일들 처럼, pre compiled 해서 birnary에 들어 가서 처리 하기 때문입니다.
아래는 간단하게 XML 을 읽어 들이는 코드 입니다.
public Problem parseXML(XmlResourceParser xmlParser) throws Exception { Problem problem = new Problem(); String name = null; while (xmlParser.getEventType() != XmlPullParser.END_DOCUMENT) { if (xmlParser.getEventType() == XmlPullParser.START_TAG) { name = xmlParser.getName(); } else if (xmlParser.getEventType() == XmlPullParser.TEXT) { if (name == null) { Log.d("ProblemDAO-parseXML", "name is null ? error ??"); } } else if (xmlParser.getEventType() == XmlPullParser.END_TAG) { name = null; } xmlParser.next(); } return problem; }
2. XML to Pojo
a. 첫 번째 시도 - if 지옥
자 읽어 들인 XML을 Java Plaiin Object 로 매핑할 차리 인데요.
제일 처음 작업한게 아래와 같은 코드 입니다.
if(name.equalsIgnoreCase("title") == true) { }위와 같은 코드의 문제점은 if/elseif/elseif 지옥이 나타난다는것이죠. :(
그리고, xml 형식등의 변경이 있을때, pojo/xml 이외에 추가로 관리할 곳이 늘어 난다는 점입니다.
b. 두 번째 시도 - Reflection
그래서 생각해낸것이 Java의 Reflection 입니다.
xml element 이름을 pojo 의 setter와 연결시키도록 아래와 같이 코드를 작성하였습니다..
char[] stringArray = name.toCharArray(); stringArray[0] = Character.toUpperCase(stringArray[0]); String methodName = "set"+ new String(stringArray); try { Method m = Problem.class.getMethod(methodName, String.class); m.invoke(problem, text); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); Method m = Problem.class.getMethod(methodName,Integer.class); m.invoke(problem,Integer.valueOf(text)); }
조금 신경 쓴부분이 바로 Setter의 자료형 부분입니다.
m.invoke 가 없는 메소드 인 경우에, NoSouchMethodException을 발생시키기 때문에 이를 캐치하여,
다른 형으로 시도 해보도록 코드를 작성하였습니다.
3. 더 해볼것
추후에, JacksonMapper 등에서 어떻게 json 을 pojo화 시키는지 좀 스터디해보고 좀 더 좋은 방법이 있나 생각해봐야겠습니다 :)