Khai báo Element – Tag và Attributes. Sử dụng DTD để kiểm tra tài liệu XML được viết đúng theo đúng định dạng dùng để truy xuất và giao tiếp (validation).
Mục đích: Chủ đề của bài này giới thiệu về DTD – một phương pháp dùng để kiểm tra tài liệu XML viết đúng theo chuẩn giao tiếp và truy xuất giữa người gửi và người nhận. Nội dung đề cập đến sự cần thiết có để có DTD, cách viết và sử dụng DTD cho đúng để kiểm tra tài liệu xml. Nội dung bài này tập trung vào khai báo tag và thuộc tính trong tài liệu DTD để áp dụng cho tài liệu XML. Qua nội dung tổng quát của lý thuyết, chúng tôi sẽ thực hiện một số ví dụ liên quan nhằm hiểu rõ nội dung của lý thuyết đã đề ra.
Yêu cầu về kiến thức cơ bản cho các khái niệm về XML
-
Nắm vững các khái niệm về XML và cách viết tài liệu XML well-formed (tham khảo lại bài Giới thiệu về XML – định nghĩa, cách viết XML đúng cú pháp (XML well-formed))
-
Nắm vững khái niệm về ngôn ngữ lập trình Java, lập trình thao tác hướng đối tượng
-
Đã viết và kiểm tra một tài liệu XML well-formed
Tổng quan DTD
-
Sự cần thiết phải sử dụng DTD để validation tài liệu XML
-
XML hướng tới việc tổ chức dữ liệu theo dạng cấu trúc để chia sẻ, khai thác và trao đổi lẫn nhau giữa các ứng dụng, giữa người sử dụng và tổ chức (gọi tắt là ứng dụng)
-
Tuy nhiên, chính việc định nghĩa các tag một cách tùy ý theo người dùng dẫn đến việc người sử dụng xml có thể hiểu sai ngữ nghĩa trong việc truyền dữ liệu trong giao tiếp và truy xuất giữa các ứng dụng
-
Ngoài ra, trong quá trình tổ chức dữ liệu chúng ta cũng mong muốn kiểm tra xem dữ liệu chúng ta có đúng như kiểu mong muốn để giao tiếp giữa người gửi và người nhận. Hơn thế nữa, cũng giống như ngôn ngữ lập trình, chúng ta mong muốn một số giá trị trong tài liệu XML nên được khởi tạo sẵn giá trị để khi chúng ta quên gán trị thì giá trị được thiết lập mặc định, tránh trường hợp giá trị truy xuất không có và được ứng dụng gán cho giá trị null và gây nên lỗi không đáng có trong quá trình xử lý
-
Ngoài những yếu tố nêu trên, chúng ta cũng cần đảm bảo cấu trúc dữ liệu tổ chức phải đúng cấu trúc và định dạng format khi thực hiện trao đổi và giao tiếp giữa các ứng dụng, đảm bảo tính ổn định trong quá trình xử lý
-
Giống tương tự khái niệm quan hệ giữa các thực thể trong database và ràng buộc giữa các thành phần dữ liệu, thì tài liệu XML cũng cần đảm bảo các ràng buộc và mối quan hệ giữa các thành phần dữ liệu được tổ chức trong tài liệu để hạn chế sai sót khi chia sẻ dữ liệu
-
Tài liệu XML được validation nghĩa là tài liệu XML đã well-formed và tuân thủ đúng định dạng qui định trong giao tiếp và truy xuất
-
Định nghĩa DTD
-
Viết tắt của từ Document Type Definition
-
Một cơ chế dùng để xác định hay định nghĩa tài liệu có bao nhiêu tag, bao nhiêu attributes, attribute của tag nào và mối quan hệ giữa các tag và định nghĩa các thành phần tương tự như macro hay biến hàng hay tham số truyền trong ngôn ngữ lặp trình (trong DTD và XML được gọi là entity) nhằm tăng tính hiệu quả trong việc sử dụng XML và đảm bảo đúng những điều đã được đề cập trong sự cần thiết phải có DTD
-
DTD được viết sử dụng ngôn ngữ Extended Backus-Naur Form (EBNF), một ngôn ngữ xuất phát từ SGML và có cấu trúc không phải theo XML
-
Hỗ trợ bộ XML Parser có hỗ trợ validation kiểm tra tính đúng đắn của tài liệu XML trước khi xử lý và truyền dữ liệu đến client
-
Hỗ trợ người sử dụng tài liệu XML có kết hợp DTD thiết lập giá trị khởi tạo cho thuộc tính trong tài liệu XML
-
Đảm bảo cấu trúc của XML tuân theo đúng định dạng đã được qui định giữa các ứng dụng trong quá trình giao tiếp
-
Định nghĩa các ràng buộc giữa các thành phần trong cấu trúc tài liệu XML
-
DTD không hỗ trợ xác định nội dung được đưa trong tài liệu XML là chính xác hay là không
-
Internal: được nhúng trực tiếp vào tài liệu XML trong phần prolog với khai báo DOCTYPE – khai báo Document Type Declaration (ví dụ 1 trong bài Giới thiệu về XML – định nghĩa, cách viết XML đúng cú pháp (XML well-formed))
-
Mục đích của DTD
-
Phân loại DTD: có 02 loại
<!DOCTYPE name [<define elements, attributes, entity, and their relationships>]
-
name: tên của root tag của tài liệu XML mà tài liệu DTD đang áp dụng
-
External: DTD được lưu trữ dưới dạng file có phần mở rộng là dtd để khai báo cú pháp và không chứa khai báo Document Type Declaration và sau đó được nhúng vào tài liệu XML với khai báo DOCTYPE chỉ đến vị trí của file DTD
-
Cú pháp để đưa tài liệu DTD áp dụng vào tài liệu XML hiện hành
<!DOCTYPE name SYSTEM “file|url”>
-
name tương tự như định dạng Internal
-
Từ khóa SYSTEM nhằm thể hiện ý nghĩa là DTD này không được công bố hay không được chia sẻ chung cho tất cả mọi người sử dụng, nghĩa là tài liệu DTD đang nằm tại máy hiện hành hay cục bộ
-
Để tham chiếu đến tài liệu DTD được đưa để chia sẻ chung hay tham chiếu đến chuẩn chung của một DTD đã được public
<!DOCTYPE name PUBLIC FPI “url”>
Từ khóa
|
Định nghĩa
|
//
|
Phân cách giữa các thành phần trong FPI
|
Phần thứ 1
|
Thể hiện DTD có được viết trong dạng chuẩn hay không
“-” chuẩn chưa được chấp nhận
“+” chuẩn được chấp nhận nhưng nội dung không được viết theo chuẩn
“chữ bất kỳ” chuẩn được chấp nhận và nội dung được viết theo chuẩn (ví dụ: ISO)
|
Phần thứ 2
|
Xác định tên cá nhân hay nhóm tác giả viết ra DTD
|
Phần thứ 3
|
Thể hiện loại tính chất hay phiên bản của tài liệu DTD được tham chiếu tới
|
Phần thứ 4
|
Xác định ngôn ngữ được dùng trong DTD, thể hiện bằng 02 ký tự theo chuẩn quốc tế
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
Cấu trúc tài liệu DTD
-
Bao gồm các khai báo về tag – gọi là element, khai báo attribute, và khai báo entity (Phần entity này chúng tôi sẽ giới thiệu trong một chủ đề khác)
-
Các khai báo này không nhất thiết phải theo thứ tự mà có thể khai báo ở vị trí tùy ý vì bộ xử lý DTD có thể tìm kiếm tham chiếu đến tất cả các nơi trong tài liệu DTD để tìm ra định nghĩa nếu có
-
Nếu định nghĩa trùng lắp về element sẽ bộ parser sẽ thông báo lỗi trong khi kiểm tra tài liệu DTD sẽ không báo lỗi
-
Nếu định nghĩa trùng lắp về attribute và entity thì nội dung định nghĩa đầu tiên hay tham chiếu đầu tiên tìm thấy sẽ có hiệu lực áp dụng
-
Luật trên không thể áp dụng duy nhất đối với loại entity có tên là parameter entity, parameter entity phải được định nghĩa trước khi được sử dụng (trùng lắp vẫn được áp dụng đối parameter entity).
-
Khai báo element hay tag
o Mỗi element khai báo bao gồm tên tag và nội dung kiểu dữ liệu được chứa đựng trong phần thân tag
o Tất cả các element tồn tại trong tài liệu XML phải được khai báo trong DTD
o Cú pháp: <!ELEMENT tên_tag content_model>
-
Ví dụ: <!ELEMENT booktitle (#PCDATA)>
-
Cú pháp thể hiện ràng buộc mối quan hệ giữa các element
-
Các element không được định nghĩa trùng lắp. Nếu trùng lắp element, parser sẽ phát sinh lỗi khi áp dụng vào tài liệu XML, lỗi không phát sinh khi kiểm tra ngữ pháp trong DTD
<!ELEMENT tên_tag (khai báo các tag con bên trong, phân cách dấu “,”)[content_model]>
§ Ký hiệu dấu ?: thể hiện số lần xuất hiện tag trong tài liệu tối thiểu là 0 lần, tối đa là 1 lần
§ Ký hiệu dấu +: thể hiện số lần xuất hiện tag trong tài liệu tối thiểu là 1 lần, tối đa là nhiều lần
§ Ký hiệu dấu *: thể hiện số lần xuất hiện tag trong tài liệu tối thiểu là 0 lần, tối đa là nhiều lần
§ Không có ký hiệu gì cả: thể hiện số lần xuất hiện bắt buộc là 1 lần
§ Khai báo tag với dạng a, b: thể hiện tag a rồi tag b
§ Khai báo tag dạng a | b: xuất hiện tag a hay tag b nhưng 02 tag này không thể xuất hiện cùng một lúc
§ Ký (): thể hiện 1 group hay group con trong trong khai báo
§ #PCDATA
-
Xác định phần thân tag chứa đựng các ký tự được parse bởi bộ Parser.
-
Cú pháp sử dụng (#PCDATA).
-
Nếu sử dụng lồng ghép thì cú pháp #PCDATA phải được đứng đầu trong khai báo và không có ký hiệu ()
-
EMPTY: xác định phần thân tag không được chứa ký tự hay nói cách khác đây là tag rỗng hay dùng XML cú pháp với empty tag
-
ANY: xác định phần thân tag có thể chứa bất kỳ nội dung nào từ ký tự đến element trong khi #PCDATA không chứa tag lồng ở bên trong
-
Khai báo các attribute cho một tag
-
Cú pháp khai báo trong DTD
<!ATTLIST tên_tag tên_attribute Kiểu_dữ_liệu ràng_buộc_cho_attribute>
tên_attribute Kiểu_dữ_liệu ràng_buộc_cho_attribute
-
Do vậy, khi parse thì bộ Parser sau khi đọc 3 thành phần sẽ đọc 3 thành phần tiếp theo và coi như 3 thành phần tiếp theo đó là thuộc tính được khai báo tiếp theo
-
Các ràng buộc cho attribute
Các ràng buộc
|
Mô tả
|
#REQUIRED
|
Không thiết lập giá trị khởi tạo nhưng thuộc tính phải bắt buộc tồn tại trong tài liệu XML
|
#IMPLIED
|
Không thiết lập giá trị khởi tạo nhưng thuộc tính này có hay không có cũng được khi sử dụng tài liệu XML
|
#FIXED “giá trị”
|
Giá trị hằng với các ký tự được thiết lập cho thuộc tính. Thuộc tính có thể được gán nhưng phải gán bắt buộc với giá trị hàng
|
“giá trị”
|
Gán giá trị khởi tạo với các ký tự cho thuộc tính nếu thuộc tính này không được sử dụng trong XML.
|
Kiểu dữ liệu
|
Mô tả
|
CDATA
|
Giá trị của thuộc tính sẽ là chuỗi ký tự và bộ parser không xử lý ký tự này
|
NMTOKEN
|
Giá trị của thuộc tính sẽ là một chuỗi ký tự chứa các ký tự tuân thủ qui luật đặt tên tag ngoại trừ ký tự bắt đầu có thể là số
|
NMTOKENS
|
Giá trị của thuộc tính sẽ tập một hay nhiều NMTOKEN và được phân cách bằng white-space
|
ID
|
Giá trị của thuộc tính sẽ là giá trị chuỗi tuân theo luật đặt tên tag name và sẽ là duy nhất trong tài liệu XML
|
IDREF
|
Giá trị của thuộc tính sẽ là giá trị của một ID có tồn tại trong tài liệu XML
|
IDREFS
|
Giá trị của thuộc tính sẽ là tập hợp các ID có trong tài liệu và được phân cách bằng white-space
|
ENTITY
|
Giá trị của thuộc tính sẽ là tên của một entity không được parse trong tài liệu XML. Entity này đã được khai báo trong DTD dùng để valid cho tài liệu XML với từ khóa ENTITY
|
ENTITIES
|
Giá trị của thuộc tính sẽ là tập hợp các ENTITY phân cách nhau bởi white-space
|
NOTATION
|
Giá trị của thuộc tính sẽ là một nhãn dùng để tham chiếu đến một thông tin cần thiết như là tên tập tin, tên thư mục hay là đường dẫn … được khai báo trong cú pháp NOTATION trong tài liệu DTD
|
Enumeration
|
Giá trị của thuộc tính sẽ là tập hợp các giá trị thuộc tính tuân đúng qui luật đặt tên tag và phân cách nhau bởi dấu | vertical bars.
|
Vận dụng các kiến thức về DTD ở trên để áp dụng vào xây dựng tài liệu DTD, sau đó dùng tài liệu DTD để kiểm tra tính ràng buộc cho tài liệu XML trong một số ví dụ bên dưới
-
Netbeans không hỗ trợ hiện thị gợi ý khi gõ, do vậy chúng ta nên dùng ký hiệu tắt để gọi cho nhanh và chính xác. Kết hợp từ viết tắt và phím tab
-
Để tham chiếu bảng gõ tắt, chúng ta chọn tools, chọn Options, chọn Code Templates
-
Trong phần language chọn DTD và xem các từ gõ tắt để áp dụng
-
Sau đó tạo tập tin XML để gõ nội dung tương tự như bài Giới thiệu về XML – định nghĩa, cách viết XML đúng cú pháp (XML well-formed)
-
Ngoài cách nêu trên để tạo external DTD, chúng tạo DTD nhúng trong XML, chúng ta tạo tập tin XML để gõ nội dung tương tự như bài Giới thiệu về XML – định nghĩa, cách viết XML đúng cú pháp (XML well-formed)
-
Ở đây chúng ta sẽ vẫn sử dụng cách check validation để kiểm tra tài liệu XML phù hợp với DTD được khai báo bằng cách nhấn phải chuột trực tiếp trong code XML, chọn Validate XML
-
Đây là ví dụ đặc biệt về sự cho phép định sử dụng tồn tại 1 trong nhóm giá trị thông qua ký hiệu | trong book với 2 phần price và discount
-
Nội dung thể hiện trong book tồn tại thứ tự booktitle, author, sau đó là price hay discount đều được nhưng không thể tồn tại cả 2 price lẫn discount
-
Đây là ví dụ về thiết lặp thuộc tính giá trị khởi tạo mặc định khi thuộc tính đó không tồn tại trong xml
-
Tài liệu hoàn toàn validation cho dù gender không tồn tại và chúng ta view tài liệu xml trên trình duyệt thì sẽ thấy gender được đưa vào với giá trị mặc định được thiết lập trong DTD
-
Đây là ví dụ, khi viết DTD xong, ta check DTD với việc click phải chuột và check DTD
-
DTD không đúng vì #PCDATA thiếu ()
-
Đây là một ví dụ cho thấy không thể gán nhiều hơn ràng buộc cho thuộc tính, 3 ba nhóm thuộc tính là duy nhất nghĩa là tại 1 thời điểm các default cho attribute chỉ tồn tại một trong nhóm qui định, không thể tồn tại tất cả
-
Đây là ví dụ trộn lẫn giữa chữ và tag thay gì dùng ANY, chúng ta dùng như trên với #PCDATA kết hợp với dấu |.
-
Lưu ý: cần xem kỹ lý thuyết và những điều khi sử dụng #PCDATA
-
Ví dụ 27
Chúc mừng các bạn đã hoàn tất và nắm các khái niệm về sử dụng DTD, cụ thể là khai báo element – tag và attribute, sau đó áp dụng để kiểm tra tính toàn vẹn trong tài liệu XML.
Chúng tôi hy vọng nội dung của bài này giúp ích các bạn trong việc giao tiếp giữa các ứng dụng về dữ liệu. Mặc dù các ví dụ trên chưa có thể thể hiện đầy đủ tất cả các khái niệm, nhưng qua các ví dụ trên, chúng tôi hy vọng đã có thể giúp các bạn hiểu được các khái niệm tổng quát nhất của DTD và cách thức áp dụng DTD để validation XML.
Rất mong sự góp ý chân thành và chia sẻ của quí vị về vấn đề này. Hẹn gặp lại quý vị ở các chủ đề liên quan đến XML từ khai báo DTD về entities.