Parser XML - DOM, SAX, JABX

 

1. DOM

1.1. Giới thiệu

Mô hình đối tượng tài liệu (DOM) là một đề xuất chính thức của World Wide Web Consortium (W3C). Nó định nghĩa một interface cho phép các chương trình truy cập và cập nhật cấu trúc và nội dung của các tài liệu XML.

Khi nào nên sử dụng?

Bạn nên sử dụng trình phân tích cú pháp DOM khi:

  • Bạn cần phải biết rất nhiều về cấu trúc của một tài liệu XML.
  • Bạn cần thao tác với các phần dữ liệu của tài liệu XML (ví dụ: sắp xếp các phần tử nhất định).
  • Bạn cần sử dụng thông tin trong một tài liệu XML nhiều lần.

Bạn nhận được những gì?

Khi bạn phân tích cú pháp một tài liệu XML bằng DOM parser, bạn có được cấu trúc cây chứa tất cả các phần tử của tài liệu XML. DOM cung cấp nhiều chức năng mà bạn có thể sử dụng để kiểm tra nội dung và cấu trúc của tài liệu XML.

Ưu điểm

DOM là một giao diện chung để thao tác cấu trúc tài liệu XML. Một trong những mục tiêu thiết kế của nó là giúp Java code được viết cho một trình phân tích cú pháp tuân thủ DOM sẽ chạy trên bất kỳ trình phân tích cú pháp tuân thủ DOM nào khác mà không phải thực hiện bất kỳ sửa đổi nào.

DOM interface

DOM định nghĩa một số interface. Dưới đây là các interface phổ biến nhất:

  • Node: Kiểu dữ liệu cơ bản của DOM.
  • Element: Phần lớn các đối tượng bạn sẽ xử lý là Elements.
  • Attr: Biểu diễn một thuộc tính của một phần tử.
  • Text: Nội dung thực tế của Element hoặc Attr.
  • Document: Biểu diễn toàn bộ tài liệu XML. Một đối tượng Document thường được gọi là cây DOM.

1.2. Các phương thức DOM phổ biến

Khi bạn làm việc với DOM, có một số phương thức bạn sẽ sử dụng thường xuyên:

  • Document.getDocumentElement(): Trả về phần tử gốc của tài liệu.
  • Node.getFirstChild(): Trả về con đầu tiên của một Node đã cho.
  • Node.getLastChild(): Trả về con cuối của một Node đã cho.
  • Node.getNextSibling(): Phương thức này trả về sibling (anh em) tiếp theo của một Node đã cho.
  • Node.getPreviousSibling(): Phương thức này trả về sibling trước của một Node đã cho.
  • Node.getAttribute(attrName): Đối với một Node đã cho, nó trả về thuộc tính với tên được yêu cầu attrName.

1.3. Áp dụng

Updating ..!

2. SAX

2.1. Giới thiệu

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

2.2. Cách sử dụng

SAX Parser khác với DOM Parser, trình phân tích cú pháp SAX không tải XML hoàn hoàn vào bộ nhớ, thay vào đó nó phân tích cú pháp XML bằng cách kích hoạt các sự kiện khác nhau và khi nó gặp các phần tử khác nhau như: thẻ mở, thẻ đóng, ký tự dữ liệu, comment v.v. Đây là lý do tại sao SAX Parser được gọi là trình phân tích cú pháp dựa trên sự kiện.

Để đọc tài liệu XML với SAX Parser chúng ta cần phải tạo ra một lớp kế thừa lớp DefaultHandler. Lớp DefaultHandler cung cấp các callback khác nhau như sau:

  • startElement(): kích hoạt sự kiện này khi bắt đầu thẻ.
  • endElement(): kích hoạt sự kiện này khi gặp thẻ đóng.
  • characters(): kích hoạt sự kiện này khi nó gặp một số dữ liệu văn bản.

2.3. Áp dụng

Updating ..!

3. JABX

3.1. Giới thiệu

JAXB là từ viết tắt của chữ Java Architecture for XML Binding, nó là một thư viện sử dụng các annotation để chuyển đổi các đối tượng Java sang các nội dung XML và ngược lại. Trong bài viết này, mình sẽ hướng dẫn các bạn chuyển đổi nội dung tập tin XML sang đối tượng Java sử dụng JAXB.

3.2. Cách sử dụng

Một số Annotation được sử dụng trong JAXB:

  • XmlRootElement: là một Annotation, sử dụng để đánh dấu phần tử gốc (root element) của một tài liệu xml.
  • XmlAccessorType: là một Annotation, sử dụng để thông báo với JAXB rằng các trường hoặc thuộc tính sẽ được sử dụng. Các loại XmlAccessType:
  • PUBLIC_MEMBER : là loại AccessType mặc định của Jaxb. Nó sẽ binding các phần tử là public fields, properties, hoặc được đánh dấu xml annotations.
  • PROPERTY : Nó sẽ binding các phần tử được đánh dấu xml annotations hoặc properties.
  • FIELD : Nó sẽ binding các phần tử được đánh dấu xml annotations hoặc fields.
  • NONE : Nó sẽ binding các phần tử được đánh dấu xml annotations.
  • XmlElementWrapper: là một Annotation sử dụng để đánh dấu đây là một phần cha và giá trị của nó là một Collection (có chứa tài liệu xml con).
  • XmlElement: là một Annotation, sử dụng để đánh dấu đây là một phần tử của tài liệu xml.
  • XmlAttribute: là một Annotation, sử dụng để đánh dấu đây là một thuộc tính của phần tử.
  • XmlTransient: là một Annotation, sử dụng để đánh dấu thuộc tính này sẽ được bỏ qua, không nằm trong tài liệu xml. XmlType(propOrder={fieldNames}) : là một Annotation, sử dụng để đánh dấu thứ tự các field trong tài liệu xml.

3.3. Áp dụng

Updating ..!