Tài liệu giảng dạy môn Chuyên đề Công nghệ XML và Ứng dụng 54 Chương 5 LƯỢC ĐỒ XML Mục tiêu học tập Sau khi học xong chương này người học sẽ Hiểu được lược đồ XML là gì, lược đồ theo chuẩn W3C Định[.]
Trang 1Chương 5
LƯỢC ĐỒ XML
Mục tiêu học tập: Sau khi học xong chương này người học sẽ:
- Hiểu được lược đồ XML là gì, lược đồ theo chuẩn W3C
- Định nghĩa được kiểu dữ liệu cho các phần tử trong lược đồ (kiểu đơn giản
và kiểu phức hợp)
- Ứng dụng được lược đồ vào tài liệu XML
Tóm tắt chương
Để tài liệu XML của chúng ta hợp lệ, chúng ta phải định nghĩa kiểu tư liệu cho các phần tử Chúng ta có thể sử dụng khai báo DTD cho mục đích này, tuy nhiên DTD
không phải là cách duy nhất Định nghĩa kiểu tư liệu còn có thể dựa vào lược đồ
(schema) Chương này chúng ta sẽ tìm hiểu khái niệm và cách sử dụng lược đồ để khai
báo kiểu tư liệu cho các phần tử thay cho định nghĩa DTD
5.1 Tại sao chúng ta nên dùng XML Schema?
Xuất phát từ những hạn chế của DTD như: DTD sử dụng cú pháp khác so với
cú pháp dùng trong trang XML làm cho người dùng phải nhớ nhiều cú pháp; DTD chỉ
hỗ trợ được 10 kiểu dữ liệu Ngoài ra DTD còn hạn chế về khả năng định nghĩa các
ràng buộc dữ liệu
- XML Schema sử dụng cùng cú pháp với trang XML làm cho người dùng dễ
nhớ ngoài ra nó còn hỗ trợ được 44 kiểu dữ liệu XML schema cho phép người dùng
tự định nghĩa kiểu dữ liệu mới, định nghĩa các ràng buộc dữ liệu XML schema bảo
toàn sự giao tiếp dữ liệu, ràng buộc các khóa và tham chiếu mạnh hơn so với DTD
đồng thời nó còn tích hợp được với không gian tên (namespace)
- XML Schema mô tả:
+ Các phần tử và thuộc tính trong tài liệu XML + Thứ tự và số lượng các phần tử con
+ Các kiểu dữ liệu của phần tử và thuộc tính
5.2 Các thành phần trong một XML Schema
Trong một XML Schema có các thành phần sau:
- Thành phần schema
- Element
Trang 2- Các thuộc tính có thể xuất hiện trong trang XML
- Định nghĩa các kiểu dữ liệu
5.2.1 Thành phần schema
Điểm cơ bản nhất để hiểu về lược đồ XML là hiểu khái niệm sử dụng kiểu đơn giản và kiểu phức hợp trong khai báo kiểu cho các phần tử XML
Để chỉ định kiểu cho các phần tử, chúng ta phải bảo đảm kiểu đã được định nghĩa trước đó Như đã nêu trên, kiểu phức hợp là kiểu chứa các phần tử con trong nó
hoặc chứa thêm thuộc tính trong khi kiểu giản đơn thì không Kiểu giản đơn là kiểu
nội tại đã được định nghĩa sẵn và chúng ta có thể dùng tự do trong lược đồ XML
Schema là phần tử gốc (element root) của mỗi trang tài liệu
- Khai báo:
<xsd:schema
xmlns:xsd=http://www.w3.org/2001/XMLSchema
targetNamespace=http://www.books.org xmlns=http://www.books.org
elementFormDefault=“qualifed”>
<! nội dung của schema >
</xsd:schema>
Mỗi XML Schema được bắt đầu bằng thành phần (element root)
<xsd:schema
xmlns:xsd=http://www.w3.org/2001/XMLSchema version=“1.0”>
- Các thành phần và các kiểu dữ liệu trong schema như:
- schema, element, complexType, sequence, string nằm trong namespace:
http:// /XML schema
- targetNamespace=http://www.books.org namespace của những thành phần định nghĩa trong schema
- Ví dụ như Book, Title, Author, date, ISBN, Publisher nằm trong http://www.books.org namespace
elementFormDefault=“qualified” kiểm tra tính hợp lệ của tất cả các elements trong
trang XML
elementFormDefault=“unqualified” chỉ kiểm tra tính hợp lệ của các global element
Trang 3* Chú ý:
- Thuộc tính targetNamespace là một tùy chọn có thể không cần chỉ ra
targetNamespace cho một schema
5.2.2 Tham chiếu đến schema từ trang XML
<?xml version =“1.0”?>
<BookStore xmlns=http://www.books.org xmlns:xsl=http://www.w3.org/2001/XMLschema-instance
<book> xsl:schemaLocation=:http://www.books.org BookStore.xsd”
<title>My life and Times</title>
<author>Paul MeCartney</author>
<date>July, 1998</date>
<ISBN>94303-12021-43892</ISBN>
<puplisher>MeMilin Puplishing</puplisher>
</book>
</BookStore>
- Khai báo namespace mặc định, thông báo cho schema- validator biết tất cả các
thành phần khai báo trong trang XML là có trong http://www.books.org namespace
- Thông báo cho schema-validator biết rằng thuộc tính schemaLocation là nằm
trong XMLschema-instance namespce
- Với schemaLocation thông báo cho schema - validator biết rằng
http://www.books.org namespace là được định nghĩa trong BookStore.xsd
5.3 Quá trình kiểm tra tính hợp lệ của một trang XML
Đầu tiên trình duyệt sẽ kiểm tra tính hợp lệ của dữ liệu trong trang XML trước, căn cứ vào cấu trúc dữ liệu khai báo trong trang BookStore.xsd Sau đó tiếp tục kiểm
tra tính hợp lệ của trang BookStore.xsd, căn cứ vào các luật mô tả trong
XMLSchema.xsd
Trang 4Ví dụ:
<?xml version="1.0"?>
<xsd:schema xmlns:xsd=“http://www.w3.org/2001/XMLSchema”
targetNamespace=“http://www.w3schools.com”
xmlns=“http://www.w3schools.com”
elementFormDefault="qualified">
<xsd:element name="note">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="to" type="xsd:string"/>
<xsd:element name="from" type="xsd:string"/>
<xsd:element name="heading" type="xsd:string"/>
<xsd:element name="body" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
5.4 Lược đồ và không gian tên
<schema xmlns=http://www.w3.org/2001/XMLSchema
targetNamespace=“http://www.w3schools.com”>
…
</schema>
- http://www.w3.org/2001/XMLSchema: namespace của các từ khóa dùng trong sự
xác định lược đồ XML, ví dụ: schema, targetNamespace,…
- targetNamespace: định nghĩa namespace của lược đồ được xác định trong tài
liệu <schema>…</schema> trên
5.5 Xây dựng lược đồ từ nhiều thành phần
<schema xmlns=http://www.w3.org/2001/XMLSchema
targetNamespace=“http://xyz.edu/Admin”>
<include schemaLocation=“http://xyz.edu/StudentTypes.xsd”>
<include schemaLocation=“http://xyz.edu/ClassTypes.xsd”>
<include schemaLocation=“http://xyz.edu/CourseTypes.xsd”>
…
</schema>
<include>: giống như #include trong ngôn ngữ C schemaLocation: cho biết nơi để lấy thông tin
Trang 55.6 Khai báo phần tử trong XML Schema
Phần tử <schema> là phần tử gốc trong các tài liệu XML Schema
<?xml version="1.0"?>
<xsd:schema xmlns:xsd=http://www.w3.org/2001/XMLSchema
targetNamespace=http://www.w3schools.com
xmlns=http://www.w3schools.com
elementFormDefault="qualified">
</xsd:schema>
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
Phần tử và loại dữ liệu trong lược đồ được khai báo trong namespace http://www.w3.org/2001/XMLSchema và có tiền tố là xsd
targetNamespace=http://www.w3schools.com
Các phần tử được định nghĩa trong lược đồ từ namespace http://www.w3schools.com xmlns="http://www.w3schools.com"
namespace mặc định là xmlns="http://www.w3schools.com"
elementFormDefault="qualified”
Bất kỳ phần tử nào được sử dụng trong tài liệu XML phải từ namespace đảm bảo chất lượng
5.7 Các kiểu phần tử
- Kiểu giản đơn (Simple type): là một phần tử XML chỉ có kiểu dữ liệu text, mà
không có thuộc tính hoặc không thể chứa các phần tử khác Kiểu text cũng có thể có
nhiều loại:
+ Built-in data type + User-defined data type Người dùng có thể thêm ràng buộc cho kiểu dữ liệu để giới hạn nội dung của
nó, hoặc yêu cầu dữ liệu thỏa mãn một mẫu nào đó
- Kiểu phức hợp (Complex type): là một phần tử XML có thuộc tính, hoặc chứa
các phần tử con khác
5.7.1 Định nghĩa một phần tử giản đơn
<xsd:element name="xxx" type="yyy"/>
xxx: tên của phần tử yyy: kiểu dữ liệu của phần tử
Trang 65.7.2 Các kiểu dữ liệu thông dụng:
Binary
Boolean
Byte
Century
Date
Decemal
Double
ENTITY
ENTITIES
ID
Int, Integer
IDREF
NOTATION
MNTOKEN
MNTOKENS
Month
String
Kiểu dữ liệu nhị phân Kiểu luận lý
Kiểu byte Kiểu thế kỷ Kiểu ngày Kiểu thập phân Kiểu số thực 64bit Kiểu thực thể Kiểu đa thực thể Kiểu định danh Kiểu số nguyên Kiểu tham chiếu định danh Kiểu ghi chú
Kiểu token đơn Kiểu đa token Kiểu tháng Kiểu chuỗi
5.7.3 Ví dụ
Các phần tử XML:
<lastname>Refsnes</lastname>
<age>36</age>
<dateborn>1970-03-27</dateborn>
Định nghĩa phần tử đơn giản:
<name="lastname" type="xsd:string"/>
<name="age" type="xsd:integer"/>
<name="dateborn" type="xsd:date"/>
5.8 Giá trị mặc định và cố định
Giá trị mặc định:
<xsd:element name="color" type="xsd:string" default="red"/>
Trang 7Giá trị cố định:
<xsd:element name="color" type="xsd:string" fixed="red"/>
Trong đó:
Thuộc tính trong XSD được khai báo như một kiểu giản đơn Các phần tử giản đơn
không thể có thuộc tính Nếu một phần tử có thuộc tính, thì phần tử đó được xem là
phần tử phức hợp
5.9 Khai báo thuộc tính và các ràng buộc
<xsd:attribute name="xxx" type="yyy"/>
xxx: tên của thuộc tính yyy: kiểu dữ liệu của thuộc tính
Ví dụ:
Phần tử XML có thuộc tính:
<lastname lang="EN">Smith</lastname>
5.9.1 Định nghĩa thuộc tính trong XSD
<xsd:attribute name="lang" type="xsd:string"/>
5.9.2 Khai báo loại thuộc tính
Khai báo default:
<xsd:attribute name="lang" type="xsd:string" default="EN"/>
Khai báo fixed:
<xsd:attribute name="lang" type="xsd:string" fixed="EN"/>
Khai báo requyred:
<xsd:attribute name="lang" type="xsd:string" use="requyred"/>
5.9.3 Ràng buộc nội dung
- Khi một phần tử hay thuộc tính đã định nghĩa kiểu dữ liệu, phần tử hay thuộc tính
đó đã có ràng buộc về nội dung
- Người dùng có thể thêm các ràng buộc cho phần tử hay thuộc tính
5.9.4 Ràng buộc giá trị
Kiểu miền con:
<xsd:element name="age">
<xsd:simpleType>
Trang 8<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="0"/>
<xsd:maxInclusive value="120"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
Kiểu liệt kê:
<xsd:element name="car">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="Audi"/>
<xsd:enumeration value="Golf"/>
<xsd:enumeration value="BMW"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
Giới hạn giá trị:
<xsd:element name="letter">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:pattern value="[a-z]"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
Hoặc:
<xsd:element name="initials">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:pattern value="[a-zA-Z][a-zA-Z][a-zA-Z]"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
Hoặc dùng ký tự đại diện:
<xsd:element name="letter">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
Trang 9<xsd:pattern value="([a-z])*"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="letter">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:pattern value="([a-z][A-Z])+"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="gender">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:pattern value="male|female"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="password">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:pattern value="[a-zA-Z0-9]{8}"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
5.9.5 Ràng buộc về ký tự dấu cách
<xsd:element name="address">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:whiteSpace value="preserve"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
Trang 10<xsd:whiteSpace value="preserve"/>: XML parser sẽ không loại bỏ bất kỳ ký
tự dấu cách nào
<xsd:whiteSpace value=“replace"/>: XML parser sẽ thay thế tất cả ký tự dấu cách (line feed, tab, space, carriage return) bằng khoảng trắng
<xsd:whiteSpace value=“collapse"/>: XML parser sẽ loại bỏ tất cả ký tự dấu cách dư (line feed, tab, space, carriage return) bằng khoảng trắng
5.9.6 Ràng buộc về độ dài
<xsd:element name="password">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:length value="8"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
Hoặc:
<xsd:element name="password">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:minLength value="5"/>
<xsd:maxLength value="8"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
5.9.7 Định nghĩa phần tử phức hợp
Phần tử phức hợp là một phần tử XML chứa các phần tử khác hoặc có thuộc tính
Có 4 loại phần tử phức hợp:
- Phần tử rỗng
- Phần tử chỉ chứa các phần tử khác
- Phần tử chỉ chứa văn bản
- Phần tử vừa chứa các phần tử khác, vừa chứa văn bản
Ví dụ:
<product pid="1345"/>
<employee>
<firstname>John</firstname>
Trang 11<lastname>Smith</lastname>
</employee>
<food type="dessert">Ice cream</food>
<description>
It happened on <date lang="norwegian">03.03.99</date>
</description>
5.9.7.1 Định nghĩa một phần tử phức hợp trong XSD
Trong tài liệu XML
<employee>
<firstname>John</firstname>
<lastname>Smith</lastname>
</employee>
Có nhiều cách để định nghĩa phần tử employee…
Cách 1:
<xsd:element name="employee">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="firstname" type="xsd:string"/>
<xsd:element name="lastname" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
Cách 2:
<xsd:element name="employee" type="personinfo"/>
<xsd:complexType name="personinfo">
<xsd:sequence>
<xsd:element name="firstname" type="xsd:string"/>
<xsd:element name="lastname" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
5.9.7.2 Định nghĩa phần tử rỗng
<product prodid="1345" />
<xsd:element name="product">