Khanh Hoang - Kenn
Kenn is a user experience designer and front end developer who enjoys creating beautiful and usable web and mobile experiences.
Bài viết này giúp cho các bạn hiểu được XML Schema và các đặc điểm của nó như cấu trúc Schema, các thành phần của Schema và các kiểu dữ liệu của Schema
>> [Loạt bài viết] Bài 3: Document Type Definition (DTDs) là gì?
Như đã giới thiệu trong bài Document Type Definitions (DTDs), chúng ta có thể kiểm tra cấu trúc file XML, tính đúng đắn của dữ liệu trong XML bằng DTDs. Tuy nhiên phương pháp này có nhiều hạn chế như: không có nhiều dạng kiểu dữ liệu, không qui định được khoảng giá trị…. Chính vì thế Schema được tạo ra để khắc phục tất cả các nhược điểm của DTDs. Như vậy về mặc cơ bản mục tiêu của Schema hoàn toàn giống như DTDs:
- Định nghĩa cấu trúc các thành phần có trong XML
- Định nghĩa các thuộc tính có trong Schema
- Định nghĩa các thành phần con và thứ tự xuất hiện của chúng trong thành phần cha
- Định nghĩa một thành phần là rỗng hay có chứa text
- Định nghĩa kiểu dữ liệu cho các thành phần và thuộc tính
- Định nghĩa giá trị mặc định cho thuộc tính
Tóm lại Schema được phát tirển trên nền tảng DTDs, tuy nhiên Schema có nhiều ưu điểm vượt trội hơn như:
- Schema viết theo định dạng như XML nên người dùng quen thuộc hơn so với DTDs, người dùng không cần phải làm quen với cấu trúc mới
- Schema có thể mở rộng còn DTDs thì không: có thể sử dụng cho shema khác, người dùng có thể tự định nghĩa ra kiểu dữ liệu riêng từ các kiểu dữ liệu chuẩn, có thể dùng nhiều Schema cho 1 file XML cùng lúc
- Schema hỗ trợ Namespace
- Schema hỗ trợ nhiều dạng kiểu dữ liệu: dễ dàng kiểm tra tính đúng đắn của dữ liệu, dễ dàng khai báo định dạng, phạm vi của dữ liệu.
Trong Schema, kiểu dữ liệu được chia làm 2 loại: kiểu dữ liệu có sẵn và kiểu dữ liệu do người dùng tự định nghĩa
- string: dạng chuỗi
- boolean: dạng luận lý
- numeric: dạng số
- dateTime: dạng ngày tháng, thời gian
- binary: dạng nhị phân
- anyURI: các chuỗi URI
- integer: số nguyên
- decimal: số thập phân
- time: thời gian
Thẻ <schema> là thẻ gốc cho tất cả các file schema, thẻ <schema> có một số thuộc tính như sau
<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3schools.com" elementFormDefault="qualified"> ... ... </xsd:schema> ... </xsd:schema[/B]>[/PHP]
- xmlns:xsd="http://www.w3.org/2001/XMLSchema" : chỉ ra rằng các kiểu element, kiểu dữ liệu dùng trong schema được khai báo trong namespace http://www.w3.org/2001/XMLSchema với tiền tố xsd
- xmlns="http://www.w3schools.com": namespace mặc định là http://www.w3school.com
- elementFormDefault="qualified": chỉ ra rằng tên các thành phần được sử dụng trong file XML có khai báo schema phải thỏa mãn các khai báo namespace
Có 2 dạng khai báo Element trong schema là simple element và complex element
- Simple Element: được dùng để khai báo cho các element chỉ chứa text không có khai báo các thẻ con hay thuộc tính
- Complex Element: complex element được dùng khai báo các khai báo Element có chứa element con, thuộc tính… có 4 dạng complex element:
- Element rỗng:
<product pid="1345"/>
- Element chỉ chứa các thẻ con
<employee> <firstname>John</firstname> <lastname>Smith</lastname></employee>
- Element chỉ chứa text
<food type="dessert">Ice cream</food>
- Element chứa thẻ con và text
<description>It happened on <date lang="norwegian">03.03.99</date> ....</description>
- Cú pháp khai báo 1 complex element như sau:
<xsd:element name=”tên thẻ”> <xsd:complexType>
Nội dung thẻ
</xsd:complexType> </xsd:element>
- Ví dụ: <product prodid="1345" />
- Như khai báo trên chúng ta thấy thẻ product có 1 thuộc tính prodid chỉ nhận giá trị là số chúng ta khai báo như sau:
<xsd:element name="product"> <xsd:complexType> <xsd:attribute name="prodid" type="xsd:positiveInteger"/> </xsd:complexType> </xsd:element>
- Trong đó <xsd:attribute name="tên thuộc tính" type="xsd:type"/> dùng để khai báo thuộc tính
- Ví dụ:
<person> <firstname>John</firstname> <lastname>Smith</lastname> </person>
- Như khai báo XML chúng ta thấy thẻ <person> có 2 thẻ con là firstName và lastName, và nội dung 2 thẻ này là dạng chuỗi
<xsd:element name="person"> <xsd:complexType> <xsd:sequence> <xsd:element name="firstname" type="xsd:string"/> <xsd:element name="lastname" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element>
- Trong đó <xsd:sequence> dùng để khai báo thứ tự các thẻ con trong complex element.
- Ví dụ
<shoesize country="france">35</shoesize>
- Trong thẻ <shoesize> trên chúng ta thấy có 1 thuộc tính country dạng chuỗi và nội dung của thẻ là dạng số, chúng ta viết schema như sau:
<xsd:element name="shoesize"> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="xsd:integer"> <xsd:attribute name="country" type="xsd:string" /> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element>
- Ví dụ:
<letter> Dear Mr.<name>John Smith</name>. Your order <orderid>1032</orderid> will be shipped on <shipdate>2001-07-13</shipdate>. </letter>
- Trong thẻ <letter> trên chúng ta vừa có text vừa có các thẻ con, chúng ta khao báo schema như sau:
<xsd:element name="letter"> <xsd:complexType mixed="true"> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element name="orderid" type="xsd:positiveInteger"/> <xsd:element name="shipdate" type="xsd:date"/> </xsd:sequence> </xsd:complexType> </xsd:element>
- Cú pháp: <xsd:element name="xxx" type="yyy"/>
- Ví dụ:
<lastname>Refsnes</lastname>
<age>36</age>
<dateborn>1970-03-27</dateborn>
- Schema:
<xsd:element name="lastname" type="xsd:string"/> <xsd:element name="age" type="xsd:integer"/> <xsd:element name="dateborn" type="xsd:date"/>
- Khai báo Attribute: Simple Element không thể có Attribute, khi 1 thẻ có Attribute, thẻ đó phải được khai báo ở dạng Complex Element, tuy nhiên 1 Attribute chúng ta có thể khai báo dưới dạng Simple Element theo cú pháp sau:
<xs:attribute name="xxx" type="yyy"/>
- Ví dụ:
<lastname lang="EN">Smith</lastname>
- Schema:
<xsd:attribute name="lang" type="xsd:string"/>
- Chúng ta có thể kiểm soát các thẻ được sử dụng như thế nào trong XML bằng các Indicator. Có 5 dạng Indicator:
- <xsd:all> các thẻ con có thể xuất hiện với thứ tự bất kỳ và các thẻ con phải xuất hiện 1 lần duy nhất. Ví dụ
<xs:element name="person"> <xs:complexType> <xs:all> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:all> </xs:complexType> </xs:element>
- <xsd:choice> chỉ 1 thẻ con trong các thẻ được phép xuất hiện.
Ví dụ:
<xs:element name="person"> <xs:complexType> <xs:choice> <xs:element name="employee" type="employee"/> <xs:element name="member" type="member"/> </xs:choice> </xs:complexType> </xs:element>
-<xsd:sequence>: qui định thứ tự của các thẻ con.
Ví dụ:
<xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element>
- <xsd:maxOccurs>: số lần xuất hiện tối đa, <minOccurs> số lần xuất hiện tối thiểu.
Ví dụ:
<xs:complexType> <xs:sequence> <xs:element name="full_name" type="xs:string"/> <xs:element name="child_name" type="xs:string" maxOccurs="10" minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:element>