Phân biệt DOM và SAX parser XML trong Java

Lời nói đầu

Bài viết này được viết dành cho những người phát triển đã hiểu những khái niệm cơ bản về XML (cấu trúc và bản chất thẻ của một tài liệu XML) và còn băn khoăn hoặc chưa biết về việc lựa chọn 1 phương pháp để đọc và phân tích XML bằng cách sử dụng DOM (Document Object Model) hay SAX (Simple API XML).

Câu hỏi về sự khác biệt giữa DOM và SAX Parser là một câu hỏi rất phổ biến trong các cuộc phỏng vấn về Java. Cả DOM và SAX đều được sử dụng rộng rãi để đọc và phân tích cú pháp tập tin XML trong Java, với những ưu thế, đặc điểm riêng mà tôi sẽ giới thiệu đến trong bài viết này.

DOM là gì ?

  • DOM (Document Object Model) là nền tảng của XML. Các tài liệu XML có một cấu trúc thứ bậc của các đơn vị thông tin được gọi là node; DOM là một cách để mô tả các node của nó và mối quan hệ giữa chúng với nhau.

  • Một DOM document là một tập hợp gồm các node hoặc các phần thông tin được tổ chức trong một cấu trúc có thứ bậc. Cấu trúc này cho phép một lập trình viên điều hướng qua cấu trúc cây để tìm kiếm thông tin cụ thể. Bởi vì, nó được dựa trên một cấu trúc thông tin có thứ bậc, DOM được xem như là Tree Based.

  • Với một tài liệu XML, mô hình DOM sẽ duyệt và chuyển nó thành một mô hình cây của các Object .Ví dụ một element tương ứng với một Object element , một thuộc tính tương ứng với một Object thuộc tính, các Object này được tạo ra trong bộ nhớ (memory) và có cấu trúc cây .Chính vì vậy mà có thể rà soát tài liệu XML này bằng cách rà soát trên các Object trong bộ nhớ .Và có thể thêm bớt các thông tin, object để tạo ra một tài liệu XML mới hoặc một sản phẩm mới ...

  • Nói cách khác, DOM là một API mà cho phép một lập trình viên có thể thêm, chỉnh sửa, di chuyển, hoặc xóa các node trong cây XML tại bất kỳ điểm nào để tạo một ứng dụng.

SAX là gì ?

  • SAX là một API thuộc JAXP, nó cho phép xây dựng các ứng dụng truy xuất, phân tích các tài liệu XML theo cơ chế tuần tự và hướng sự kiện.

  • Không như DOM, SAX phân tích dựa vào khái niệm sự kiện và phản hồi sự kiện, SAX không tạo ra một hình thức đại diện của tài liệu XML trong bộ nhớ, và cũng không sử dụng đối tượng để mô tả các thành phần trong file XML như DOM, thay vào đó, nó sử dụng các phương thức callback của đối tượng org.xml.sax.helpers.DefaultHandler để đọc tập tin XML từ trên xuống dưới, và chỉ ghi nhớ cấu trúc nhiệm vụ đang thi hành trên bộ nhớ, vì thế nó hoạt động nhanh hơn, ít tốn bộ nhớ hơn.

  • Xử lý dữ liệu ngay khi quá trình phân tích chưa xử lý xong toàn bộ tài liệu XML, dữ liệu sẽ được gửi đi thông qua các hàm Notification Method và sẽ bị xóa ngay sau đó, do đó SAX không thích hợp với các ứng dụng truy xuất ngẫu nhiên và thực hiện chỉnh sửa phức tạp.

  • Khi SAX parser đã đi qua 1 element thì không thể quay trở lại element đó được nữa nên nếu cần lấy thông tin từ 1 element nhiều lần thì vẫn cần lưu thông tin đó trong bộ nhớ.

Khác biệt giữa DOM và SAX parser:

  • DOM phân tích XML thông qua các Node trong Tree trong khi SAX thì dựa vào sự kiện và phản hồi sự kiện.
  • DOM lưu và parse toàn bộ dữ liệu XML trong bộ nhớ trước khi parse trong khi SAX chỉ lưu một phần nhỏ, parse cho đến khi bạn dừng và xóa ngay sau khi gửi đi.
  • DOM dễ sử dụng, không hạn chế về số lần thao tác trên một phần tử của DOM tree(Dễ dàng chuyển hướng), SAX thì phức tạp hơn và chỉ duyệt qua 1 lần các phần tử.
  • SAX thích hợp hơn cho việc parse các file XML có kích thước lớn, vì không yêu cầu về bộ nhớ quá cao.
  • DOM có thể đọc và ghi trên file XML trong khi SAX chỉ có thể đọc.
  • DOM run time chậm hơn trong khi SAX nhanh hơn.

Sử dụng DOM hay SAX

  • DOM thích hợp với những tập tin XML nhỏ hay cần nhiều các thao tác dữ liệu, cho phép bạn truy cập vào bất kỳ phần nào của tài liệu liên tục và cho phép bạn chỉnh sửa các cây DOM.
  • Với SAX, lại thích hợp với dữ liệu đầu vào lớn, hơn thế nữa, nó chạy nhanh hơn và dễ dàng hơn để tìm hiểu hơn DOM vì API của nó là thực sự đơn giản. Nhưng từ quan điểm chức năng, nó cung cấp ít các chức năng hơn, người dùng phải tự "chăm sóc" nhiều hơn, chẳng hạn như tạo ra các cấu trúc dữ liệu của họ.

Tôi nghĩ câu trả lời thực sự phụ thuộc vào đặc điểm của ứng dụng và yêu cầu hiện tại của bạn.

Bài viết được thực hiện trong thời gian tìm hiểu ngắn, với tài liệu tổng hợp từ nhiều trang, cộng với hiểu biết hạn chế của bản thân, chắc chắn sẽ còn nhiều sai sót, hy vọng bạn đọc thông cảm và có những góp ý chân thành để giúp mình cải thiện chất lượng bài đăng.