DOM (Document Object Model) là tập hợp những interface của Java giúp chúng ta có thể dễ dàng truy cập và chỉnh sửa cấu trúc, nội dung của một tập tin XML. Trong bài viết này, chúng ta sẽ tìm hiểu làm thế nào để đọc tập tin XML sử dụng DOM trong Java các bạn nhé!
Đầu tiên, mình sẽ liệt kê một số interface mà chúng ta thường dùng khi làm việc với DOM:
- org.w3c.dom.Document
- org.w3c.dom.Node
- org.w3c.dom.Element
- org.w3c.dom.Attr
- org.w3c.dom.Text
Mỗi một interface này sẽ có một hoặc nhiều class khác nhau implement nó tuỳ theo cấu trúc của nội dung XML mà chúng ta cần process các bạn nhé!
Tiếp theo, mình sẽ tạo và làm việc với một project Maven để minh họa cho việc đọc tập tin XML sử dụng DOM.
Mình có project như sau:
Tập tin XML chúng ta cần đọc là students.xml có nội dung như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <students> <student n0='1'> <name>John</name> <code>12345</code> <age>19</age> </student> <student n0='2'> <name>Marry</name> <code>23456</code> <age>24</age> </student> </students> |
Tập tin này chứa thông tin của 2 sinh viên bao gồm tên (name), mã sinh viên (code) và tuổi (age) của mỗi sinh viên. Mỗi sinh viên sẽ được đánh số thứ tự thông qua thuộc tính n0.
OK, giờ chúng ta bắt đầu đọc tập tin này các bạn nhé!
Đầu tiên, để có thể đọc được tập tin students.xml, chúng ta cần phải khởi tạo đối tượng File cho tập tin này:
1 |
File f = new File("students.xml"); |
Tiếp theo, chúng ta cần khởi tạo đối tượng Document chứa thông tin của tập tin XML từ đối tượng File đã được tạo ra ở trên:
1 2 3 |
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder buider = factory.newDocumentBuilder(); Document doc = buider.parse(f); |
Để đọc tập tin XML với DOM, chúng ta sẽ đọc từng thẻ của nó từ ngoài vào trong theo thứ tự phân cấp của chúng.
Trong tập tin students.xml thì thẻ <students> là thẻ ngoài cùng nhất, hay còn gọi là root element. Để đọc được thẻ này chúng ta dùng phương thức sau:
1 |
Element students = doc.getDocumentElement(); |
Trong DOM, một thẻ được xác định là một Element.
Bây giờ, chúng ta đã có thông tin của thẻ <students> rồi, để lấy thông tin của các thẻ <student>, chúng ta sẽ dùng thẻ <students> để lấy chúng.
1 |
NodeList studentList = students.getElementsByTagName("student"); |
Đối tượng NodeList sẽ chứa thông tin 2 thẻ <student> có trong tập tin XML. Bây giờ chúng ta sẽ đi qua từng thẻ để đọc thông tin của chúng:
1 2 3 4 5 6 |
for (int i = 0; i < studentList.getLength(); i++) { Node node = studentList.item(i); if (node.getNodeType() == Node.ELEMENT_NODE) { Element student = (Element) node; } } |
Một Node là một nút trong cây DOM của chúng ta. Chúng ta cần đưa nó về đối tượng Element để sử dụng.
OK, giờ chúng ta đã có đối tượng chứa thông tin của các thẻ <student>. Nhiệm vụ bây giờ là chúng ta đọc chúng thôi.
Để đọc được thuộc tính số thứ tự, chúng ta chỉ cần làm như sau:
1 |
student.getAttribute("n0"); |
với n0 là tên của thuộc tính.
Bởi vì bây giờ chúng ta đang đọc thẻ <student> và mỗi thẻ <student> chỉ có một thẻ con cho tên, mã sinh viên và tuổi nên chúng ta có thể đọc những thông tin này như sau:
- Thẻ <name>:
1 |
student.getElementsByTagName("name").item(0).getTextContent(); |
- Thẻ <code>:
1 |
student.getElementsByTagName("code").item(0).getTextContent(); |
- Thẻ <age>:
1 |
student.getElementsByTagName("age").item(0).getTextContent(); |
OK, chúng ta đã hoàn thành việc đọc tập tin students.xml, các bạn có thể tham khảo đầy đủ code như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
package com.huongdanjava.dom; import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class DOMExample { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { File f = new File("students.xml"); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder buider = factory.newDocumentBuilder(); Document doc = buider.parse(f); Element students = doc.getDocumentElement(); NodeList studentList = students.getElementsByTagName("student"); for (int i = 0; i < studentList.getLength(); i++) { Node node = studentList.item(i); if (node.getNodeType() == Node.ELEMENT_NODE) { Element student = (Element) node; System.out.println("n0: " + student.getAttribute("n0")); System.out.println("name: " + student.getElementsByTagName("name").item(0).getTextContent()); System.out.println("code: " + student.getElementsByTagName("code").item(0).getTextContent()); System.out.println("age: " + student.getElementsByTagName("age").item(0).getTextContent()); System.out.println("\n"); } } } } |
Kết quả: