안녕하세요. 요새 너무 바빠서 글을 올릴 시간이 없었네요.
이번에는 jericho-android.3.1.jar 를 이용해서 유튜브 홈페이지의 재생목록을 파싱해보도록 하겠습니다.
jericho-android.3.1.jar 파일은 첨부파일에 올려놓을테니 다운받으시고 이클립스에서 Build Path에 추가해주세요.(추가하시는 방법 모르시면 댓글 달아주세요.)
그럼 시작하겠습니다.
우선 제가 파싱하고자 하는곳을 살펴보도록 하겠습니다.
제가 만들어 놓은 재생목록 입니다. 물론 다른 사람의 재생목록도 볼 수 있습니다.
제가 올린 재생목록이 보이는데 이중에서 구름빵 2기에 들어가 보겠습니다.
구름빵 2기 들어가면 다음과 같습니다.
제목과 올린사람 ID 시간등이 보이네요.
여기를 파싱해 보도록 하겠습니다.
유튜브는 파싱을 할려면 다음 주소에 들어가야합니다.
https://gdata.youtube.com/feeds/api/users/kcizzang/playlists
위에 빨간배경 글자는 제 아이디 입니다. 저 부분만 본인 아이디 또는 다른사람 아이디를 입력하시면 됩니다. 우선 제 아이디로 들어갔을때 화면을 보도록 하겠습니다.
위 사진처럼 xml 문서가 보이게 되는데 아까 제가 구름빵 2기를 파싱한다고 했으므로 빨간 상자의 주소에 들어가도록 합니다.
주소는 다음과 같습니다 : https://gdata.youtube.com/feeds/api/playlists/PLjMAs0z8gAZjibk9-Ag9NIOOdPA03D5j-
비슷한 URL 들이 보이는데 https://gdata.youtube.com/feeds/api/playlists/재생목록리스트 <- 이러한 형식의 URL로 접속하셔야 정확한 정보가 보이게 됩니다.
정확하게 들어오셨다면 위 그림과 같은 화면이 나오게 됩니다. 여기에서 우선 저는 제목만 파싱만 해올것이라서 위에 줄친것을 보도록 합니다.
<title type="text">구름빵 2기 26화 홍시의 습관 고치기
이렇게 되어있네요. 위에 title, type, text 를 잊지말고 이제 코딩을 시작하겠습니다.
import java.net.URL; import java.util.ArrayList; import java.util.List; import net.htmlparser.jericho.Element; import net.htmlparser.jericho.HTMLElementName; import net.htmlparser.jericho.Source; import net.htmlparser.jericho.TextExtractor; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends Activity{ TextView textView; // 제목을 표시해줄 텍스트뷰 private static Thread thread = null; String parsing_url; // 파싱해오고자 하는 URL String get_data; // 파싱해서 가져온 데이터를 저장할 스트링 변수 ArrayList<String> array; // get_data 변수의 값을 순차적으로 저장할 배열 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
textView = (TextView)findViewById(R.id.textView1); parsing_url = "https://gdata.youtube.com/feeds/api/playlists/PLjMAs0z8gAZjibk9-Ag9NIOOdPA03D5j-";
Runnable task = new Runnable(){ public void run(){ getData(parsing_url); } };
thread = new Thread(task); thread.start(); // 반드시 쓰레드를 해줘야함 그 이유는 아래에서 설명
try{ thread.join(); // 쓰레드 작업 끝날때까지 다른 작업들은 대기 }catch(Exception e){
} for(int i = 0; i < array.size(); i++){ textView.append(array.get(i) + "\n"); // 쓰레드 작업 끝나면 텍스트뷰에 가져온 데이터를 입력 } }
// 파싱 작업을 하는 메서드 public ArrayList<String> getData(String strURL){ Source source; get_data = ""; array = new ArrayList(); try{ URL url = new URL(strURL); source = new Source(url); // 쓰레드를 사용 안하면 여기에서 예외 발생함 그 이유는 아래에서 설명 Element element = null;
List<Element> list = source.getAllElements(HTMLElementName.TITLE); // title 태그의 엘리먼트 가져옴
for(int i = 0; i < list.size(); i++){ element = list.get(i); String attributevalue = element.getAttributeValue("type"); // title 태그의 속성값이 type을 찾는다 if(attributevalue != null){ if(attributevalue.equalsIgnoreCase("text")){ // type의 값이 text 이면 TextExtractor textExtractor = element.getTextExtractor(); // 해당 문자값을 가져온다 get_data = textExtractor.toString(); // 가져온 값을 스트링으로 변환후 array.add(get_data); // ArrayList에 추가한다 } } } }catch(Exception e){
} return array; // 입력된 배열값을 리턴 }
}
|
끝입니다. 안드로이드 공부한지 얼마안되어서 그런지 소스 정리를 잘 못하겠네요. 이해해주시구요. ㅎㅎ
그럼 실행화면을 한번 볼까요?
예~ 성공적으로 잘 가져오네요.
우선 아까 위에 주석에 보면 쓰레드를 반드시 이용해야한다고 했는데 그 이유는 예전에 안드로이드 진저브레드(2.3버전) 까지는 네트워크 작업을 메인 쓰레드에서 같이 작업이 가능했었습니다.
하지만 아이스크림(4.0버전) 이후부터는 네트워크 작업에 메인쓰레드에서 작업이 안되도록 했습니다.
그래서 반드시 쓰레드를 생성해야 한다는 것입니다.
별거 아닌 이유를 왜 지금 적느냐면 다른데서 구글링 해보면 거의 대부분이 쓰레드를 이용하라는 언급이 없어서 이렇게 저라도 글을 남기고 있습니다.
쓰레드는 여기까지 하고...다음은 처음 그림에서 title, type, text를 유심히 보라고 했었는데 소스 적어놓은데 보면 그 이유가 있습니다. 뭐...어렵지 않으니까 보시면 아~ 하실꺼에요.
혹시 이해안되시거나 궁금한거 있으시면 댓글 달아주시면 성실히 답변 드리도록 하겠습니다. ㅎ
'IT 프로그래밍 > 안드로이드' 카테고리의 다른 글
안드로이드 바탕화면 아이콘 생성하기 (0) | 2014.02.12 |
---|---|
안드로이드 뒤로가기 버튼 더블클릭해서 앱 종료하기 (0) | 2014.02.12 |
안드로이드 ProgressBar 와 Thread (1) | 2014.02.12 |
안드로이드 gravity, layout_gravity 설명 (0) | 2014.02.12 |
안드로이드 리니어 레이아웃 자바코드로 화면 구성하기 (0) | 2014.02.12 |