프로그래밍(~2017)/안드로이드

XmlPullParser 사용시 유의법(규칙)

단세포소년 2011. 9. 22. 03:26
반응형

  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>


생각나는대로 막 적어서 다른분들은 이해하셨을지 모르겠다.. 나 글 정말 못쓴다....

반응형