Định nghĩa và vai trò của XML
XML (eXtensible Markup Language) là ngôn ngữ đánh dấu được thiết kế để lưu trữ và vận chuyển dữ liệu. Khác với HTML, nơi các thẻ (tag) được định nghĩa sẵn để hiển thị giao diện, XML cho phép người dùng tự tạo ra các thẻ tùy chỉnh dựa trên nhu cầu mô tả dữ liệu. Tính chất "có thể mở rộng" này giúp XML linh hoạt trong việc đại diện cho các cấu trúc thông tin phức tạp.
Hiện nay, XML được ứng dụng chủ yếu trong ba lĩnh vực:
- Định dạng dữ liệu trao đổi giữa các hệ thống qua mạng.
- Lưu trữ cấu hình cho các ứng dụng và framework.
- Kho dữ liệu cho các cơ sở dữ liệu nhỏ hoặc tệp tin lưu trữ.
Khai báo tài liệu và mã hóa
Để một tệp tin được nhận diện là XML hợp lệ, dòng đầu tiên phải là khai báo XML (prolog). Dòng này chỉ định phiên bản và bảng mã ký tự sử dụng.
<?xml version="1.0" encoding="UTF-8"?>
Khai báo này phải bắt đầu từ dòng đầu tiên, cột đầu tiên của tệp tin. Thông số encoding rất quan trọng để tránh lỗi hiển thị ký tự. Nếu tệp tin được lưu với mã hóa UTF-8 nhưng khai báo là ISO-8859-1, trình phân tích (parser) sẽ gây ra lỗi hiển thị ký tự. Do đó, mã hóa khi lưu tệp và thuộc tính encoding trong khai báo phải đồng nhất.
Quy tắc đặt tên thẻ và thuộc tính
XML có quy tắc đặt tên chặt chẽ hơn HTML so với việc phân biệt hoa thường. Các quy tắc cơ bản bao gồm:
- Tên thẻ phân biệt hoa thường;
<Book>và<book>là hai thẻ khác nhau. - Tên không được bắt đầu bằng số hoặc dấu gạch dưới.
- Tên không được chứa khoảng trắng hoặc dấu hai chấm.
- Tên không được bắt đầu bằng chuỗi "xml" (bất kể viết hoa hay viết thường).
Thẻ trong XML có thể chứa các thuộc tính (attribute) để cung cấp thông tin bổ sung. Giá trị của thuộc tính phải được đặt trong dấu ngoặc kép (đơn hoặc kép).
<product id="P101" category="Electronics">Smartphone</product>
Chú thích và ký tự đặc biệt
Chú thích trong XML được viết theo cú pháp giống HTML:
<!-- Đây là dòng chú thích -->
Lưu ý rằng chú thích không được phép lồng nhau và không thể đặt trước dòng khai báo XML. Đối với các ký tự đặc biệt được sử dụng trong cú pháp XML (như <, &, >), chúng phải được chuyển đổi (escape) sang dạng thực thể (entity) để không gây lỗi phân tích cú pháp.
<math> 2 < 5 </math>
Giới thiệu về ràng buộc (Constraints)
Mặc dù XML cho phép tự do định nghĩa thẻ,但在 nhiều trường hợp (đặc biệt là file cấu hình), ta cần giới hạn cấu trúc của tệp XML để đảm bảo tính đúng đắn của dữ liệu. Hai tiêu chuẩn ràng buộc phổ biến là DTD (Document Type Definition) và XML Schema (XSD).
Ràng buộc DTD
DTD sử dụng cú pháp riêng biệt (không phải XML) để định nghĩa các phần tử và cấu trúc của chúng.
Cú pháp định nghĩa phần tử:
<!ELEMENT TênPhầnTử (KiểuDữLiệu)>: Định nghĩa phần tử.- Phần tử phức hợp (con) được liệt kê trong dấu ngoặc đơn, ngăn cách bởi dấu phẩy (theo thứ tự) hoặc dấu gạch đứng (chọn một).
- Các ký hiệu định lượng:
+(một hoặc nhiều),*(không hoặc nhiều),?(không hoặc một). - Kiểu dữ liệu:
#PCDATA(chuỗi văn bản),EMPTY(rỗng).
Định nghĩa thuộc tính: Sử dụng <!ATTLIST>.
<!ATTLIST TênPhầnTử
TênThuocTinh Kiểu GiớiHạn
>
Ví dụ dưới đây định nghĩa cấu trúc cho một danh mục sản phẩm:
file.dtd:
<!ELEMENT catalog (product+)>
<!ELEMENT product (name, price)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ATTLIST product
id ID #REQUIRED
status (active|discontinued) "active"
>
Tệp XML tham chiếu DTD:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE catalog SYSTEM "file.dtd">
<catalog>
<product id="p01" status="active">
<name>Laptop Gaming</name>
<price>1500</price>
</product>
</catalog>
DTD cũng cho phép định nghĩa thực thể (entity) làm biến hằng, nhưng tính năng này ít được sử dụng trong thực tế hiện đại.
Ràng buộc XML Schema (XSD)
XML Schema ra đời sau để khắc phục các hạn chế của DTD. Ưu điểm lớn nhất là XSD được viết bằng chính cú pháp XML, hỗ trợ các kiểu dữ liệu phong phú (int, date, string, etc.) và cho phép sử dụng nhiều Schema cho một tệp XML thông qua không gian tên (namespace).
Định nghĩa Schema:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.com/school"
xmlns="http://www.example.com/school"
elementFormDefault="qualified">
<xs:element name="school">
<xs:complexType>
<xs:sequence>
<xs:element name="student" type="studentType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="studentType">
<xs:sequence>
<xs:element name="fullname" type="xs:string"/>
<xs:element name="age" type="xs:int"/>
</xs:sequence>
<xs:attribute name="rollNumber" type="xs:string" use="required"/>
</xs:complexType>
</xs:schema>
Tệp XML sử dụng Schema:
Để sử dụng Schema, ta cần khai báo các không gian tên trong thẻ gốc.
<?xml version="1.0" encoding="UTF-8"?>
<school xmlns="http://www.example.com/school"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.com/school school.xsd">
<student rollNumber="S1001">
<fullname>Nguyen Van A</fullname>
<age>20</age>
</student>
<student rollNumber="S1002">
<fullname>Tran Thi B</fullname>
<age>21</age>
</student>
</school>
XSD hiện là tiêu chuẩn phổ biến cho các tệp cấu hình trong các công nghệ Java hiện đại như Spring Framework, thay thế cho DTD cũ kỹ.