반응형
HTTP를 통해서 주고 받는 자료의 많은 부분은 XML형식으로 조직화 되어 있다고 합니다.
안드로이드에서는 XML Pull Parser를 제공하여 XML 파일을 파싱합니다.

그럼 네트워크에 있는 XML 파일의 파싱을 한번 해 볼까요?
URL객체를 생성하는 것은 웹에서 자료를 읽어올 때와 다를 것이 없습니다.
XMLPullParserFactory를 이용해 XMLPullParser 객체를 생성하고 URL 객체를 이용해 입력 스트림을 파서에 연결해서 적절한 메서드를 루프에서 반복 호출 하면서 XML 문서를 읽어서 파싱하게 됩니다.

아래 코드에서는 파서가 시작 태그를 만났을 때 (START_TAG)만 동작합니다.
시작 태그를 만났을 때 요소의 특성을 조회하고 비교해서 정보를 로그에 기록합니다.
즉 코드에서는 flickr feeds에서 이미지 URL만 뽑아 로그에 기록합니다.

XMLPullParser 의 next()와 getEventType()이 반확하는 속성들은 다음과 같습니다.
START_TAG : 요소의 시작 태그를 만났을 때 반환 (<tag>)
TEXT : 요소의 텍스트를 만났을 때 반환 (<tag>TEXT</tag>에서 TEXT)
END_TAG : 요소의 종료 태그를 만났을 때 반환 (</tag>)
END_DOCUMENT : XML 파일의 끝에 도달했을 때 반환

package net.bment.net;
import java.net.URL;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class XmlparseActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        TextView status = (TextView)findViewById(R.id.status);
        TextView status1 = (TextView)findViewById(R.id.status1);
        TextView status2 = (TextView)findViewById(R.id.status2);
       
        try {
   URL url = new URL("http://api.flickr.com/services/feeds/photos_public.gne"
     + "?id=26648248@N04&amp;lang=en-us&amp;format=atom");
   
  XmlPullParserFactory parserCreator = XmlPullParserFactory.newInstance();
  XmlPullParser parser = parserCreator.newPullParser();
   
   parser.setInput(url.openStream(), null);
   
   status.setText("파싱 중이에요..");
   int parserEvent = parser.getEventType();
   while (parserEvent != XmlPullParser.END_DOCUMENT){
    switch(parserEvent){
    case XmlPullParser.START_TAG:  //parser가 시작 태그를 만나면 실행
     String tag = parser.getName();
     
     if(tag.compareTo("link") == 0){   
      String relType = parser.getAttributeValue(null, "rel");
      
      if(relType.compareTo("enclosure") == 0){
       String encType = parser.getAttributeValue(null, "type");
       
       if(encType.startsWith("image/")){
        String imageSrc = parser.getAttributeValue(null, "href");
        Log.i("Net", "image source = " + imageSrc); //parser에서 받아 온 값을 Log에 기록
        status1.setText(status1.getText()+ ".");

       }       
      }
     }
     break;
    }
    
    parserEvent = parser.next();
   }
   status2.setText("파싱 끝!");
  } catch(Exception e){
         Log.e("Net", "네트워크 에러가..났습니다...", e);
  }
 }
}


로그에 이미지 파일의 URL이 기록됬습니다.

에뮬레이터에도 제가 코딩한데로 메시지가 뜨는군요^^ 히히

반응형

+ Recent posts