XmlPullParserFactory parserCreator = XmlPullParserFactory.newInstance();
XmlPullParser parser = parserCreator.newPullParser();
parser.setInput(xmlInput, "utf-8");
parser.next();
int parserEvent = parser.getEventType();
while(parserEvent !=XmlPullParser.END_DOCUMENT)
{
switch(parserEvent)
{
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG:
break;
case XmlPullParser.END_TAG:
break;
case XmlPullParser.TEXT:
break;
}
parserEvent=parser.next();
}
이게 기본 뼈대이다.
XmlPullParser 는 문서를 순차적으로 읽으며 이벤트를 발생시킨다.
START_DOCUMENT 이벤트는 문서의 시작을
END_DOCUMENT 은 문서의 끝을
START_TAG는 태그의 시작을 (예 : <data> )
END_TAG는 태그의 끝을 (예 : </data> )
TEXT는 태그의 시작과 끝 사이에서 나타난다. (예 : <data>여기서 TEXT 이벤트 발생</data> )
XmlPullParser는 순차적으로 문서를 읽어가면서 이벤트를 발생시키므로 뒤로 돌아가지 못하는 문제가 있다.
그래서 이를 해결하기 위해
XmlPullParser.START_TAG 이벤트가 발생하면 임시변수(String)에 Tag값을 저장하고
XmlPullParser.TEXT이벤트에서 임시변수에 저장된 Tag값을 확인하여 적절한 변수에 값을 넣어야한다.
주의 : XmlPullParser.START_TAG와 XmlPullParser.END_TAG 에서는 getName()을 사용하여야 하고 XmlPullParser.TEXT에서는 getText()를 사용하여야한다. 그렇지 않으면 null값을 반환한다.
XmlPullParser.TEXT 이벤트는 태그의 택스트 영역에 문자가 존재하지 않아도 발생한다.
< data attribute=1 >text</data> 이와 같이 태그 안에 속성이 존재할때는 XmlPullParser.START_TAG 이벤트가 발생했을 때 속성 값을 추출하라.
예제
String preName=null; //임시변수 생성
int parserEvent = parser.getEventType();
while(parserEvent !=XmlPullParser.END_DOCUMENT)
{
switch(parserEvent)
{
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG:
preName = parser.getName(); //임시변수에 Tag값 저장
if(preName.equalsIgnoreCase("data"))
{
paw = new PlotAndWeather();
}
break;
case XmlPullParser.END_TAG:
preName = null; // Tag 가 끝나면 임시변수에 null값으로 초기화
break;
case XmlPullParser.TEXT: // TEXT 이벤트에서 임시변수에 저장된 문자열을 확인하여 적절한 객체에 저장
if(preName==null) //혹시 preName이 null일수 있으니 처리
{
}
else if(preName.equalsIgnoreCase("time"))
{
paw.setTime(parser.getText());
}else if(preName.equalsIgnoreCase("plotName"))
{
paw.setPlotName(parser.getText());
}
break;
}
parserEvent=parser.next();
}
만약
<data>야울</data> 가 있다면 XmlPullParser.START_TAG,XmlPullParser.TEXT,XmlPullParser.END_TAG 가 순차적으로 발생한다.
< data></data> 인 경우에도 택스트가 없지만 XmlPullParser.START_TAG,XmlPullParser.TEXT,XmlPullParser.END_TAG 가 순차적으로 발생한다
만약 <data><data1>text</data1></data> 인 경우 START_TAG,TEXT,START_TAG,TEXT,END_TAG ,END_TAG 이렇게 발생한다.
정리 :
1. XmlPullParser 는 문서를 순차적으로 읽으면서 이벤트를 발생시키므로 뒤로 가지 못한다. 따라서 XmlPullParser.START_TAG 발생시 임시변수를 선언하여 Tag값을 저장한다.
2. TEXT 이벤트시 임시변수에 저장된 Tag값을 확인하여 XmlPullParser.TEXT 이벤트가 발생한 위치(태그)가 어디인지를 구분하고 적절하게 대처한다.
3. XmlPullParser.END_TAG 에서는 임시변수를 초기화(null) 시킨다.
4. XmlPullParser.START_TAG 와 XmlPullParser.END_TAG 이벤트에서는 getName() 메소드를 사용한다. getText()사용시 null반환
5. XmlPullParser.TEXT 이벤트시에는 getText() 메소드를 사용한다. getName()사용시 null반환
6. XmlPullParser.TEXT 이벤트는 텍스트가 존재하지 않아도 발생한다. 예) <data></data>
7. 태그 내에 존재하는 속성값은 XmlPullParser.START_TAG 이벤트시 추출하자. 예) <data size=100>test</data>
생각나는대로 막 적어서 다른분들은 이해하셨을지 모르겠다.. 나 글 정말 못쓴다....
'프로그래밍 > 안드로이드' 카테고리의 다른 글
안드로이드 - php를 이용한 gcm 푸시 예제[1] (0) | 2013.12.25 |
---|---|
안드로이드 - 원하는 theme로 widget 생성하기 (0) | 2013.12.22 |
안드로이드 - GCM이용시 com.google.android.gms import 에러 해결법 (2) | 2013.12.22 |
안드로이드 - GCM 활용해서 푸시 메세지 전송기 (0) | 2013.12.22 |
안드로이드 - ImageDownloader 분석 (0) | 2013.12.07 |
안드로이드/Android AsyncTask 사용법 (0) | 2013.12.07 |
안드로이드 - listView 항목에 Audio Albumart(thumbnail)을 지연 없이 나타내기 LinkedHashMap과 SoftReference사용 [캐시 처리] (0) | 2013.12.07 |
안드로이드 - HashMap,HashTable,LinkedHashMap,ConcurrentHashMap (0) | 2013.12.05 |