XML Schema – Lược đồ XML
- 18-06-2023
- Toanngo92
- 0 Comments
Mục lục
Khái niệm và vai trò XML Schema
So sánh và phân biệt các tính năng của DTD và Schema
DTD xác định cấu trúc tài liệu và xác thực tài liệu XML, nhưng có một số hạn chế. Do đó, một khái niệm thay thế dựa trên XML cho các DTD, được gọi là XML Schema đã được giới thiệu, với mục tiêu khắc phục các nhược điểm của DTD.
Từ khóa lược đồ (schema) là một từ có nguồn gốc từ một từ Hy Lạp tượng trưng cho hình thức hoặc hình dạng. Ý nghĩa từ điển của lược đồ là: “Một biểu diễn sơ đồ; một phác thảo hoặc một mô hình”. Ban đầu, từ lược đồ chỉ nằm khái niệm của các các nhà triết học cho đến khi nó đi vào lĩnh vực khoa học máy tính. Trong ngữ cảnh của phần mềm, một lược đồ thường được hiểu là một mô hình được sử dụng để mô tả cấu trúc của cơ sở dữ liệu. Nó định nghĩa các cấu trúc bên trong như bảng, trường và mối quan hệ giữa chúng.
Tuy nhiên, trong ngữ cảnh của XML, như định nghĩa của WSC, một lược đồ là “một tập hợp các quy tắc để ràng buộc cấu trúc và trình bày rõ tập thông tin của các tài liệu XML”. Một lược đồ mô tả một mô hình cho toàn bộ một lớp tài liệu. Mô hình mô tả cách thức dữ liệu được đánh dấu và cũng chỉ định cách sắp xếp có thể có của các thẻ và văn bản trong một tài liệu hợp lệ. Một lược đồ(schema) có thể được coi là một từ vựng chung cần thiết để trao đổi tài liệu giữa các tổ chức khác nhau.
XML schema xác định các khối xây dựng hợp lệ của tài liệu XML. Có thể coi đây là kho từ vựng chung mà các tổ chức khác nhau có thể chia sẻ để trao đổi tài liệu. Ngôn ngữ XML schema được gọi là Định nghĩa Lược đồ XML (XML Schema Definition XSD).
Ví dụ chúng ta cần xác thực cấu trúc XML sau:
<Book>
<Title>Path To Paradise</Title>
<Author>David Uhite</Author>
<Theme>Philosophy</Theme>
<Publisher>ABC Publication</Publisher>
<ISBN>11</ISBN>
<Price>$12481</Price>
<Edition>dune 2000</Edition>
</Book>
Khai báo một phần tử Book, yêu cầu thành phần của nó là Title, Author, Theme, Publisher, ISBN, Price và Edition. Title, Author, Theme, Publisher sẽ lấy các giá trị chữ và số trong khi Price và ISBN sẽ lấy các giá trị số
Lập luận logic sẽ so sánh các thuộc tính của đối tượng ‘SÁCH’ này, với các thuộc tính của một cuốn sách nói chung. Nói cách khác, kiến thức trước đây của một người về cuốn sách là gì và các thuộc tính của nó, có thể là một loại lược đồ, dựa vào đó đối tượng ‘SÁCH’ được so sánh. Điều này sẽ giúp xác thực các thuộc tính của cuốn sách.
Định nghĩa XML Schema
Mục tiêu của XML Schema là xác định cấu trúc hợp lệ của tài liệu XML, tương tự như DTD.
XML Schema định nghĩa:
- Các thành phần và thuộc tính có thể xuất hiện trong tài liệu
- Phần tử nào là phần tử con
- Thứ tự và số phần tử con
- Liệu một phần tử trống hay có thể bao gồm văn bản
- Kiểu dữ liệu cho các phần tử và thuộc tính
- Giá trị mặc định và cố định cho các thành phần và thuộc tính
Các Schema khắc phục những hạn chế của DTD và cho phép các ứng dụng Web trao đổi dữ liệu XML mạnh mẽ hơn mà không cần dựa vào các công cụ xác thực đặc biệt.
Một số tính năng cơ bản mà XML Schema cung cấp là:
- Cú pháp XML được sử dụng làm cơ sở để tạo các tài liệuXML Scema. Nó không yêu cầu học một ngôn ngữ mới như trường hợp của DTD.
- Các XML Schema có thể được thao tác giống như bất kỳ tài liệu XML nào khác.
Viết XML Schema
Xét đoạn mã
XML file message.xml
<?xml version="1.0" encoding="UTF-8"?>
<Message xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="message.xsd">123</Message>
XSD file message.xsd
<?xml version= "1.0">
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name= "MESSAGE" type="xsd:string"/>
</xsd:schema>
Tệp XSD đã cho là một schema cho các phần tử . Tệp được lưu dưới dạng tin nhắn xsd. Nó là một tài liệu XML; do đó nó có một khai báo XML. Tệp schema này cũng có thể khai báo các phần tử khác, kể cả những phần tử không có trong tệp XML này, nhưng ít nhất nó phải khai báo phần tử <Message>
XML File
Tài liệu XML đã cho chứa một phần tử duy nhất, <Message>, schema cho tài liệu này phải khai báo phần tử <Message>
XSD File
Để lưu trữ tài liệu schema , tệp được lưu với phần mở rộng là “.xsd”. Các tài liệu schema là các tài liệu XML và có thể có các khai báo DTD, DOCTYPE.
Các tính năng của schema
Các XML schema cho phép các ứng dụng Web trao đổi dữ liệu XML mạnh mẽ hơn bằng cách sử dụng một loạt các tính năng mới. Chúng là:
Schema hỗ trợ các loại dữ liệu
Việc hỗ trợ XML schema cho các kiểu dữ liệu và khả năng tạo các kiểu dữ liệu cần thiết đã khắc phục được các nhược điểm của DTD. Điều đó có nghĩa là dễ dàng xác định và xác thực nội dung tài liệu và định dạng dữ liệu hợp lệ. Nhà phát triển có thể thấy việc làm việc với dữ liệu từ cơ sở dữ liệu là đơn giản. Cũng có thể dễ dàng thực hiện các hạn chế về dữ liệu.
Các Schema có thể linh hoạt và hiệu quả
Các schema có thể mang theo được và hiệu quả vì chúng sử dụng cùng một cú pháp XML. Do đó, không cần phải học bất kỳ ngôn ngữ mới nào hoặc bất kỳ trình soạn thảo nào để chỉnh sửa các tệp schema. Một trình phân tích cú pháp XML tương tự có thể được sử dụng để phân tích cú pháp các tệp schema.
Schema đảm bảo giao tiếp dữ liệu an toàn
Trong quá trình truyền dữ liệu, điều cần thiết là cả người gửi và người nhận phải có cùng một “từ vựng”. Với XML schema , người gửi có thể chỉ định dữ liệu theo cách mà người nhận sẽ hiểu.
Các schema có thể mở rộng
Một định nghĩa schema có thể được mở rộng; do đó, có thể sử dụng lại một schema hiện có để tạo một schema khác. Nhà phát triển có thể tạo các kiểu dữ liệu của riêng mình bắt nguồn từ các kiểu tiêu chuẩn. Các schema cũng hỗ trợ tham chiếu nhiều schema trong cùng một tài liệu.
Schema bắt lỗi cấp cao hơn
XML kiểm tra tính hợp lệ của tài liệu XML để xác thực cú pháp cơ bản. Một tài liệu được cho là đúng định dạng nếu có khai báo XML, phần tử gốc duy nhất, thẻ bắt đầu và thẻ kết thúc phù hợp, các phần tử được lồng đúng cách, v.v. Một tài liệu được định dạng tốt vẫn có thể có lỗi. Các XML schema có thể phát hiện các lỗi cấp cao hơn phát sinh, chẳng hạn như trường thông tin bắt buộc bị thiếu hoặc sai định dạng hoặc tên phần tử bị viết sai chính tả.
Schema hỗ trợ namespace
Hỗ trợ XML namespace cho phép lập trình viên xác thực các tài liệu sử dụng đánh dấu từ nhiều namespace . Điều đó có nghĩa là các cấu trúc có thể được sử dụng lại từ các schema đã được xác định trong một namespace khác.
Các kiểu dữ liệu phong phú hơn
Bản nháp schema định nghĩa các kiểu dữ liệu boolean , date time, URI, time interval và cả các loại số như decimal, integer, byte, long, v.v.
Nguyên mẫu (Archetypes)
Một nguyên mẫu được sử dụng để xác định loại dữ liệu được đặt tên tùy chỉnh từ các loại dữ liệu có sẵn. Ví dụ: loại dữ liệu ‘ContactList’ được xác định, sau đó hai phần tử, ‘FriendsList’ và ‘OfficialList’ được xác định theo loại đó.
Nhóm thuộc tính (Attribute grouping)
Có thể có các thuộc tính chung áp dụng cho tất cả các phần tử hoặc một số thuộc tính bao gồm các phần tử đồ họa hoặc bảng. Nhóm thuộc tính cho phép tác giả schema làm rõ ràng mối quan hệ này giữa các phần tử. Thực thể tham số hỗ trợ nhóm trong DTD, giúp đơn giản hóa quy trình tạo DTD, nhưng thông tin không được chuyển đến bộ xử lý.
Nguyên mẫu có thể tinh chỉnh (Refinable Archetypes)
DTD tuân theo loại mô hình nội dung ‘đóng’. Mô hình nội dung được định nghĩa là ràng buộc về nội dung của các phần tử trong một tài liệu XML mẫu. Mô hình nội dung ‘đóng’ mô tả tất cả và chỉ những phần tử và thuộc tính có thể xuất hiện trong nội dung của phần tử. Lược đồ XML cho phép thêm hai khả năng:
- Mô hình nội dung kiểu mở
- Mô hình nội dung có thể tinh chỉnh
Trong mô hình nội dung ‘mở’, các yếu tố khác với các yếu tố bắt buộc cũng có thể xuất hiện. Mô hình nội dung mở cho phép bao gồm các phần tử con và các thuộc tính bên trong một phần tử không được khai báo trong schema của tài liệu. DTD chỉ hỗ trợ các mô hình nội dung đóng, yêu cầu khai báo tất cả các thành phần và thuộc tính để sử dụng chúng trong tài liệu. Các phần tử bổ sung có thể có mặt trong mô hình nội dung ‘có thể tinh chỉnh’, nhưng schema phải xác định các phần tử bổ sung đó.
So sánh DTD với các schema
XML kế thừa khái niệm về DTD từ Ngôn ngữ đánh dấu tổng quát hóa tiêu chuẩn (SGML), đây là tiêu chuẩn quốc tế cho các ngôn ngữ đánh dấu. DTD được sử dụng để xác định mô hình nội dung, lồng các phần tử theo thứ tự hợp lệ và cung cấp hỗ trợ hạn chế cho các loại dữ liệu và thuộc tính. Hạn chế của việc sử dụng DTD là:
DTD được viết bằng cú pháp không phải XML
Các DTD không sử dụng ký hiệu XML và do đó chúng rất khó viết và sử dụng.
DTD không thể mở rộng
DTD không thể mở rộng. Ví dụ: nếu có một Địa chỉ DTD cho danh mục bạn bè và một người muốn thêm một phần mới vào mã cho các liên hệ chính thức, thì toàn bộ DTD phải được viết lại.
DTD không hỗ trợ namespace
Namespace có thể được sử dụng để đưa một loại phần tử vào tài liệu XML. Tuy nhiên, một namespace không thể được sử dụng để chỉ một phần tử hoặc một khai báo thực thể trong DTD. Nếu một namespace được sử dụng, thì DTD phải được sửa đổi để bao gồm bất kỳ phần tử nào được lấy từ namespace.
DTD cung cấp kiểu dữ liệu hạn chế
DTD chỉ có thể thể hiện kiểu dữ liệu của các thuộc tính dưới dạng liệt kê rõ ràng và một vài định dạng chuỗi thô. DTD không có cơ sở để mô tả số, ngày tháng, giá trị tiền tệ, v.v. Hơn nữa, các DTD không có khả năng thể hiện kiểu dữ liệu của dữ liệu ký tự trong các phần tử. Ví dụ, một phần tử có thể được định nghĩa để chứa CDATA. Tuy nhiên, phần tử không thể bị ràng buộc chỉ bằng chữ số khi nó sử dụng DTD.
Đoạn mã sau minh họa một tài liệu XML tên là “Book.xml”
<?xml version="1.0" encoding="UTF-8" ?>
<!-- declare dtd file -->
<Book>
<Title>Java</Title>
<Author>James Gosling</Author>
<Publisher>Oracle</Publisher>
<Price>100</Price>
</Book>
DTD cho “book.xml”
DTD có tên “Book.dtd” xác định các thành phần của tài liệu “Book.xml”
<!ELEMENT Book (Title, Author, Publisher, Price)>
<!ELEMENT Title (#PCDATA)>
<!ELEMENT Author (#PCDATA)>
<!ELEMENT Publisher (#PCDATA)>
<!ELEMENT Price (#PCDATA)>
Khi đó, trên file Book.xml, chúng ta cần bổ sung đoạn mã để tham chiếu:
<!DOCTYPE Book SYSTEM "book.dtd">
XML Schema cho “Book.xml”
Tệp XML schema tương ứng có tên là “Book.xsd” xác định các thành phần của tài liệu XML Book.xml
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="https://hocvietcode.com" elementFormDefault="qualified">
<xs:element name="Book">
<xs:complexType>
<xs:sequence>
<xs:element name="Title" type="xs:string"/>
<xs:element name="Author" type="xs:string"/>
<xs:element name="Publisher" type="xs:string"/>
<xs:element name="Price" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Phần tử Book là một kiểu phức tạp (complex) vì nó bao gồm các phần tử khác. Các phần tử con Tite, Author, Chapter là các kiểu đơn giản vì chúng không chứa các phần tử khác.
Khi đó, chúng ta sửa đổi nội dung của file Book.xml thành như sau để tham chiếu tới schema:
<?xml version="1.0" encoding="UTF-8" ?>
<Book xmlns="https://hocvietcode.com" xmlns:xsi="http://.www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://hocvietcode.com Book.xsd">
<Title>Java</Title>
<Author>James Gosling</Author>
<Publisher>Oracle</Publisher>
<Price>100</Price>
</Book>
Ưu điểm của XML Schema so với DTD
Schema khắc phục những hạn chế của DTD và cho phép các ứng dụng Web trao đổi dữ liệu XML mạnh mẽ hơn mà không cần dựa vào các công cụ xác thực đặc biệt.
XML Schema cung cấp một loạt các tính năng mới:
Các kiểu dữ liệu phong phú hơn
Bản nháp schema xác định các giá trị boolean, number, date time, URI, integer, decimal, float và cả time interval.
Archtypes (nguyên mẫu)
Một nguyên mẫu cho phép xác định loại dữ liệu được đặt tên riêng từ các loại dữ liệu có sẵn. Ví dụ: người ta có thể xác định loại dữ liệu ‘ContactList’, sau đó xác định hai thành phần, “FriendList” và “OfficalList” trong kiểu đó.
Nhóm thuộc tính (Attribute grouping)
Có thể có các thuộc tính chung áp dụng cho tất cả các phần tử hoặc một số thuộc tính bao gồm các phần tử đồ họa hoặc bảng. Nhóm thuộc tính cho phép tác giả lược đồ làm rõ mối quan hệ này.
Các nguyên mẫu có thể tinh chỉnh
DTD tuân theo loại mô hình ‘đóng’. Nó mô tả tất cả và chỉ những phần tử và thuộc tính có thể xuất hiện trong nội dung của phần tử. XML Schema cho phép thêm hai khả năng: ‘mở’ và ‘có thể tinh chỉnh’. Trong mô hình nội dung ‘mở’, các yếu tố khác với các yếu tố bắt buộc cũng có thể xuất hiện. Các phần tử bổ sung có thể có mặt trong một mô hình nội dung có thể tinh chỉnh, nhưng schema phải xác định các phần tử bổ sung đó.
Ví dụ một file “mail.xsd”
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="https://hocvietcode.com" xmlns="https://hocvietcode.com">
<xs:element name="mail">
<xs:complexType>
<xs:sequence>
<xs:element name="from" type="xs:string"/>
<xs:element name="to" type="xs:string"/>
<xs:element name="subject" type="xs:string"/>
<xs:element name="body" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
File Mail.xml tương ứng:
<?xml version="1.0" ?>
<mail xmlns="https://hocvietcode.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://hocvietcode.com mail.xsd">
<from>toanngo92@gmail.com</from>
<to>helloworld@gmail.com</to>
<subject>Test</subject>
<body>Test</body>
</mail>
Khám phá Schema
Các kiểu dữ liệu được Schema hỗ trợ
XML Schema mô tả một số kiểu dữ liệu dựng sẵn, có thể được sử dụng để chỉ định và xác thực kiểu dữ liệu dự định của nội dung. Nó cũng cho phép người dùng tạo kiểu dữ liệu do người dùng xác định bằng cách mở rộng kiểu dữ liệu tích hợp sẵn bằng cách sử dụng các khía cạnh. Do đó, đề xuất XML schema xác định hai loại kiểu dữ liệu, đó là:
- Các kiểu dữ liệu tích hợp sẵn, có sẵn cho tất cả các tác giả XML Schema và phải được triển khai bởi bộ xử lý phù hợp.
- Các kiểu dữ liệu có nguồn gốc từ người dùng, được xác định trong các thể hiện Schema riêng lẻ và dành riêng cho Schema đó (mặc dù có thể nhập các định nghĩa này vào các định nghĩa khác),
Trong XML Schema, các kiểu dữ liệu có thể được phân loại thành các kiểu có sẵn và kiểu dẫn xuất.
Các kiểu dữ liệu dựng sẵn được chỉ định bởi nhóm làm việc XML là:
string
Một nhóm các ký tự được gọi là một chuỗi. Kiểu dữ liệu string có thể chứa các ký tự, xuống dòng, cartiage và ký tự tab. Chuỗi cũng có thể bao gồm tổ hợp các ký tự Unicode. Unicode là một tiêu chuẩn chung để mô tả tất cả các ký tự có thể có của tất cả các ngôn ngữ với thư viện ký hiệu với một số duy nhất cho mỗi ký hiệu.
Cú pháp:
<xs:element name="element_name" type="xs:string"/>
boolean
Kiểu dữ liệu boolean được sử dụng để chỉ định một biểu diễn toán học. Các giá trị pháp lý cho kiểu dữ liệu boolean là true và false. True có thể được thay thế bằng giá trị số 1 và false có thể được thay thế bằng giá trị 0.
<xs:attribute name="attribute_name" type="xs:boolean"/>
numeric
Kiểu dữ liệu số đại diện cho một giá trị số. Nó bao gồm các số như số nguyên và số thực.
Cú pháp:
<xs:element name="element_name" type="xs:numeric" />
dateTime
Nó đại diện cho một thời gian cụ thể vào một ngày nhất định, được viết dưới dạng một chuỗi. Ví dụ: “2001-05-10T12:35:40” có thể được coi là chuỗi ngày giờ. Ngày được chỉ định ở dạng sau “yyyy-M-DDThh:mm:ss“
Cú pháp:
<xs:element name="update_at" type="xs:dateTime" />
binary
Kiểu nhị phân có thể bao gồm các tệp đồ họa, chương trình thực thi hoặc bất kỳ chuỗi dữ liệu nhị phân nào khác. Các kiểu dữ liệu nhị phân được sử dụng để thể hiện dữ liệu có định dạng nhị phân gồm hai loại, chẳng hạn như base64Binary (dữ liệu nhị phân được mã hóa Base64) và hexBinary (dữ liệu nhị phân được mã hóa theo hệ thập lục phân).
Cú pháp:
<xs:element name="image_name" type="xs:hexBinary" />
anyURI
Mã định danh tài nguyên chung (URI) đại diện cho tên tệp hoặc vị trí của tệp
Cú pháp:
<xs:element name="image_name" type="xs:anyURI" />
Các kiểu dữ liệu bổ sung
integer
Kiểu cơ sở cho số nguyên là kiểu dữ liệu số. Nó bao gồm cả số dương và số âm.
Cú pháp:
<xs:element name="element_name" type="xs:integer" />
decimal
Nó có thể đại diện cho các phần phân số chính xác. Kiểu cơ sở cho số thập phân là kiểu dữ liệu số. Kiểu dữ liệu thập phân được sử dụng để chỉ định một giá trị số.
Cú pháp:
<xs:element name="element_name" type="xs:decimal" />
time
:à kiểu dữ liệu thời gian. Biểu diễn mặc định là 16:35:26. Kiểu dữ liệu thời gian được sử dụng để chỉ định thời gian. Thời gian được chỉ định ở dạng sau “hh:mm:ss” trong đó, hh là giờ, mm là phút và ss là giây.
Cú pháp:
<xs:element name="element_name" type="xs:time" />
Schema Vocabulary (từ vựng lược đồ)
Tạo một lược đồ bằng cách sử dụng từ vựng lược đồ XML giống như tạo bất kỳ tài liệu XML nào khác bằng cách sử dụng một từ vựng chuyên biệt. Để hiểu từ vựng Lược đồ XML và các phần tử, ví dụ này thảo luận về một tài liệu XML sẽ được xác thực dựa trên một lược đồ.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetnamespace="https://hocvietcode.com" xmlns="https://hocvietcode.com" elementFormDefault="qualified">
<xs:element name="Book">
<xs:complexType>
<xs:sequence>
<xs:element name="Title" type="xs:string"/>
<xs:element name="Author" type="xs:string"/>
<xs:element name="Publisher" type="xs:string"/>
<xs:element name="Price" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Xét đoạn mã highlight phía trên:
xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
Mọi Lược đồ XML đều bắt đầu bằng phần tử gốc . Mã chỉ ra rằng các phần tử và kiểu dữ liệu được sử dụng trong lược đồ được lấy từ namespace “http://www.w3.org/2001/XMLSchema” và có tiền tố là xs.
targetNamespace="https://hocvietcode.com"
Nó xác định rằng các thành phần được xác định trong một tài liệu XML đề cập đến lược đồ này, đến từ namespace “https://hocvietcode.com”
xmlns="https://hocvietcode.com"
Dòng mã này trỏ đến “https://hocvietcode.com” làm namespace mặc định.
elementFormDefault="qualified"
Nó chỉ ra rằng các phần tử được sử dụng bởi thực thể tài liệu XML đã được khai báo trong lược đồ này cần phải đủ điều kiện theo namespace.
Xét file XML mà schema này định nghĩa:
<?xml version="1.0" ?>
<Mail xmlns="https://hocvietcode.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://hocvietcode.com mail.xsd">
<from>toanngo92@gmail.com</from>
<to>helloworld@gmail.com</to>
<subject>Test</subject>
<body>Test</body>
</Mail>
Giải thích cho khu vực highlight:
xmlns="https://hocvietcode.com"
Nó chỉ ra khai báo namespace mặc định. Dấu phân cách này thông báo cho trình xác nhận lược đồ rằng tất cả các phần tử được sử dụng trong tài liệu XML này được khai báo trong namespace mặc định (“https://hocvietcode.com”).
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
Đây là thực thể namespace có sẵn cho lược đồ XML.
xsi:schemaLocation="https://hocvietcode.com mail.xsd"
Thuộc tính schemaLocation này có hai giá trị. Giá trị đầu tiên xác định namespace. Giá trị thứ hai là vị trí của lược đồ XML nơi nó được lưu trữ.
Làm việc với kiểu dữ liệu phức tạp
Một lược đồ gán một kiểu cho từng thành phần và thuộc tính mà nó khai báo. Các phần tử có kiểu phức tạp có thể chứa các phần tử lồng nhau và có các thuộc tính. Chỉ các phần tử có thể chứa các kiểu phức tạp (complex). Các phần tử loại phức tạp có bốn biến thể:
Phần tử rỗng
Các phần tử trống có thể chỉ định các loại thuộc tính, nhưng không cho phép nội dung như trong ví dụ sau:
Chỉ chứa phần tử
Chỉ chứa văn bản
Các phần tử này chỉ có thể chứa văn bản và tùy chọn có thể có hoặc không có thuộc tính như trong ví dụ sau:
Trộn lẫn (mixed)
Đây là những phần tử có thể chứa nội dung văn bản cũng như các thành phần con bên trong phần tử như trong ví dụ sau. Chúng có thể có hoặc không có thuộc tính.
Định nghĩa kiểu phức tạp
Một yếu tố phức tạp có thể được xác định theo hai cách khác nhau. Các mã sau xác định các thuộc tính của phần tử phức tạp.
Đặt tên trực tiếp cho phần tử
Phần tử Student có thể được khai báo bằng cách đề cập trực tiếp đến nó trong lược đồ. Kiểu phức tạp(complex) đề cập rằng tài liệu XML chứa các phần tử XML lồng nhau. Phần tử trình tự(sequence) chỉ ra rằng các phần tử con FirstName, MiddleNane và LastName xuất hiện theo thứ tự như chúng được khai báo.
Bằng cách sử dụng thuộc tính tên và kiểu của loại phức tạp
Phần tử Student có thể có một loại chẳng hạn như PersonInfo đề cập đến tên của loại phức tạp. Một số phần tử có thể sử dụng lại kiểu phức tạp này bằng cách tham chiếu đến tên PersonInfo trong phần khai báo kiểu phức hợp của chúng.
Thuộc tính minOccurs và maxOccurs
Khi làm việc với các DTD, chúng ta đã sử dụng các dấu *,? và + để chỉ ra số lần một phần tử con cụ thể có thể được sử dụng làm nội dung cho một phần tử. Tương tự, lược đồ XML cho phép chỉ định số lần tối thiểu và tối đa mà một phần tử có thể xuất hiện .Trong các lược đồ, cả phần tử và thuộc tính đều sử dụng các thuộc tính sau:
minOccurs
minOccurs chỉ định số lần xuất hiện tối thiểu của phần tử trong tài liệu XML. Giá trị mặc định cho thuộc tính minoccurs là 1. Nếu một phần tử có giá trị minOccurs bằng 0, thì đó là tùy chọn. Một thuộc tính là tùy chọn, nếu minOccurs là 0. Nếu minOccurs được đặt thành 1, thì thuộc tính này là bắt buộc.
maxOccurs
maxOccurs chỉ định số lần xuất hiện tối đa của phần tử trong tài liệu XML. Giá trị mặc định cho thuộc tính maxoccurs là 1. Nếu giá trị của nó được giữ nguyên, điều đó có nghĩa là phần tử có thể xuất hiện không giới hạn số lần. Thuộc tính maxOccurs mặc định là 1 trừ khi nó được chỉ định.
Ví dụ này chỉ ra rằng phần tử Quantity có thể xảy ra tối thiểu là 0 lần và tối đa là 100 trăm lần trong phần tử Book.
Mối quan hệ giữa minOccurs và maxOccurs:
Phần tử nội dung
Một loại phức tạp có thể đề cập đến nội dung phần tử. Phần tử Nội dung chỉ có thể chứa các phần tử. Có thể có các trường hợp trong đó các phần tử được chứa cũng có thể có các phần tử con.
Ví dụ file book.xml
Ví dụ file book.xsd
Trong tài liệu XML, mỗi phần tử Author và Publisher đều chứa các phần tử Name. Vì vậy, không thể sử dụng các loại dữ liệu tích hợp sẵn như xs:string, thay vào đó, AuthorName và PublisherName có thể được xác định bằng cách sử dụng các phần tử xs:complexType cấp cao nhất.
Nội dung kết hợp/trộn lẫn (Mixed content)
Kiểu phức tạp (complex type) có thể chỉ định nội dung của nó là nội dung hỗn hợp(mixed content). Nội dung hỗn hợp có thể chứa văn bản trộn lẫn với các yếu tố. Thứ tự và số lượng phần tử xuất hiện trong nội dung hỗn hợp cũng có thể được chỉ định trong lược đồ, Loại nội dung này có thể có hoặc có thể có các thuộc tính.
Nội dung hỗn hợp được khai báo giống hệt như vậy, việc khai báo nội dung phần tử được thực hiện. Tiện ích bổ sung duy nhất cho khai báo là nó nhận một thuộc tính hỗn hợp được đặt thành giá trị thực.
Đoạn mã sau thể hiện các thuộc tính của nội dung hỗn hợp:
Book.xml
<Books>Apocalypse written by <Author> Mary Jan </Author> is of Genre <Category> Fiction </Type></Books>
Book.xsd
Cấu trúc nhóm (Grouping Construct)
Ngôn ngữ lược đồ XML cung cấp ba cấu trúc nhóm xác định xem thứ tự của các phần tử riêng lẻ có quan trọng hay không và cách sắp xếp như thế nào:
xs:all
Cấu trúc nhóm này yêu cầu mỗi phần tử trong nhóm phải xuất hiện nhiều nhất một lần, nhưng Thứ tự đó không quan trọng. Lưu ý duy nhất là trong kiểu nhóm này, thuộc tính minoccurs có thể là 0 hoặc 1 và thuộc tính maxoccurs phải là 1, Đoạn mã sau thể hiện khái niệm này.
xs:choice
Phần tử lựa chọn là yếu tố đối lập với phần tử tất cả. Thay vì yêu cầu tất cả các yếu tố phải có mặt, nó sẽ chỉ cho phép một trong các lựa chọn xuất hiện. Phần tử lựa chọn cung cấp một biểu diễn XML để mô tả một lựa chọn từ một tập hợp các loại phần tử. Bản thân phần tử lựa chọn có thể có các thuộc tính minOccurs và maxOccurs thiết lập chính xác số lượng lựa chọn có thể được thực hiện từ lựa chọn đó. Đoạn mã sau thể hiện khái niệm này:
Trong đoạn mã, có ba phần tử con loại trừ lẫn nhau. Khi phần tử xs:choice bị loại bỏ, chỉ một phần tử trong số các lựa chọn có thể là phần tử con của phần tử cha AddressInfo.
xs:sequence
Phần tử xs:sequence chỉ định từng phần tử của chuỗi xuất hiện theo cùng một thứ tự trong tài liệu cá thể như được đề cập trong phần tử xs:sequence. Số lần mỗi phần tử được phép xuất hiện có thể được kiểm soát bởi thuộc tính minoccurs và maxOccurs của phần tử. Mã sau thể hiện khái niệm này.
Làm việc với các kiểu đơn giản
Định nghĩa một phần tử kiểu đơn giản
Kiểu đơn giản là một phần tử hoặc thuộc tính XML, chỉ chứa văn bản và không có phần tử hoặc thuộc tính nào khác. Các khai báo kiểu đơn giản được sử dụng để tạo thành dữ liệu văn bản và chỉ định loại dữ liệu được phép trong các thuộc tính và thành phần.
Cú pháp:
<xs:element name="XXXX" type="YYYY" />
Trong cú pháp này, “XXXX” là tên của phần tử, “YYYY” là kiểu dữ liệu của phần tử.
Đoạn mã sau chứng minh rằng phần tử TotalNoOfPages có thể được chỉ định là một loại số nguyên và là một số nguyên dương có ba chữ số.
book.xml
book.xsd
Các kiểu dữ liệu được sử dụng với các kiểu đơn giản
Các phần tử của kiểu đơn giản có xu hướng mô tả nội dung và kiểu dữ liệu của tài liệu, hơn là cấu trúc của nó:
Trong Lược đồ XML, người ta có thể đề cập đến loại dữ liệu mà một phần tử có thể chứa bằng cách gán cho nó một định nghĩa kiểu đơn giản cụ thể. Vì vậy, dựa trên loại dữ liệu mà nó hỗ trợ, lược đồ XML chia các phần tử của các kiểu đơn giản thành hai loại lớn:
- Kiểu đơn giản dựng sẵn
- Kiểu đơn giản do người dùng định nghĩa
Kiểu đơn giản dựng sẵn
Có một số kiểu đơn giản dựng sẵn, chẳng hạn như số nguyên, ngày tháng, dấu chấm động và chuỗi mà người ta có thể sử dụng mà không cần sửa đổi thêm.
Một phần tử đơn giản được xây dựng sẵn có thể chứa một giá trị mặc định hoặc một giá trị cố định. Giá trị ‘mặc định’ là giá trị được gán tự động cho phần tử khi không có giá trị nào khác được chỉ định. Một giá trị cố định được gán cho một phần tử, khi không cần thay đổi giá trị cho phần tử đó.
Cú pháp:
<xs:element name="XXXX" type="YYYY" default="zzzz"/>
Trong cú pháp này, “XXXX” là tên của phần tử, “YYYY” là kiểu dữ liệu của phần tử và “ZZZZ” là giá trị mặc định được chỉ định cho phần tử.
Ví dụ:
Các kiểu đơn giản do người dùng định nghĩa
Lược đồ XML hỗ trợ thư viện các kiểu dữ liệu dựng sẵn. Tuy nhiên, trong quá trình viết các tài liệu lược đồ phức tạp, nhà phát triển có thể cần một loại dữ liệu không được xác định trong đề xuất lược đồ. Ví dụ: hãy xem xét việc khai báo một phần tử . Nó thực hiện các hạn chế có sẵn cho nội dung của nó để chấp nhận các giá trị số không âm, nhưng nó vẫn chấp nhận các giá trị không mong muốn, chẳng hạn như:
<Angleteasure>490</AngleMeasure>
Theo khai báo lược đồ, “490” là một giá trị số dương hợp lệ, nhưng nó vẫn cần loại số cho phép các giá trị có phạm vi từ 0 đến 360 (vì dữ liệu biểu diễn góc độ). Do đó, có thể tạo loại dữ liệu tùy chỉnh do người dùng xác định bằng cách sử dụng định nghĩa.
Các mã sau thể hiện các thuộc tính của các kiểu đơn giản do người dùng định nghĩa:
- Đoã mã tạo ra một loại dữ liệu mới gọi là “angleMeasure’
- Các phần tử kiểu này có thể chứa các giá trị nguyên.
- Giá trị của “angleMeasure” phải nằm trong phạm vi từ “0” đến “360”.
- Điều này tạo ra một loại dữ liệu mới được gọi là “triangle”.
- Các phần tử kiểu này có thể chứa các phần tử kiểu triangle.
- Các phần tử của loại này có thể có giá trị isosceles, right-angled, equilateral
Sự hạn chế/chặt chẽ (Restriction)
Việc khai báo một kiểu dữ liệu đặt ra những hạn chế nhất định đối với nội dung của một phần tử hoặc thuộc tính XML. Nếu một phần tử XML thuộc loại “xs:integer” và chứa một chuỗi chẳng hạn như “Chào mừng”, thì phần tử đó sẽ không được xác thực. Những hạn chế này được gọi là các hạn chế/chặt chẽ, xác định các giá trị được phép cho các phần tử và thuộc tính XML.
Các hạn chế có thể được chỉ định cho các phần tử SimpleType và các loại hạn chế được khai báo bằng cách sử dụng khai báo . Về cơ bản, khai báo được sử dụng để khai báo một SimpleType dẫn xuất, là một tập hợp con của SimpleType cơ sở của nó. Giá trị của thuộc tính cơ sở có thể là bất kỳ kiểu dữ liệu SimpleType hoặc XML Schema dựng sẵn nào hiện có.
Cú pháp:
<restriction base="name of the simpleType you are deriving from">
Trong khai báo này, kiểu dữ liệu cơ sở có thể được chỉ định bằng thuộc tính base. Đoạn mã sau minh họa một kiểu “Age” đơn giản được lấy bằng cách chỉ định cơ sở là kiểu số nguyên.
Khía cạnh (facets)
Với Lược đồ XML, các hạn chế tùy chỉnh có thể được chỉ định trên các phần tử và thuộc tính XML. Những hạn chế này được gọi là các khía cạnh.
Các khía cạnh được sử dụng để hạn chế tập hợp hoặc phạm vi giá trị mà một loại dữ liệu có thể chứa. Phạm vi giá trị được xác định bởi khía cạnh phải bằng hoặc hẹp hơn phạm vi giá trị của loại cơ sở.
Có 12 phần tử facet, được khai báo bằng một cú pháp chung. Chúng đều có một thuộc tính giá trị bắt buộc cho biết giá trị của khía cạnh. Một hạn chế có thể chứa nhiều khía cạnh. Mọi giá trị xuất hiện trong thực thể và không gian giá trị phải tuân theo tất cả các khía cạnh được liệt kê.
Facet | Description |
minExclusive | Chỉ định giá trị tối thiểu cho loại không bao gồm giá trị được cung cấp. |
minInclusive | Chỉ định giá trị tối thiểu cho loại bao gồm giá trị được cung cấp. |
maxExclusive | Chỉ định giá trị tối đa cho loại không bao gồm giá trị được cung cấp. |
maxInclusive | Chỉ định giá trị tối đa cho loại bao gồm giá trị được cung cấp. |
TotalDigits | Chỉ định tổng số chữ số trong một kiểu số. |
fractionDigits | Chỉ định số chữ số phân số trong một kiểu số. |
length | Chỉ định số mục trong kiểu danh sách hoặc số ký tự trong kiểu chuỗi. |
minLength | Chỉ định số mục tối thiểu trong kiểu danh sách hoặc số ký tự tối thiểu trong kiểu chuỗi. |
maxLength | Chỉ định số mục tối đa trong kiểu danh sách hoặc số ký tự tối đa trong kiểu chuỗi. |
enumeration (liệt kệ) | Chỉ định một giá trị được phép trong khoảng trắng danh sách liệt kê Chỉ định cách xử lý khoảng trắng trong loại. |
whiteSpace | Chỉ định một giá trị được phép trong khoảng trắng danh sách liệt kê Chỉ định cách xử lý khoảng trắng trong loại. |
pattern | Hạn chế các loại chuỗi. |
Cú pháp:
Ở đây, phép liệt kê facet được thêm vào hạn chế với thuộc tính giá trị là isosceles, right-angled, hoặc equilateral. Vì vậy, một phần tử được khai báo là kiểu tam giác phải là một chuỗi có giá trị isosceles, right-angled, hoặc equilateral,
Attributes – thuộc tính
Các phần tử XML có thể chứa các thuộc tính mô tả các phần tử. Trong các Lược đồ XML, các dấu phân cách thuộc tính tương tự như các khai báo phần tử. Để khai báo một thuộc tính, phần tử được sử dụng.
Một thuộc tính có thể được chỉ định là bắt buộc hay tùy chọn hoặc liệu nó có giá trị mặc định hay không. Giá trị mặc định được tự động gán cho thuộc tính khi không có giá trị nào khác được chỉ định.
Thuộc tính sử dụng xác định xem thuộc tính là bắt buộc hay tùy chọn. Dưới đây là các giá trị khác nhau có thể được gán cho các thuộc tính:
Default
Giá trị mặc định được tự động gán cho thuộc tính khi không có giá trị nào khác được chỉ định. Ví dụ:
<xs:attribute name="genre" type="xs:string" default="fiction"/>
Trong mã này, giá trị mặc định của thuộc tính genre là fiction.
Fixed
Giá trị này làm cho thuộc tính cố định. Một giá trị cố định được gán tự động cho thuộc tính và không thể chỉ định một giá trị khác. Ví dụ:
<xs:attribute name="genre" type="xs:string" fixed="fiction"/>
Trong mã này, giá trị fixed “fiction” được gán cho thuộc tính genre do đó không thể chỉ định giá trị khác cho thuộc tính.
Optional
Giá trị này làm cho thuộc tính trở thành tùy chọn, có nghĩa là thuộc tính có thể có bất kỳ giá trị nào. Giá trị mặc định cho bất kỳ thuộc tính nào là tùy chọn.
<xs:attribute name="genre" type="xs:string" use="optional"/>
Trong mã này, thuộc tính thể loại có thể nhận bất kỳ giá trị chuỗi nào.
Prohibited
Giá trị này có nghĩa là thuộc tính không thể được sử dụng. Ví dụ:
<xs:attribute name="genre" type="xs:string" use="prohibited" />
Required
Giá trị này làm cho thuộc tính bắt buộc. Thuộc tính có thể có bất kỳ giá trị nào. Ví dụ:
<xs:attribute name="genre" type="xs:string" use="required" />
Trong dòng mã này, thuộc tính genre phải được sử dụng trong phần khai báo phần tử XML
Cú pháp:
<xs:attribute name="Attribute_name" type="Attribute_datatype" />
Trong đó:
- Attribute_name là tên của thuộc tính.
- Attribute_datatype xác định kiểu dữ liệu của thuộc tính. Có rất nhiều kiểu dữ liệu dựng sẵn trong lược đồ XML chẳng hạn như chuỗi, số thập phân, số nguyên, boolean, ngày tháng và thời gian.
Trong ví dụ sau, các phần tử xs:attribute xuất hiện sau xs:sequence và xe:group tạo thành phần thân của phần tử. Tên phần tử có thể có một thuộc tính tùy chọn có tên age với kiểu lnteger dương.
Bài tập
Bài 1:
Tạo một tài liệu XML đơn giản để mô tả thông tin cá nhân của bạn, bao gồm tên (sttring), tuổi (integer), địa chỉ (string), và số điện thoại (string). Sau đó, viết một XSD để định nghĩa cấu trúc và kiểu dữ liệu của tài liệu này.
Bài 2:
Xây dựng một tài liệu XML cho danh sách các sản phẩm trong một cửa hàng trực tuyến. Sử dụng XSD để định nghĩa cấu trúc dữ liệu cho danh sách sản phẩm, mỗi sản phẩm bao gồm tên sản phẩm (string), giá (float), và mô tả(string). Mỗi sản phẩm có thuộc tính type, (giá trị type có thể là simple, variable)
Bài 3:
Tạo một tài liệu XML để biểu diễn thông tin về đơn đặt hàng trong một cửa hàng trực tuyến, bao gồm danh sách sản phẩm (bán 1 hoặc nhiều sản phẩm), số lượng cho từng sản phẩm, và địa chỉ giao hàng. Đảm bảo sử dụng XSD để xác định cấu trúc dữ liệu của tài liệu.