Khoa Công ngh Thông Tin – ĐH Đà L tệ ạ
Định nghĩa kiểu tài liệu (DTD)
và Kiểm tra tính hợp lệ (Valid)
của XML
Khoa Công nghệ Thông
Tin – ĐH Đà Lạt
Ví dụ 1
Ví dụ đơn giản:
<?xml version="1.0"?>
<!DOCTYPE DOCUMENT[
<!ELEMENT DOCUMENT (p*)>
<!ELEMENT p (#PCDATA)>
]>
<DOCUMENT>
<p> chao </p>
<p> cac </p>
<p> ban </p>
</DOCUMENT>
Khoa Công nghệ Thông
Tin – ĐH Đà Lạt
Ví dụ 2
<?xml version=“1.0”>
<!DOCTYPE DOCUMENT[
<!ELEMENT DOCUMENT (CUSTOMER)*>
<!ELEMENT CUSTOMER(NAME, DATE,
ORDERS)>
<!ELEMENT NAME (LAST_NAME,
FIRST_NAME)>
<!ELEMENT LAST_NAME (#PCDATA)>
<!ELEMENT FIRST_NAME (#PCDATA)>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT ORDERS (ITEM)*>
<!ELEMENT ITEM (PRODUCT, NUMBER,
PRICE)>
<!ELEMENT PRODUCT (#PCDATA |
PRODUCT_ID)*>
<!ELEMENT NUMBER (#PCDATA)>
<!ELEMENT PRICE (#PCDATA)>
<!ELEMENT PRODUCT_ID (#PCDATA)>]
<DOCUMENT>
<CUSTOMER TYPE = "Good">
<NAME>
<LAST_NAME> aaa </LAST_NAME>
<FIRST_NAME> bbb </FIRST_NAME>
</NAME>
<DATE> 1/1/03 </DATE>
<ORDERS class="SanPham">
<ITEM>
PRODUCT> Tomatoes </PRODUCT>
<NUMBER> 25
</NUMBER>
<PRICE> $1.25 </PRICE>
</ITEM>
<ITEM>
<PRODUCT> Tomatoes </PRODUCT>
<NUMBER> 25
</NUMBER>
<PRICE> $1.25 </PRICE>
</ITEM>
</ORDERS>
</CUSTOMER>
</DOCUMENT>
Khoa Công nghệ Thông
Tin – ĐH Đà Lạt
Khai báo DTD
Thẻ <!DOCTYPE> để bắt đầu định nghĩa kiểu tư liệu cho các phần tử XML.
Các mẫu khai báo:
<!DOCTYPE rootname [DTD]>
<!DOCTYPE rootname SYSTEM URL>
<!DOCTYPE rootname SYSTEM URL [DTD]
Ví dụ 1:
<!DOCTYPE DOCUMENT[
<!ELEMENT DOCUMENT (p*)>
<!ELEMENT p (#PCDATA)>
]>
Ví dụ 2: DTD ngoại
<!DOCTYPE DOCUMENT SYSTEM "thu.dtd">
Ví dụ 3:
<!DOCTYPE DOCUMENT SYSTEM
“ />
Khoa Công nghệ Thông
Tin – ĐH Đà Lạt
Khai báo phần tử trong DTD (Element)
Khai báo: <!ELEMENT> để định nghĩa kiểu
tư liệu DTD cho một phần tử
Cú pháp:
<!ELEMENT NAME CONTENT_MODEL>
NAME: tên phần tử muốn định nghĩa.
CONTENT_MODEL có thể là:
ANY.
Các phần tử con khác hoặc dữ liệu
Khoa Công nghệ Thông
Tin – ĐH Đà Lạt
Định nghĩa kiểu dữ liệu
Any: khai báo một phần tử kiểu Any có nghĩa
phần tử được khai báo có thể chứa bất kì
kiểu nội dung nào mà bạn định nghĩa.
Khi phần tử được khai báo là Any thì trình
phân tích sẽ không kiểm tra cú pháp hay xác
định tính hợp lệ của nội dung phần tử.
Khoa Công nghệ Thông
Tin – ĐH Đà Lạt
Định nghĩa kiểu dữ liệu
Danh sách các phần tử con: một phần tử DTD, nội dung có thể
chứa những phần tử con khác.
Ví dụ:
<!ELEMENT DOCUMENT (CUSTOMER)*>
<!ELEMENT CUSTOMER(NAME)>
<!ELEMENT NAME (LAST_NAME, FIRST_NAME)>
<!ELEMENT LAST_NAME (#PCDATA)>
<!ELEMENT FIRST_NAME (#PCDATA)>
DOCUMENT là phần tử chứa phần tử con CUSTOMER,
CUSTOMER là phần tử chứa phần tử con NAME, NAME là
phần tử chứa phần tử con LAST_NAME và FIRST_NAME
Khoa Công nghệ Thông
Tin – ĐH Đà Lạt
Định nghĩa kiểu dữ liệu
#PCDATA: là kiểu dữ liệu văn bản thô. Có thể chứa số nguyên,
số chấm động nhưng phải ở dạng text.
Không được chứa các thẻ định dạng
Ví dụ:
<!DOCTYPE DOCUMENT[
<!ELEMENT DOCUMENT(CUSTOMER)*>
<!ELEMENT CUSTOMER(#PCDATA)>
]>
<DOCUMENT>
<CUSTOMER>
<NAME> Sam Smith </NAME>
</CUSTOMER>
<DOCUMENT>
Tài liệu trên là không hợp lệ vì trong thẻ <CUSTOMER> chứa
thẻ định dạng
Khoa Công nghệ Thông
Tin – ĐH Đà Lạt
Định nghĩa kiểu dữ liệu
Làm việc với nhiều phần tử con
A*: không có hoặc có nhiều phần tử con giống nhau.
A+: có một hoặc nhiều phần tử con giống nhau.
A?: phần tử A hoặc không có phần tử nào cả
A,B: phần tử A tiếp đến phần tử B.
A|B: Phần tử A hoặc phần tử B nhưng không được cả hai.
Ví dụ
Khoa Công nghệ Thông
Tin – ĐH Đà Lạt
Kiểu dữ liệu
Ví dụ 1:
<?xml version=“1.0”?>
<!DOCTYPE DOCUMENT [
<!ELEMENT CUSTOMER (#PCDATA)>
<!ELEMENT DOCUMENT (CUSTOMER)>
]>
<DOCUMENT>
<CUSTOMER>
Sam smith
</CUSTOMER>
<CUSTOMER>
Tony Braxton
</CUSTOMER>
</DOCUMENT>
Tài liệu trên bi bắt lỗi vì phần tử CUSTOMER xuất hiện hai lần trong tài liệu.
Do đó để tài liệu không bị bắt lỗi thì dòng khai báo <!ELEMENT
DOCUMENT (CUSTOMER)> phải sửa lại như sau: <!ELEMENT
DOCUMENT (CUSTOMER)*>
Khoa Công nghệ Thông
Tin – ĐH Đà Lạt
Định nghĩa kiểu dữ liệu
Ví dụ 2:
Ta có thể sử dụng kí tự đại diện một nhóm thứ tự phần
tử dựa vào dấu ().
<!ELEMENT DOCUMENT (CUSTOMER)*>
<!ELEMENT CUSTOMER ((NAME, CREDIT_RATING?)
+, DATE*, ORDERS)>
CUSTOMER có thể chứa một hoặc nhiều phần tử
NAME, mỗi phần tử NAME lại kết hợp với phần tử
CREDIT_RATING hoặc không (NAME,
CREDIT_RATING?). Tổ hợp này lại được lặp lại một
hoặc nhiều lần trong định nghĩa CUSTOMER (NAME,
CREDIT_RATING?)+.
Khoa Công nghệ Thông
Tin – ĐH Đà Lạt
Định nghĩa kiểu dữ liệu
Ví dụ 3:
…
<!ELEMENT ORDERS (ITEM)*>
<!ELEMENT ITEM (PRODUCT, NUMBER, (PRICE | CHARGECCT |
SAMPLE))>
…
<ORDERS>
<ITEM>
<PRODUCT> Tomatoes </PRODUCT>
<NUMBER> 8 </NUMBER>
<PRICE> $1.25 </PRICE>
</ITEM>
<ITEM>
<PRODUCT> Tomatoes </PRODUCT>
<NUMBER> 8 </NUMBER>
<SAMPLE> $1.25 </SAMPLE>
</ITEM>
</ORDERS>
Khoa Công nghệ Thông
Tin – ĐH Đà Lạt
Định nghĩa nội dung hỗn hợp
Một phần tử có thể chứa dữ liệu thuần text (#PCDATA) hoặc cũng có thể chứa dữ
liệu thể hiện phần định dạng (Markup).
Ví dụ:
…
<!ELEMENT PRODUCT (#PCDATA | PRODUCT_ID)>
…
<!ELEMENT PRODUCT_ID (#PCDATA)>
…
<ITEM>
<PRODUCT> Tomatoes </PRODUCT>
<NUMBER> 8 </NUMBER>
<PRICE> $1.25 </PRICE>
</ITEM>
<ITEM>
<PRODUCT>
<PRODUCT_ID>T123456 </PRODUCT_ID>
</PRODUCT>
<NUMBER> 8 </NUMBER>
<SAMPLE> $1.25 </SAMPLE>
</ITEM>
Khoa Công nghệ Thông
Tin – ĐH Đà Lạt
Định nghĩa DTD ngoại
DTD nội (Internal DTD): phần định nghĩa và
khai báo tài liệu nằm trong cùng tài liệu được
gọi là DTD nội.
DTD ngoại (External DTD): định nghĩa DTD
được lưu trong file DTD. Khi đó tài liệu XML
sẽ tham chiếu đến các định nghĩa trong file
DTD
Ví dụ:
Khoa Công nghệ Thông
Tin – ĐH Đà Lạt
Định nghĩa DTD ngoại
Ví dụ:
<?xml version="1.0"?>
<!DOCTYPE DOCUMENT[
<!ELEMENT DOCUMENT (p*)>
<!ELEMENT p (#PCDATA)>
]>
<DOCUMENT>
<p> hahah </p>
<p> aaaa </p>
<p> kkkk </p>
</DOCUMENT>
Khoa Công nghệ Thông
Tin – ĐH Đà Lạt
Định nghĩa DTD ngoại
Ví dụ:
file DTD: vd.dtd
<!ELEMENT DOCUMENT (p*)>
<!ELEMENT p (#PCDATA)>
file XML:
<?xml version="1.0"?>
<!DOCTYPE DOCUMENT SYSTEM “vd.dtd">
<DOCUMENT>
<p> hahah </p>
<p> aaaa </p>
<p> kkkk </p>
</DOCUMENT>
Khoa Công nghệ Thông
Tin – ĐH Đà Lạt
Định nghĩa DTD ngoại
Ví dụ: file DTD vidu.dtd
<!ELEMENT DOCUMENT (CUSTOMER)*>
<!ELMENT CUSTOMER(NAME, DATE, ORDERS)>
<!ELEMENT NAME (LAST_NAME, FIRST_NAME)>
<!ELEMENT LAST_NAME (#PCDATA)>
<!ELEMENT FIRST_NAME (#PCDATA)>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT ORDERS (ITEM)*>
<!ELEMENT ITEM (PRODUCT, NUMBER, PRICE)>
<!ELEMENT PRODUCT (#PCDATA | PRODUCT_ID)*>
<!ELEMENT NUMBER (#PCDATA)>
<!ELEMENT PRICE (#PCDATA)>
<!ELEMENT PRODUCT_ID (#PCDATA)>
Khoa Công nghệ Thông
Tin – ĐH Đà Lạt
Định nghĩa DTD ngoại
Ví dụ 2 (tt): file XML vidu.xml
<?xml version=“1.0”?>
<!DOCTYPE DOCUMENT SYSTEM “vidu.dtd">
<DOCUMENT>
<CUSTOMER TYPE = "Good">
<NAME>
<LAST_NAME> aaa </LAST_NAME>
<FIRST_NAME> bbb </FIRST_NAME>
</NAME>
<DATE> 1/1/03 </DATE>
<ORDERS class="SanPham">
<ITEM>
<PRODUCT> Tomatoes </PRODUCT>
<NUMBER> 25 </NUMBER>
<PRICE> $1.25 </PRICE>
</ITEM>
<ITEM>
<PRODUCT> Tomatoes </PRODUCT>
<NUMBER> 25 </NUMBER>
<PRICE> $1.25 </PRICE>
</ITEM>
</ORDERS>
</CUSTOMER>
</DOCUMENT>
Khoa Công nghệ Thông
Tin – ĐH Đà Lạt
Thực thể trong DTD
Thực thể (Entity): là một mục dữ liệu mà XML tham
chiếu đến.
Thực thể gồm có:
Thực thể tổng quát (General Entity).
Thực thể tham số (Parameter Entity).
Thực thể được khai báo trong phần định nghĩa DTD,
được sử dụng khi tài liệu XML tham chiếu tới.
Tham chiếu thực thể tổng quát bắt đầu bằng & và kết
thúc bằng ;
Tham chiếu thực thể tham số bắt đầu bằng % và kết
thúc bằng ;
Khoa Công nghệ Thông
Tin – ĐH Đà Lạt
Thực thể trong DTD
Thực thể nội được định nghĩa hoàn toàn
trong tài liệu tham chiếu đến nó.
Thực thể ngoại (External Entity): nội dung
của nó được định nghĩa hoàn toàn từ một
nguồn dữ liệu bên ngoài (file) và được tham
chiếu bằng địa chỉ URL hoặc URI.
Thực thể có thể ở dạng phân tích (pharse)
hoặc có thể ở dạng văn bản thuần (text).
Thực thể ở dạng phân tích thì phải hợp
khuôn dạng tài liệu XML.
Khoa Công nghệ Thông
Tin – ĐH Đà Lạt
Thực thể trong DTD
Một số thực thể tổng quát được định nghĩa sẵn
trong XML:
< <
> >
& &
" “
' ‘
Các thực thể định nghĩa sẵn trong XML rất hữu
dụng khi muốn thể hiện các kí tự đặc biệt trùng với
kí tự của phần định dạng.
Khoa Công nghệ Thông
Tin – ĐH Đà Lạt
Thực thể trong DTD
Ví dụ:
<?xml version=“1.0”?>
<TEXT>
Chao cac ban den voi " The Gioi XML "
</TEXT>
Kết quả khi duyệt trên IE:
<?xml version=“1.0”?>
<TEXT>
Chao cac ban den voi “The Gioi XML”
</TEXT>
Khoa Công nghệ Thông
Tin – ĐH Đà Lạt
Thực thể tổng quát nội
Cú pháp khai báo:<!ENTITY NAME DEFINITION>
NAME: tên của thực thể
DEFINITION: định nghĩa của thực thể
Ví dụ: tiếp ví dụ trên, file vidu.dtd thêm như sau:
<!ENTITY TODAY “October 15, 2001”>
File vidu.xml tham chiếu đến nội dung thực thể
TODAY như sau:
<DATE> &TODAY;</DATE>
Kết quả khi duyệt file vidu.xml:
….
<DATE> October 15, 2001 </DATE>
….
Khoa Công nghệ Thông
Tin – ĐH Đà Lạt
Thực thể tổng quát ngoại
Cú pháp khai báo:
<!ENTITY NAME SYSTEM URI>: khai báo các
thực thể dùng trong nội bộ hay tổ chức các nhân.
Khoa Công nghệ Thông
Tin – ĐH Đà Lạt
Thực thể tổng quát ngoại
Ví dụ 1: định nghĩa file data.xml như sau:
<CUSTOMER TYPE = "Good">
<NAME>
<LAST_NAME> Smith </LAST_NAME>
<FIRST_NAME> Sam </FIRST_NAME>
</NAME>
<DATE> &TODAY;</DATE>
<ORDERS class="SanPham">
<ITEM>
<PRODUCT> Tomatoes </PRODUCT>
<NUMBER> 24 </NUMBER>
<PRICE> $1.25 </PRICE>
</ITEM>
</ORDERS>
</CUSTOMER>