1. Phần chuẩn bị

– Tạo 1 project mới hoàn toàn

– Link đọc RSS: Thực hành với https://vnexpress.net/rss/cuoi.rss

– Để chạy được cần khai báo trong manifest của ứng dụng có sử dụng quyền truy cập Internet:

2. Phân tích cấu trúc của RSS

Bạn vào địa chỉ trang Rss ở trên, sau đó hãy kích phải chuột lên màn hình chọn View Page Source (Xem nguồn trang), ở cửa sổ xem nguồn trang mới là dữ liệu thật khi bạn tải về.

Xem nội dung xml của trang Rss

Dựa vào cấu trúc của thẻ ở trên bạn thấy có 6 thẻ con là title, description,pubDate,link,guid,slash:comments. Từ đây có thể xác định một bài viết tin tức sẽ có 6 thuộc tính.

Bước 3: Bắt đầu tạo file DTO

Bạn hãy tạo 1 file DTO trong project đặt tên là TinTuc.java để lưu cấu trúc của bài viết. Ở đây tôi làm ví dụ ngắn gọn với title, description.


public class TinTuc {
    String title;
    String description;


    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
    
}

Bước 4: Tạo file TinTucLoader để phân tích XML

Trong thư mục Project, hãy tạo 1 file là TinTucLoader.java

public class TinTucLoader {
    List<TinTuc> tinTucList = new ArrayList<TinTuc>();
    TinTuc tinTuc;
    String textContent;

    public List<TinTuc> getTinTucList(InputStream inputStream) {
        // nội dung tự viết , tham khảo ví dụ product
        try {
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser parser = factory.newPullParser();
            // truyền nguồn dữ liệu
            parser.setInput(inputStream, null);
            // xác định event type
            int eventType = parser.getEventType();
            while (eventType != XmlPullParser.END_DOCUMENT) {
                // viết code xử lý ở đây
                String tagName = parser.getName();
                Log.d("zzzzz", "Tag name =  " + tagName +
                        ", Độ sâu của thẻ = " + parser.getDepth() + ", event = " + eventType);


                switch (eventType) {
                    case XmlPullParser.START_TAG:
                        // bắt đầu vào 1 thẻ
                        if (tagName.equalsIgnoreCase("item")) {
                            tinTuc = new TinTuc();
                        }
                        break;
                    case XmlPullParser.TEXT:
                        textContent = parser.getText();
                        break;

                    case XmlPullParser.END_TAG:
                        if(tinTuc != null){
                            //
                            if(tagName.equalsIgnoreCase("item")){
                                tinTucList.add(tinTuc);
                            }

                            if (tagName.equalsIgnoreCase("title")){
                                tinTuc.setTitle( textContent );
                            }

                            if (tagName.equalsIgnoreCase("description"))
                            {
                                tinTuc.setDescription( textContent );
                            }

                        }


                        break;
                    default:
                        Log.d("zzzz", "eventType khác: " + eventType + ", tag = " + tagName);
                        break;
                }


                // viết lệnh chuyển event type để vòng lặp không bị treo
                // để ở cuối cùng của lệnh while
                eventType = parser.next();
            }


        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return tinTucList;
    }
}


/* Tham chiếu các EventType
    int START_DOCUMENT = 0;
    int END_DOCUMENT = 1;
    int START_TAG = 2;
    int END_TAG = 3;
    int TEXT = 4;
    int CDSECT = 5;
    int COMMENT = 9;
    int DOCDECL = 10;
    int ENTITY_REF = 6;
    int IGNORABLE_WHITESPACE = 7;
    String NO_NAMESPACE = "";
    int PROCESSING_INSTRUCTION = 8;
     */

Bước 5: Tạo lớp DownloadTinTuc.java để tải nội dung XML từ website chứa RSS

public class DownloadTinTuc extends AsyncTask<String,Void, List<TinTuc>   > {
    MainActivity activity = null;
    public  DownloadTinTuc(MainActivity activity){
        this.activity = activity;
    }

    @Override
    protected List<TinTuc> doInBackground(String... strings) {

        TinTucLoader loader = new TinTucLoader();
        List<TinTuc> list = new ArrayList<TinTuc>();

        // tạo url Connection để tải RSS
        String urlRss = strings[0];

        try {
            URL url = new URL(urlRss);
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.connect();
            if(urlConnection.getResponseCode() ==200){
                // kết nối thành công thì mới lấy luồng dữ liệu
                InputStream inputStream = urlConnection.getInputStream();
                list = loader.getTinTucList( inputStream );

            }


        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


        return list;
    }

    @Override
    protected void onPostExecute(List<TinTuc> tinTucs) {
        super.onPostExecute(tinTucs);

        Log.d("zzzzz", "onPostExecute: số lượng bài viết = " + tinTucs.size());
        for(int i = 0; i< tinTucs.size(); i++){
            Log.d("zzzzz", "Tiêu đề bài viết:  " + tinTucs.get(i).getTitle()  );
        }

        // đổ lên listView thì viết code ở đây
        // ListView lv = activity.findViewById(R.id.lv01);
        // làm tiếp với adapter....


        /*
        quay sang activity viết code thực thi như sau:
         String urlRss = "https://vnexpress.net/rss/cuoi.rss";

        DownloadTinTuc downloadTinTuc = new DownloadTinTuc(MainActivity.this);
        downloadTinTuc.execute(urlRss );
         */


    }
}

Bước 6: Viết code thực hiện tải file ở trong activity

String urlRss = "https://vnexpress.net/rss/cuoi.rss";

DownloadTinTuc downloadTinTuc = new DownloadTinTuc(MainActivity.this);
downloadTinTuc.execute(urlRss );

 

Bước 7: Chạy ứng dụng

Trước khi chạy hãy kiểm tra lại xem đã khai báo quyền sử dụng Internet trong manifest chưa nhé.

Chạy ứng dụng và xem logcat để biết kết quả.

Nếu nhìn thấy danh sách tên bài viết là thành công.

Bạn có thể thực hiện gắn đổ dữ liệu lên ListView bằng cách xử lý code ở trong hàm onPostExecute của lớp DownloadTinTuc.

Tham khảo thêm https://zezo.dev/note/huong-dan-thuc-hanh-xmlpullpaser-doc-du-lieu-tu-file-xml-trong-android 

Tham khảo thêm trong code đính kèm nếu cần.