Nếu như bạn đã đồng hành từ Series bài viết đầu tiên thì tính tới thời điểm này, chắc chắn là chưa có một bài viết nào trong số mà mình chia sẻ tại đây có ví dụ liên quan tới XML
. Tuy nhiên, như trước đó cũng đã nhắc đến trong bài hướng dẫn về gửi yêu cầu XMLHttpRequest
của Sub-Series JavaScript
thì XML
là một ngôn ngữ sử dụng để mô tả dữ liệu và có cú pháp dạng đánh dấu bằng các thẻ tag
giống như HTML
.
Đây là một ví dụ đơn giản về một tệp .xml
mô tả nội dung về các bìa sách đang được lưu trữ trông thư mục bookstore-manager-java
mà mình đang thực hiện:
<?xml version="1.0" encoding="UTF-8" standalone="yes"
?> <!-- comment --> <table> <record id="000000000" category-id="000000000"> <title> Hrdaya Sutra </title> <author> Buddhism </author> <description> One of the most popular Mahayana Buddhist sutra. </description> </record> <record id="000000001" category-id="000000000"> <title> Yoga Sutra </title> <author> Patanjali </author> <description> One of the most popular Yoga book. </description> </record> </table>
Điểm lưu ý duy nhất, đó là so với HTML
thì ở đây tất cả các tên thẻ và các thuộc tính đều là do chúng ta tự đặt ra để phù hợp với mục đích quản lý dữ liệu. Thay vì cú pháp mô tả các object
dữ liệu ở dạng JSON
thì ở đây chúng ta đang mô tả lại các object
ở dạng: các mảnh thông tin chính được đánh dấu bởi các thẻ và các thông tin bổ sung ở dạng tham chiếu được mô tả bởi các thuộc tính.
Khi nạp nội dung XML
này vào môi trường trình duyệt web thì chúng ta sẽ có thể chuyển về cấu trúc HTML DOM
và thực hiện các thao tác truy vấn, chỉnh sửa, giống như đối với các object HTMLElement
thông thường; Còn đối với các môi trường lập trình khác, ví dụ như Java
ở đây thì chúng ta sẽ có thể có thêm vài lựa chọn mặc định, tùy vào thư viện tiêu chuẩn được cung cấp.
Cụ thể là trong thư viện tiêu chuẩn của Java
có khoảng 6 trình đọc Parser
hỗ trợ chuyển đổi nội dung XML
ở dạng chuỗi thuần sang dạng object
và như vậy chúng ta sẽ có thể thực hiện các thao tác truy xuất tới các giá trị để đọc và chỉnh sửa, sau đó có thể chuyển trở lại về dạng chuỗi thuần để ghi vào tệp tĩnh. Trong khuôn khổ của Sub-Series này thì mình sẽ chỉ tìm hiểu và chia sẻ code ví dụ về trình đọc DOM Parser
để sử dụng cho mini project
đang xây dựng.
import java.io.*;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element; class Main { public static void main (String[] $args) { try { File $file = new File ("../data/book.xml"); Document $document = DocumentBuilderFactory .newInstance () .newDocumentBuilder () .parse ($file); // -- String $rootElmName = $document.getDocumentElement().getNodeName(); System.out.println ("Root element: " + $rootElmName); // -- NodeList $bookNodeList = $document.getElementsByTagName ("record"); App.printBookList ($bookNodeList); } catch (Exception e) { e.printStackTrace (); } } public static void printBookList (NodeList $bookNodeList) throws Exception { for ( int $i = 0; $i < $bookNodeList.getLength (); $i += 1 ) { Node $bookNode = $bookNodeList.item ($i); if ($bookNode.getNodeType() != Node.ELEMENT_NODE) throw new Exception ("Invalid data input"); // -- Element $bookElm = (Element) $bookNode; Main.printBook ($bookElm); } } public static void printBook (Element $bookElm) { String $id = $bookElm.getAttribute("id"); String $title = $bookElm.getElementsByTagName("title").item(0).getTextContent(); String $author = $bookElm.getElementsByTagName("author").item(0).getTextContent(); String $description = $bookElm.getElementsByTagName("description").item(0).getTextContent(); // -- System.out.println ("----------------------------"); System.out.println ("Id : " + $id); System.out.println ("Title : " + $title); System.out.println ("Author : " + $author); System.out.println ("Description : " + $description); } } // -- end class
Ở đây chúng ta có phần tử gốc Root Element
chính là object
đại diện cho tệp book.xml
. Sau đó cấu trúc DOM
bắt đầu với bảng <table>
được đặt trong book
, rồi tiếp đến mới tới các bản ghi <record>
. Vì vậy nên để truy vấn nhanh các phần tử mô phỏng các bản ghi thì chúng ta vẫn sử dụng $document.getElementsByTagName()
.
Đây là điểm tuyệt vời của trình đọc DOM Parser
bởi được xây dựng dựa trên tiêu chuẩn chung của w3c.org
nên có giao diện lập trình tương đồng với DOM API
trong môi trường trình duyệt web. Chúng ta sẽ có thể lướt qua tài liệu tham khảo rất nhanh và có thể bắt đầu sử dụng mà không cần duyệt chi tiết toàn bộ tài liệu trước khi bắt đầu sử dụng.
Root element : book
----------------------------
Id : 000000000
Title : Hrdaya Sutra Author : Buddhism Description : One of the most popular Mahayana Buddhist sutra. ----------------------------
Id : 000000001
Title : Yoga Sutra Author : Patanjali Description : One of the most popular Yoga book.
Các liên kết tham khảo:
javax.xml.parsers.DocumentBuilderFactory
javax.xml.parsers.DocumentBuilder
org.w3c.dom.Document
org.w3c.dom.NodeList
org.w3c.dom.Node
org.w3c.dom.Element
Ok.. như vậy là bây giờ chúng ta đã có thể tự thiết kế một Relational Database
bằng các tệp tĩnh .xml
và code một phần mềm quản lý cái RDB
này giống như khi xây dựng trang blog đơn giản ở Series Tự Học Lập Trình Web đầu tiên nếu cần thiết. Công cụ tiếp theo cần tìm hiểu đó là một framework
được Java
cung cấp sẵn để vẽ giao diện đồ họa người dùng.
(chưa đăng tải) [Object-Oriented + Java] Bài viết #10 - Java Foundation Classes