Phân tích cấu trúc XML trên Android với SAX Parser

Ngôn ngữ đánh dấu mở rộng (XML) là một chuẩn dữ liệu linh hoạt, cho phép nhà phát triển tự định nghĩa cấu trúc và hỗ trợ truyền tải thông tin độc lập với nền tảng. Trong phát triển ứng dụng Android, việc xử lý định dạng XML xuất hiện thường xuyên. Bên cạnh các phương pháp truyền thống, SAX (Simple API for XML) là một giải pháp tối ưu nhờ cơ chế phân tích dựa trên sự kiện, giúp giảm thiểu tiêu thụ RAM và tăng tốc độ đọc dữ liệu.

Cấu trúc dữ liệu mẫu được sử dụng trong ví dụ này mô tả hệ thống phân cấp từ cấp độ tổng thể xuống các khoa, chuyên ngành và nhóm lớp. Theo quy chuẩn tổ chức dự án Android, tệp XML nên được đặt trong thư mục res/raw để dễ dàng truy xuất thông qua tài nguyên.

<?xml version="1.0" encoding="utf-8"?>
<university>
  <faculty name="Khoa CNTT" code="CS">
    <major name="CNTT ứng dụng" code="CA">
      <classGroup name="Khóa 2010" code="CA10"/>
      <classGroup name="Khóa 2011" code="CA11"/>
    </major>
  </faculty>
  <faculty name="Khoa Điện tử" code="EE">
    <major name="Kỹ thuật điện tử" code="ER">
      <classGroup name="Khóa 2010" code="ER10"/>
    </major>
  </faculty>
</university>

Để ánh xạ cấu trúc XML sang mã nguồn, cần thiết kế bộ lớp mô hình (Model Classes) tương ứng với từng thẻ đóng. Hệ thống này bao gồm 4 lớp chính đại diện cho cấp độ tổng thể, khoa, chuyên ngành và nhóm lớp. Mối quan hệ bao gói giữa các lớp sẽ tuân theo nguyên tắc Composition, giúp quản lý vòng đời và bộ nhớ hiệu quả hơn.

Lớp đại diện cho nút gốc sẽ chịu trách nhiệm lưu trữ danh sách các khoa và cung cấp phương thức thao tác. Dưới đây là cài đặt mẫu cho lớp container cấp cao nhất, được tối ưu hóa theo chuẩn Java hiện đại:

package com.dev.android.sax.model;

import java.util.ArrayList;
import java.util.List;

public class UniversityData {
    public static final String NODE_ROOT = "university";

    // Sử dụng List interface để tăng tính linh hoạt
    private final List<Faculty> facultyList;

    public UniversityData() {
        this.facultyList = new ArrayList<>();
    }

    /**
     * Đăng ký một khoa mới vào danh sách quản lý
     * @param newFaculty đối tượng khoa cần thêm
     */
    public void registerFaculty(Faculty newFaculty) {
        if (newFaculty != null) {
            this.facultyList.add(newFaculty);
        }
    }

    /**
     * Trả về bản sao của danh sách khoa để đảm bảo encapsulation
     * @return danh sách các khoa đã được phân tích
     */
    public List<Faculty> retrieveFaculties() {
        return new ArrayList<>(this.facultyList);
    }
}

Thiết kế này áp dụng nguyên tắc encapsulation chặt chẽ cho tập hợp dữ liệu. Việc sử dụng final cho reference danh sách và trả về defensive copy trong phương thức getter ngăn chặn việc sửa đổi trực tiếp từ bên ngoài, đảm bảo tính toàn vẹn của mô hình đối tượng trong suốt quy trình phân tích sự kiện SAX.

Thẻ: Android SAX XML parsing Java

Đăng vào ngày 27 tháng 6 lúc 22:39