본문 바로가기

프로그램개발

[Android] RSS 뉴스, XML 파싱하기

[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 를 통하여 직접 볼수 있게 구현 완료 하였다.

 

댓글