Để kiểm tra tính đúng đắn của các tag, các attribute trong một tập tin XML có theo nhu cầu mà chúng ta muốn hay không, các bạn có thể sử dụng một tập tin XSD Schema. Nó là gì? Chúng ta sẽ cùng nhau tìm hiểu trong bài viết này nhé các bạn!
Giả sử bây giờ, các bạn đang làm việc với một ứng dụng và ứng dụng đó sẽ process một tập tin XML có cấu trúc và nội dung đơn giản như sau:
1 2 3 4 5 |
<student> <id>1</id> <name>Khanh</name> <address>Viet Nam</address> </student> |
Trong đó, nhu cầu bắt buộc tag id phải tồn tại và giá trị của nó phải là kiểu giá trị int, thêm nữa độ dài giá trị của tag address phải nhỏ hơn 20 :).
Vậy làm sao để các bạn có thể đảm bảo rằng các tập tin XML mà chương trình của các bạn sẽ xử lý đảm bảo được các yêu cầu trên? Hãy sử dụng tập tin XSD Schema đi các bạn! 😀
Tập tin XSD Schema cũng là một tập tin XML nhưng chức năng của nó là:
- Định nghĩa các tag, các attribute cần có trong một tập tin XML.
- Tag nào, attribute nào là bắt buộc, cái nào không?
- Định nghĩa một tag cần có giá trị hay không?
- Định nghĩa kiểu dữ liệu của các tag, các attribute.
- Định nghĩa giá trị mặc định cho các attribute.
Nhờ những chức năng trên, chúng ta có thể sử dụng tập tin XSD Schema để validate xem là nội dung của tập tin có đúng nhu cầu mà chúng ta muốn hay không đấy các bạn?
Bây giờ, mình sẽ hướng dẫn các bạn cách xây dựng một tập tin XSD Schema để thoả mãn nhu cầu của ví dụ trên nhé các bạn!
Đầu tiên, mình sẽ tạo một Maven project rồi tạo 2 tập tin student.xml và student.xsd nằm trong thư mục /src/main/resources/ như sau:
Nội dung của tập tin student.xml như trên.
Giờ mình sẽ đi vào xây dựng tập tin XSD Schema để validate tập tin student.xml các bạn nhé!
Đầu tiên, chúng ta cần khai báo tag ngoài cùng nhất của tập tin schema, tên là <schema>. Tag này còn được gọi là tag root với một số thuộc tính như sau:
1 2 3 4 |
<?xml version="1.0" encoding="UTF-8"?> <schema targetNamespace="http://huongdanjava.com/student/" xmlns="http://www.w3.org/2001/XMLSchema"> </schema> |
Trong đó:
- targetNamespace: định nghĩa các element được định nghĩa trong schema hiện tại đều thuộc về namespace “http://huongdanjava.com/student/”.
- xmlns: định nghĩa namespace mặc định sẽ sử dụng cho các tag, các attribute trong tập tin schema này đều thuộc về namespace “http://www.w3.org/2001/XMLSchema”.
Tiếp theo, chúng ta sẽ bắt đầu định nghĩa element cho tag <student>.
Có hai kiểu khai báo element trong một tập tin XSD Schema, đó là: Simple Element và Complex Element.
Simple Element dùng để định nghĩa cho các tag chỉ có chứa các dữ liệu đơn giản như string, integer, boolean,… không chứa các tag con hay các attribute.
Các kiểu dữ liệu đơn giản như sau:
- string: chuỗi
- boolean: true/false
- numeric: số
- dateTime: ngày tháng, thời gian
- binary: nhị phân
- anyURI: các chuỗi URI
- integer: số nguyên
- decimal: số thập phân
- time: thời gian
Ví dụ nếu như tập tin XML của chúng ta chỉ có nội dung sau:
1 |
<name>Khanh</name> |
thì các bạn có thể sử dụng Simple Element.
Còn Complex Element thì được dùng để định nghĩa các tag phức tạp hơn, chứa tag con, được chia thành 4 loại như sau:
- Tag rỗng, chỉ chứa attribute.
Ví dụ:
1 |
<name id="1"/> |
- Tag chỉ chứa các tag con:
Ví dụ:
1 2 3 4 |
<student id="1"> <name>Quan</name> <address>456</address> </student> |
- Tag chỉ chứa text
Ví dụ:
1 |
<name id="2">Quan</name> |
- Tag vừa chứa tag con vừa chứa text.
1 2 3 |
<student id="1"> Nam of student is : <name>Quan</name> </student> |
Trong ví dụ của bài viết này, tag <student> sẽ chứa một số tag con khác, do đó mình sẽ khai báo element student là một Complex Element như sau:
1 2 3 4 5 6 7 8 9 10 |
<?xml version="1.0" encoding="UTF-8"?> <schema targetNamespace="http://huongdanjava.com/student/" xmlns="http://www.w3.org/2001/XMLSchema"> <element name="student"> <complexType> <sequence> </sequence> </complexType> </element> </schema> |
Như các bạn thấy, mình đã khai báo element student sử dụng tag <complexType> và tag <sequence>. Bên trong tag <sequence> sẽ là nơi định nghĩa cho các tag con của tag <student>.
Để khai báo element cho tag <id> bên trong tag <student>, chúng ta phải để ý nhu cầu bắt buộc phải có và phải là kiểu int.
Để bắt buộc một tag phải xuất hiện trong một tập tin XML, các bạn có thể sử dụng attribute minOccur của element với giá trị là 1. Để khai báo kiểu dữ liệu cho một tag, chúng ta sẽ sử dụng attribute type của element. Tổng hợp 2 yêu cầu này, mình sẽ khai báo như sau cho element của tag <id>:
1 2 3 4 5 6 7 8 9 10 |
<?xml version="1.0" encoding="UTF-8"?> <schema targetNamespace="http://huongdanjava.com/student/" xmlns="http://www.w3.org/2001/XMLSchema"> <element name="student"> <complexType> <sequence> <element name="id" type="int" minOccurs="1"></element> </sequence> </complexType> </element> </schema> |
Đối với tag <name> thì yêu cầu chỉ là kiểu dữ liệu string nên mình sẽ khai báo element cho tag này như sau:
1 2 3 4 5 6 7 8 9 10 11 |
<?xml version="1.0" encoding="UTF-8"?> <schema targetNamespace="http://huongdanjava.com/student/" xmlns="http://www.w3.org/2001/XMLSchema"> <element name="student"> <complexType> <sequence> <element name="id" type="int" minOccurs="1"></element> <element name="name" type="string"></element> </sequence> </complexType> </element> </schema> |
Còn đối với tag <address> thì yêu cầu phải giới hạn chiều dài là 20.
Đối với yêu cầu này thì khi khai báo element cho tag <address>, các bạn hãy sử dụng tag <restriction> với tag <maxLength> như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?xml version="1.0" encoding="UTF-8"?> <schema targetNamespace="http://huongdanjava.com/student/" xmlns="http://www.w3.org/2001/XMLSchema"> <element name="student"> <complexType> <sequence> <element name="id" type="int" minOccurs="1"></element> <element name="name" type="string"></element> <element name="address"> <simpleType> <restriction base="string"> <maxLength value="20"></maxLength> </restriction> </simpleType> </element> </sequence> </complexType> </element> </schema> |
Đến đây thì chúng ta đã hoàn thành việc xây dựng tập tin XSD Schema để validate nội dung của tập tin student.xml rồi đó các bạn.
Hiện tại, chúng ta chưa sử dụng tập tin student.xsd để validate tập tin student.xml thì nội dung của tập tin student.xml không bị vấn đề gì cả:
Nhưng nếu chúng ta sử dụng tập tin student.xsd này trong tập tin student.xml, bằng cách sửa lại nội dung của tập tin student.xml một chút để thêm location của tập tin XSD Schema, như sau:
1 2 3 4 5 |
<st:student xmlns:st="http://huongdanjava.com/student/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://huongdanjava.com/student/ student.xsd "> <id>1</id> <name>Khanh</name> <address>Viet Nam</address> </st:student> |
thì các bạn sẽ thấy bị lỗi ngay:
Hoặc:
Trong tập tin student.xml trên, mình đã sử dụng attribute xsi:schemaLocation để load nội dung của tập tin student.xsd.