//구글통계//

티스토리 툴바


[연구]Android2012/05/11 15:44

이번 포스팅은 xmlpullparser로

 

어떻게 xml 파싱을 해오는지에 대해서 설명하도록 하겠습니다.

 

소스 보실때 제가 지금 바로 밑에첨부해놓은 xml 구조 보면서 이해하세요^^

 

 

 

 

 

 

 

try {
      
   
   URL text = new URL(url);
   
   XmlPullParserFactory parserCreator = XmlPullParserFactory  //xmlpullparser객체를 생성하기위해 팩토리클래스의 
     .newInstance();            //newinstance메소드를 이용하여 newpullparset메소드를 통해 객체를 얻어온다
   
   //xml 파싱하기 위해서 풀 파서 쓴다.
   
   XmlPullParser parser = parserCreator.newPullParser(); // XMLPullParser 사용

   parser.setInput(text.openStream(), null);   // 파싱하기위해서 스트림을 열어야한다.

   int parserEvent = parser.getEventType();  // 파싱할 데이터의 타입을 알려준다.
   String tag;

 

   boolean inTitle = false, inTitle2 = false, inTitle3 = false, inTitle4 = false, inTitle5 = false;
   while (parserEvent != XmlPullParser.END_DOCUMENT) { // xml 파일의 문서 끝인가? 
    switch (parserEvent) {
  `
    case XmlPullParser.TEXT:  // xml의 젤왼쪽위에서부터 파싱을시작한다고하면 이 파싱하는부분이 태그안의 값인지 검사하는 case 문입니다. 물론 젤처음은 start Tag 이기때문에 이건 두번째로 실행되겠죠^^ 

     tag = parser.getName();
     if (inTitle) { // StartTag에서 inTitle을 true로 변경시켜줬기때문에 실행됩니다^^
      String max = parser.getText();  // 태그안의값을 가져옵니다.
      nickname.add(max); // 파싱한 값 ArrayList 객체에 추가(밑에도 마찬가지)
     } else if (inTitle2) {
      String max = parser.getText();
      clearnumber.add(max);
     } else if (inTitle3) {
      String max = parser.getText();
      comment.add(max);
     } else if (inTitle4){
      String max = parser.getText();
      date.add(max);
     } else if (inTitle5){
      String max = parser.getText();
      phone.add(max);
     }
     
     break;
     
    case XmlPullParser.END_TAG: // 이부분은 </nick> 여기라고 생각하시면됩니다. (END_TAG) 

     tag = parser.getName();
     if (tag.compareTo("nick") == 0) { 
      inTitle = false; // 다시 inTitle을 false로 바꿔줍니다. (Text에 값을 다시넣는것을 방지하기 위해서)
     } else if (tag.compareTo("cnum") == 0) { // 맞춘수
      inTitle2 = false;
     } else if (tag.compareTo("comment") == 0) { // 하고싶은말
      inTitle3 = false;
     } else if (tag.compareTo("date") == 0) {
      inTitle4 = false;
     } else if (tag.compareTo("phone") == 0) {
      inTitle5 = false;
     }
     
     break;
     
    case XmlPullParser.START_TAG: // <nick> 이런식으로 시작태그인지 확인을 합니다. 시작태그면 실행. 
     tag = parser.getName();
     
     if (tag.compareTo("nick") == 0) { // 태그가 nick 인지 검사, 맞으면 true
      inTitle = true;
     } else if (tag.compareTo("cnum") == 0) {
      inTitle2 = true;
     } else if (tag.compareTo("comment") == 0) {
      inTitle3 = true;
     } else if (tag.compareTo("date") == 0) {
      inTitle4 = true;
     } else if (tag.compareTo("phone") == 0) {
      inTitle5 = true;
     }
     
     break;
    }
    parserEvent = parser.next();
   }
  } catch (Exception e) {
   Log.e("dd", "Error in network call", e);
  }

 

결국 이런식으로 파싱을 통해서 ArrayList의 객체(nickname, comment) 등에 값이 차례대로 들어가게 됩니다^^


저작자 표시
Posted by 매너있는 비매너

마일스톤(MileStone)

일반적으로 이정표라는 뜻으로 사용되지만 회사에서 진행하는 특정 프로젝트와 관련해서는 어떤 중요한 시점이라고 생각하시면 되겠다. 예를 들어 소프트웨어 개발 프로젝트라면 릴리즈 일정이나 알파.베타 버전 릴리즈 일정 어떤 연구와 관련된 것이라면 연구 마감 시한이나 프로시저 완료일 논문 마감일 등 뜻으로 해석하시면 되겠다. 이러한 시점이라는 건 하나만 존해하는 것이 아니고 특정 부서에서 중요한 이슈가 있는 시점들은 모두 마일스톤이라고 해석하셔도 된다.

아래 내용은 게임 개발 관점에서의 마일스톤 적용 예 입니다.


* 애매한 마일스톤 - 독자들도 애매한 마일스톤을 참지 말라는 경고를 받았다. 애매함이야말로 일정의 적이다. 애매한 마일스톤은 프로젝트의 사양서를 명확하게 완성하지 않은 채로 마잀톤과 일정을 만든 결과이기도 하다. 너무 많은 기능을 하나의 마일스톤안에 쑤셔넣는 것은 비생산적이다. 팀은 마일스톤을 완성함으로써 성취감을 얻어야만 한다. 팀은 프로젝트가 얼마나 진전되었는지를 항상 정확하게 알 수 있어야 한다.


* 마일스톤과 작은 마일스톤 - 일반적으로 하나의 마일스톤을 위한 적당한 시간의 길이는 4주에서 8주 정도다. 하지만 새로운 팀이거나 익숙하지 않은 프로젝트에 있어서는 작은 마일스톤이 두 가지의 이유에서 필요하다.(1주) 첫째 맡고 있는 과제의 집중하도록 팀 유지하기. 둘째로 결정적인 시기에 프로젝트 가시성을 증가시키기. 마일스톤은 멈춰 서서 자신의 위치를 체크하는 것이고, 프로젝트는 지도를 그리는 것이 된다. 이것은 ‘균형‘을 맞추는 것이 관건이다.(마일스톤끼리 너무 가까워도 안되고 너무 멀어서도 안된다.) 가장 좋은 규칙은 작은 마일스톤의 양을 팀의 숙련도와 다루고 있는 주제의 친숙도에 맞추라는 것이다.


* 언제 마일스톤을 이용하는가 - 일반적으로 모든 프로그램이나 모듈은 독립적인 프로젝트이며 가장 간단한 프로그램을 제외하고는 모든 것을 각각의 프로젝트로서 상세히 기술하고, 프로그래밍하고, 문서화해야 한다.


* 마일스톤을 정확하게 만들기 - 일정의 정확성을 증가시키려면 최대한으로 불확실한 요소를 제거해야 한다. 불확실한 요소를 최소화하기 위한 한가지 방법은 마일스톤의 애매함을 피하는데에 전력을 기울이는 것이다. 하나의 예로 상호간의 오해와 정확한 필요 사항에 대한 불충분한 설명도 불확정한 요소로서 개발에 방해가 된다. 어떤 때는 마감시한이 마케팅 부서의 요구에 따라 결정되는데 이것은 사실상 거의 불가능하다.(마케팅 부서야 말로 데드라인을 결정하기에 가장 자격이 동떨어진 부서이다.) 만약 데드라인을 지키려고 하자면 기획했던 부분의 기능을 줄여서 발매할 수도 있다.

+표. 처음 세가지 마일스톤

마일스톤

체크포인트

Task

1

1.0

일반적 요구 사항 조사

1.1

기술적 요구 사항 조사

1.2

필요한 리소스 구하기

2

2.0

일반적 실현 가능서 연구

2.1

기술적 실현 가능성 연구

2.2

리소스 가용성 연구

3

3.0

기초 아키텍처 사양서

3.1

프로젝트 초기화

이 초기 마일스톤은 결정권을 가진 사람이 프로젝트를 취소할지, 아니면 다음 마일스톤으로 진행할지 결정할 수 있는 적절한 위치에 있다. 세 번째 마일스톤까지 마치고 프로젝트 진행이 허가되면, 완성할 때까지 돌진만이 있을 뿐이다. 만약 다 통과했던 프로젝트가 취소된다면 실현 가능성 연구와 조사 과정에서 잘못이 있었던 것이다. 프로젝트가 취소가 되는 경우에는 프로토타입일 경우에 취소되는 경우는 그나마 괜찮지만, 프로젝트를 진행해 온 기간이 긴 경우일수록 팀원의 사기에 끼치는 영향이 크다. (프로토타입이란 정확히 ‘대충 만든 일회용품’ 이라는 의미여야 한다.)


+1. 체크 포인트 1.0 일반적 요구 사항 조사

-> 우리가 프로젝트가 무엇인가? - 명백히 이것 제작하기 위한 개발툴이다. 어떤 종류의 게임을 만들 것인지 확실하게 해야 한다.


-> ‘고객‘은 어떤 기능을 원하는가? - 첫 고객은 회사 경영진이고, 두 번째는 유통사, 세 번째는 언론매체, 마지막이 게임을 구매하는 대중. 이들 그룹은 각각이 요구를 가지고 있지만, 같은 욕구를 가지고 있진 않다. 경영진, 유통사는 시연과 프리뷰, 언론은 프리뷰 버전, 유저들은 최종 결과물을 원한다.


-> 필요한 최소 기능은 무엇인가? - 놀랍게도 가장 중요하게 고려해야 할 것은 최소 기능 부분이다. 최저 기능 단계가 시판에 필요한 최소 사양을 결정한다. 적어도 핵심 기능은 작동한다. 이 단계에 도달하는 것이 최우선 목표다. 이 단계에서 프로젝트에 필요한 모든 정보를 모아야 한다. 이것이 전체 프로젝트의 일반 지침이 될 것이다. (개요)



+2. 체크 포인트 1.1 기술적 요구 사항 조사

-> 어떤 기술과 과정이 필요한가? - 이상적인 상황은 모든 컴포넌트가 개발되어 있는 것이다. 연구가 필요하다면 프로젝트는 프로토타입 단계를 넘어갈 수 없다. 연구가 끝날 때까지 프로젝트의 진행을 일단 정지시킬 것을 심각하게 고려해야만 한다.


+3. 체크 포인트 1.2 필요한 리소스 구하기

-> 프로젝트에 필요한 자원은 어떤 것들인가? - 프로젝트를 완성하기 위해 필요한 것들 중, 아직 구하지 못한 소프트웨어와 인쇄물의 목록을 준비하라.


+4. 체크 포인트 2.0 일반적 실현 가능성 연구

-> 가치가 있는 프로젝트인가? - 게임플레이와 스토리를 연구하고 다듬어야 한다. 낡은 아이디어를 버리고 새로운 아이디어를 찾아내는 것이다

-> 이런 게임이 통할 만큼 시장이 성숙되었는가? - 게임이 지금의 시장에 맞는가? 이것이 게임이 이미 존재하는 것의 복사물이어야 한다는 뜻은 아니다. 만약 게임이 현존하는 장르의 확장이라면 디자이너의 일은 조금 더 쉬워질 것이다. 하지만 이것이 주가 요소의 목록을 뜻하는 것이 아니라 그 장르 자체를 발전시킬만한 것이어야 한다. 현존하고 있는 장르의 게임을 낼 때는 재미있는 내용을 보강하려고 해야 한다. 상상력을 활용하라. 할 수 있는 모든 방법을 활용해서 디자인에 쓸 생각과 의견을 모아라.


+5. 체크 포인트 2.1 기술적 실현 가능성 연구

->최소 사양은 어떠한가? - 기본적인 사양을 생각할 때는 2,3년 전의 기술도 고려해야 한다. 모든 사람이 항상 최고의 컴퓨터를 가지고 있는 것이 아니기 때문에.


+6. 체크 포인트 2.2 가용 자원 연구 - 체크 포인트 2.2의 목적은 이전 체크포인트의 결과를 통합정리하고, 프로젝트 그룹에 필요한 인원을 정하는 것이다.


+7. 체크 포인트 3.0 아키텍처 사양서 초안 - 우선 알아야 할 것은 아키텍처는 진화하는 생물이라는 점이다.(80/20 규칙) 아키텍처가 80% 정도 완성되었다고 생각되면 프로젝트를 진행한다. 나머지 20%는 프로젝트 진행 도중에 완성될 것이다.


+8. 체크 포인트 3.1 프로젝트 초기화 - 80% 정도 완결된 아키텍처라면 예비 일정을 만들기에 충분하다. 개발은 임계 경로 문제의 최소값을 찾기 위해 조직되는 독립적인 작업이 복잡하게 얽혀 있는 것이다. 중요한 점은 이것은 프로젝트의 진행 과정을 끊임없이 추적하는 과정이라는 점이다. 배로 항해할 때에는 목적지에 거의 다 와서야 방향을 트는 것보다 항해 도중에 항로를 조금씩 수정하는 것이 훨신 더 낫다.


* 마일스톤 정하기 - 전형적인 게임 프로젝트는 여러 가지 하위 프로젝트로 분할할 수 있다. 각 하위 프로젝트는 상호 의존성과(보다 세세한 부분에서의) 내부 의존성을 갖는다. 거대한 프로젝트는 마일스톤으로 나누어져야 한다. 기능들이 정확히 정의 되어 있다면 어려운일은 아니지만 이에 도달하기 위해서 주변을 잘라내어 마일스톤을 만드는 일은 피해야 한다.

저작자 표시

'[연구]성공적인App.기획' 카테고리의 다른 글

마일스톤(MileStone)이란?  (0) 2012/05/11
카리스마 리더와 서번트 리더  (0) 2012/04/25
Posted by 매너있는 비매너



이번 예제는 URL을 이용하여 HTTP커넥션을 맺어

해당사이트의 HTML 태그를 긁어오는 예제입니다.

커넥션을 맺어주고 그 커넥션 객체를 스트림으로 연결하여

InputStreamReader로 ReadLine하면 됩니다.

긁어오는 시간이 조금 걸려 그동안 프로그래씨브다이얼로그를 표현하게 해줬습니다.


핸들러를 활용하였고, 쓰레드를 활용하였습니다.

주석처리 했으니 필요하신분들은 카피앤 페이스트 해서 쓰시면 됩니다.


package com.htmldown2;


import java.io.*;

import java.net.*;


import android.app.*;

import android.os.*;

import android.view.*;

import android.view.View.OnClickListener;

import android.widget.*;


public class HtmlDown2Activity extends Activity implements OnClickListener {

    /** Called when the activity is first created. */

ProgressDialog mProgress;  //프로그래씨브다이얼로그

DownThread mThread; //쓰레드 클래스 참조변수 선언

TextView txt;

Button btn;

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        

        txt = (TextView)findViewById(R.id.textView1);

        btn = (Button)findViewById(R.id.button1);

        

        btn.setOnClickListener(this);

    }

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

mProgress = ProgressDialog.show(this, "기다리세요.", "다운로드중..."); //프로그래씨브 다이얼로그 객체 생성과 동시에 셋팅

mThread = new DownThread("http://www.google.com"); //쓰레드 객체 생성과 동시에 파라미터로 주소값 전달

mThread.start(); //쓰레드 실행

}

class DownThread extends Thread{ //백그라운드 작업을 위한 쓰레드

String mAddr;

String mResult;

public DownThread(String addr) { //파라미터로 주소값 받기

// TODO Auto-generated constructor stub

mAddr = addr;

mResult = ""; //스트링 변수 초기화

}

@Override

public void run() { //쓰레드 시작

// TODO Auto-generated method stub

StringBuilder html = new StringBuilder(); //문자열을 붙이기 위한 스트링빌더

try {

URL url = new URL(mAddr); //url을 통해서 http 커넥션을 맺는 부분

HttpURLConnection conn = (HttpURLConnection)url.openConnection();

if(conn != null) {

conn.setConnectTimeout(10000);

conn.setUseCaches(false);

if(conn.getResponseCode() == HttpURLConnection.HTTP_OK) {

BufferedReader br = new BufferedReader(new  InputStreamReader(conn.getInputStream())); //커넥션 객체로부터 스트림을 얻어온다.

for(;;) {

String line = br.readLine(); //스트림으로부터 줄 단위로 읽어오기

if(line == null)break; //줄의 끝을 만났을때 널일때 break;

html.append(line + '\n'); //계속 스트링 이어붙이기

}

br.close(); //스트림 객체 닫기

mResult = html.toString(); //스트링변수에 html에 있는 스트링빌더의 값을 toString함.

}

conn.disconnect(); //http 커넥션 해제

}

}catch(Exception e) {}

mAfterDown.sendEmptyMessage(0); //핸들러 호출

}

}

Handler mAfterDown = new Handler() { //쓰레드가 끝나믄 핸들러 실행 

@Override

public void handleMessage(Message msg) {

// TODO Auto-generated method stub

mProgress.dismiss(); //다이얼로그 닫기

txt.setText(mThread.mResult); //문자열 텍스트뷰에 출력

}

};

}

저작자 표시
Posted by 매너있는 비매너