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ề.
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.