[Android] RSS 뉴스, XML 파싱하기
RSS는
업데이트가 빈번한 웹사이트의 정보를 사용자에게 보다 쉽게 제공하기 위하여 만들어진
XML 기반의 콘텐츠 배급 포맷을 말한다.
DAUM 사이트의 뉴스 RSS 를 호출한 화면이다.
필요한 최소한의 정보만 목록처럼 나열된다.
RSS의 최고 장점은 사이트의 불필요한 광고를 안봐도 된다는 것이다.
구현
AndroidManifest.xml 에 android.permission.INTERNET 퍼미션을 넣는다.
<uses-permission android:name="android.permission.INTERNET" />
Acvity 에서 AsyncTask 를 이용하여 RSS News 를 읽어와서
ListView 로 표시해주고 해당 News 를 볼수 있게 Webview Activity 로 연동되도록 한다.
public class MainActivity extends AppCompatActivity {
private ListView mainListView;
private MainListAdapter listAdapter;
private ArrayList<ParsingData> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getRSS(); // RSS 호출
// 리스트뷰에 RSS 값들을 표시한다.
// 읽어온 News 를 선택하면 웹뷰로 동작하게 설정한다.
mainListView = (ListView) findViewById(R.id.list_view);
listAdapter = new MainListAdapter(this, list);
mainListView.setAdapter(listAdapter);
mainListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Intent intent = new Intent(MainActivity.this, WebViewActivity.class);
intent.putExtra("url", list.get(i).getD_link());
startActivity(intent);
}
});
}
private void getRSS() {
// AsyncTask 를 이용하여 RSS News 를 읽어온다.
XMLParsing vp = new XMLParsing();
list = vp.getData();
}
}
RSS의 TAG 값의 의미를 먼저 파악하자.
<item>과 </item> 은 뉴스 한개의 TAG를 나타낸다.
파란색 <title>과 </title> 사이의 문자열은 News 의 제목이다.
public class XMLParsing extends AsyncTask<Object, Object, ArrayList<ParsingData>> {
// News RSS 주소
private String URL = "https://media.daum.net/syndication/today_sisa.rss";
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected ArrayList<ParsingData> doInBackground(Object... params) {
ArrayList<ParsingData> list = new ArrayList<ParsingData>();
try {
URL url = new URL(URL);
// RSS의 값들을 XmlParser 를 통하여 가져온다.
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
BufferedInputStream bis = new BufferedInputStream(url.openStream());
parser.setInput(bis,null);
String tag="";
.............
boolean isItemTag = false;
// getEventType()는
// 문서 시작/끝, 태그 시작/끝, 태그의 내용을 표시하는 값을 표시한다.
int parserEvent = parser.getEventType();
while (parserEvent != XmlPullParser.END_DOCUMENT) { //문서가 끝날때까지 동작해라.
switch (parserEvent) {
case XmlPullParser.START_TAG: // TAG 시작. 예시) <title> 태그
tag = parser.getName();
if(tag.equals("item")){ // news 들만 가져오기 위한 boolean 확인
isItemTag = true;
}
break;
case XmlPullParser.TEXT: // TAG 안의 문자열. 예시) <title> 과 </title> 사이의 문자열
if(isItemTag) {
if (tag.equals("title")) { // title TAG 확인
title = parser.getText();
}
if (tag.equals("link")) { // link TAG 확인
link = parser.getText();
}
if (tag.equals("description")) { // description TAG 확인
description = parser.getText();
}
if (tag.equals("dc:date")) { // dc:date TAG 확인
time = parser.getText();
}
}
break;
case XmlPullParser.END_TAG: // TAG 종료. 예시) </title> 태그
tag = parser.getName();
if(tag.equals("item")){ // news 태그 종료확인
list.add(new ParsingData(title, link, description, time)); // 한개의 news 를 저장
title ="";
link ="";
description ="";
time ="";
isItemTag = false;
}
tag = ""; // tag 값 초기화 하자
break;
}
// 다음 TAG 로 이동
// 예시) </title>의 다음 Tag 인 <link>로 이동.
parserEvent = parser.next();
}
} catch (Exception e) {
Log.d("rss_ Exception==", ""+e);
}
return list;
}
@Override
protected void onPostExecute(ArrayList<ParsingData> parsingDatas) {
super.onPostExecute(parsingDatas);
}
// AsyncTask 실행하여 RSS 의 내용을 읽어오는 함수
public ArrayList<ParsingData> getData() {
ArrayList<ParsingData> list = new ArrayList<ParsingData>();
try {
list = execute().get();
} catch (InterruptedException e) {
} catch (ExecutionException e) {}
return list;
}
}
주석에서와 같이
While 문은 가져온 문서의 마지막 부분까지 Tag 단위로 이동하도록 되어있다.
Tag 단위로 이동하면서 불필요한 값은 버리고 필요한 값만 골라서 저장하자.
실행 화면
RSS 사이트에서 읽어들인 News 들을 ListView 를 통하여 표시되도록 하였고
해당 뉴스를 선택시 WebView 를 통하여 직접 볼수 있게 구현 완료 하였다.
'프로그램개발' 카테고리의 다른 글
[Android] 화면 자동 회전 On/Off (0) | 2020.04.09 |
---|---|
[Android] 다른 앱 위에 그리기 (With Service, Overlay View) (8) | 2020.03.26 |
[Android] Android Studio에서 기기 화면 캡쳐하기 (0) | 2020.03.17 |
[Android] ListView 새로고침/갱신하기 (with BaseAdapter) (0) | 2020.02.17 |