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.
Mình sẽ bắt đầu với một Maven project như sau:
Điều đầu tiên mà các bạn cần biết về thư viện JAXB này là: từ Java 8 trở về trước thì thư viện JAXB được built-in với Java, nghĩa là các bạn không cần khai báo dependency gì của JAXB để làm việc với nó. Nhưng từ Java 9 trở đi, JAXB đã được tách ra thành một module độc lập.
Nếu các bạn đang sử dụng Java EE 8 thì có thể khai báo dependency sau để làm việc với JAXB:
1 2 3 4 5 |
<dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> |
Còn nếu các bạn sử dụng namespace Jakarta EE cho tất cả các phiên bản từ Java 9 trở đi, thì hãy khai báo dependency sau nhé:
1 2 3 4 5 |
<dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>4.0.2</version> </dependency> |
Project mình sử dụng Java 21 nên mình sẽ khai báo namespace Jakarta EE với implementation là thư viện jaxb-impl như sau:
1 2 3 4 5 6 7 8 9 10 11 12 |
<dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>4.0.2</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>4.0.5</version> <scope>runtime</scope> </dependency> |
Để làm ví dụ cho bài viết này, mình có một tập tin XML với nội dung đơn giản như sau:
1 2 3 4 5 6 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <student> <name>John</name> <code>12345</code> <age>19</age> </student> |
Và một class Student được định nghĩa sử dụng các JAXB annotation 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 43 44 |
package com.huongdanjava.jaxb; import jakarta.xml.bind.annotation.XmlElement; import jakarta.xml.bind.annotation.XmlRootElement; @XmlRootElement public class Student { private String name; private String age; private String code; public String getName() { return name; } @XmlElement public void setName(String name) { this.name = name; } public String getAge() { return age; } @XmlElement public void setAge(String age) { this.age = age; } public String getCode() { return code; } @XmlElement public void setCode(String code) { this.code = code; } @Override public String toString() { return "Student [name=" + name + ", age=" + age + ", code=" + code + "]"; } } |
Với JAXB, chúng ta thường dùng 2 hai annotation cơ bản, đó là:
- @XmlRootElement: annotation này chỉ rõ thẻ ngoài cùng nhất của tập tin XML là gì và do đó nó được khai báo trên đầu của một class.
- @XmlElement: dùng để khai báo một thuộc tính của đối tượng là một thẻ của tập tin XML.
Trong ví dụ trên, bên trong thẻ student, chúng ta có 3 thẻ là name, age và code. Do đó, đối tượng Student của chúng ta phải khai báo annotation cho 3 thuộc tính tương ứng.
OK, bây giờ chúng ta sẽ tiến hành chuyển đổi nội dung XML các bạn nhé!
Đầu tiên, chúng ta sẽ khởi tạo đối tượng JAXBContext với đối tượng cần chuyển đổi là Student.
1 |
JAXBContext jaxbContext = JAXBContext.newInstance(Student.class); |
Trong đối tượng JAXBContext này, nó có một phương thức để tạo ra đối tượng dùng để chuyển đổi nội dung XML sang đối tượng Java đó là Unmarshaller. Cụ thể như sau:
1 |
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); |
Và giờ các bạn có thể sử dụng phương thức unmarshal() trong đối tượng Unmarshaller cho mục đích của chúng ta rồi.
Có nhiều phương thức overloaded unmarshal() nhưng trong bài viết này chúng ta đang làm việc với tập tin nên mình sẽ tạo đối tượng File và truyền vào cho phương thức unmarshal().
1 2 3 |
File file = new File("student.xml"); Student student = (Student) jaxbUnmarshaller.unmarshal(file); System.out.println(student); |
Kết quả;
Toàn bộ source code như sau các bạn nhé:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
package com.huongdanjava.jaxb; import jakarta.xml.bind.JAXBContext; import jakarta.xml.bind.JAXBException; import jakarta.xml.bind.Unmarshaller; import java.io.File; public class JaxbExample { public static void main(String[] args) { try { JAXBContext jaxbContext = JAXBContext.newInstance(Student.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); File file = new File("student.xml"); Student student = (Student) jaxbUnmarshaller.unmarshal(file); System.out.println(student); } catch (JAXBException e) { e.printStackTrace(); } } } |
anh le
Cảm ơn anh Khanh, bài viết hay quá.