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화 시키는지 좀 스터디해보고 좀 더  좋은 방법이 있나 생각해봐야겠습니다 :)

+ Recent posts