2.3.1. Tạo định nghĩa kiểu tư liệu-DTD
XML là để thiết kế riờng ngụn ngữ đỏnh dấu rồi định dạng tài liệu bằng ngụn ngữ đú. Ta xỏc định ngụn ngữ bằng cỏch quy định thành phần và thuộc tớnh cần thiết trong tài liệu. Một tài liệu XML đƣợc xem là hợp lệ và cú giỏ trị khi toàn bộ cỏc thành phần trong tài liệu đƣợc định nghĩa kiểu mà nú sẽ chứa. Định nghĩa cho cỏc thành phần thẻ cũn đƣợc gọi là định nghĩa kiểu tƣ liệu (DTD, Document Type Definition). Nhƣ vậy, tài liệu XML đƣợc xem là hợp lệ, nú phải tuõn theo nguyờn tắc định nghĩa kiểu tƣ liệu DTD tƣơng ứng [5,16,17].
Việc sử dụng định nghĩa DTD nhằm để xõy dựng cấu trỳc tổng thể cho một tài liệu XML và nú tuõn theo cỳ phỏp quy định của tổ chức XML W3C.
Cỳ phỏp định nghĩa và khai bỏo tổng quỏt kiểu tƣ liệu cho cỏc thành phần thẻ nhƣ sau:
<!DOCTYPE rootName [DTD]>
Trong đú, rootName là tờn thành phần gốc của tài liệu; DTD là cỏc định nghĩa cho thành phần trong tài liệu. DTD cú thể là định nghĩa trong hoặc ngoài.
2.3.1.1. Khai bỏo DTD trong
Đối với tài liệu XML, tạo DTD bờn trong tài liệu XML là đơn giản, nú đƣợc khai bỏo ở đầu tài liệu XML, sau khai bỏo version XML và cỏc chỉ thị xử lý. Thớ dụ, khai bỏo DTD trong cho tài liệu bai1_pascal.xml:
<?xml-stylesheet type=“text/xsl” herf=“data.xsl” ?> <!DOCTYPE BAIGIANG [
<Element BAIGIANG (HOCPHAN, BAISO, TENBAI)> <Element HOCPHAN (#PCDATA)>
<Element BAISO (#PCDATA)> <Element TENBAI (#PCDATA)> ]>
<BAIGIANG>
<HOCPHAN>Tin hoc Đại Cƣơng</HOCPHAN> <BAISO>1</BAISO>
<TENBAI>Ngụn ngữ Lập trỡnh Pascal</TENBAI> </BAIGIANG>
2.3.1.2. Khai bỏo DTD ngoài
Phần trờn chỳng ta tạo định nghĩa DTD trong, tức cỏc thành phần định nghĩa chung và chứa cựng trong một tài liệu. Ta cũng cú thể định nghĩa DTD cho thành phần thẻ dựa trờn cỏc tham chiếu đó định nghĩa sẵn từ cỏc tài liệu XML trƣớc đú. Hay núi cỏch khỏc, cỏc định nghĩa DTD xõy dựng sẵn chứa trong file.dtd, sau đú trong tài liệu XML khai bỏo và định nghĩa tham chiếu đến tập tin file.dtd này.
Cú hai cỏch chỉ định một thành phần DTD tham chiếu ngoại: tham chiếu ngoại riờng (private DTDs) và tham chiếu ngoại chung (public DTDs). Cỳ phỏp sử dụng:
<!DOCTYPE rootName SYSTEM URL [DTD]> hoặc <!DOCTYPE rootName PUBLIC FPI URL [DTD]>
Với từ khúa SYSTEM ỏp dụng cho tham chiếu ngoại riờng, nếu khụng chỉ định đƣờng dẫn cụ thể thỡ trỡnh phõn tớch sẽ truy tỡm cỏc tập tin tham chiếu trong thƣ mục hiện hành cựng cấp với tài liệu XML. Hoặc cú thể chỉ định tập tin tham chiếu ngoại là tài liệu truy cập theo địa chỉ tuyệt đối Internet URLs. Khi đặt thuộc tớnh PUBLIC vào chỉ thị khai bỏo, cỏc thẻ DTD cú khả năng dựng làm tham chiếu ngoại dựng chung và liờn kết với nhiều tài liệu, nhƣng cần phải tạo ra một định dạng chung hỡnh thức (FPI-Formal Public Identifier) và tuõn theo cỏc quy tắc ỏp dụng cho FPI.
Thớ dụ, sử dụng DTD tham chiếu ngoại riờng đến tập tin data.dtd bằng cỏch sử dụng từ khúa SYSTEM.
<?xml version = “1.0” standalone = “no” ?> <!DOCTYPE BAIGIANG SYSTEM “data.dtd”>
<BAIGIANG>
<HOCPHAN>Tin hoc Đại Cƣơng</HOCPHAN> <BAISO>1</BAISO>
<TENBAI>Ngụn ngữ Lập trỡnh Pascal</TENBAI> </BAIGIANG>
Do tham chiếu ngoại nờn đổi chỉ thị xử lý standalone = “no”. Nội dung của file data.dtd
<Element BAIGIANG (HOCPHAN, BAISO, TENBAI)> <Element HOCPHAN (#PCDATA)>
<Element BAISO (#PCDATA)> <Element TENBAI (#PCDATA)>
Ngoài ra, nếu cần cú thể tận dụng DTD cả trong lẫn ngoài.
2.3.2. Quy định thành phần, thực thể và thuộc tớnh trong DTD
DTD phải định rừ nguyờn tắc cho từng thành phần, thực thể và thuộc tớnh sẽ xuất hiện trong tài liệu XML. Nếu khụng, tài liệu XML sẽ đƣợc xem là khụng hợp lệ.
2.3.2.1. Quy định cỏc thành phần (Elements)
Quy định nội dung và cấu trỳc của từng thành phần trong tài liệu XML. Dựng thẻ khai bỏo <!ELEMENT> định nghĩa kiểu tƣ liệu DTD cho một phần tử theo cấu trỳc sau:
<!ELEMENT Name Contents>
Trong đú, Name là tờn thành phần muốn định nghĩa; Contents cú thể là EMPTY (thành phần khụng chứa gỡ cả), ANY (chứa tổ hợp thành phần và văn bản khụng xỏc định) hoặc chứa cả hai nội dung bao gồm dữ liệu cú thể dựng phõn tớch hoặc cỏc thành phần khỏc. Một số quy định thành phần cơ bản:
Quy định thành phần chỉ chứa văn bản: Thành phần đƣợc quy định là chứa #PCDATA (Parsed Character Data) khụng thể chứa cỏc thành phần nào khỏc. Hay núi một cỏch khỏc, nú chỉ chứa dữ liệu văn bản thụ, khụng thuộc phần định dạng. Theo thớ dụ trờn, định nghĩa cỏc thành phần con HOCPHAN, BAISO, TENBAI chỉ chứa văn bản thụ:
<Element HOCPHAN (#PCDATA)> <Element BAISO (#PCDATA)> <Element TENBAI (#PCDATA)>
Quy định thành phần chứa dóy: Quy định dóy thành phần con chứa trong thành phần cha. Mỗi thành phần đƣợc phõn cỏch bằng dấu phẩy. Thớ dụ, <Element BAIGIANG (HOCPHAN,BAISO,TENBAI)>
Quy định cỏc lựa chọn: Cú thể quy định lựa chọn giữa cỏc thành phần, thành phần DTD cú thể chứa hoặc thành phần <eName1> hoặc thành phần <eName2>. Thớ dụ, <!Element eName (eName1|eName2)>
Quy định số lượng đơn vị: Đơn vị là thành phần đơn lẻ. Trong DTD cú ba ký hiệu đại diện, chỳng cho phộp quy định số lƣợng đơn vị xuất hiện trong thành phần. Ký tự ? cho biết đơn vị xuất hiện nhiều nhất là một lần trong thành phần đƣợc xỏc định. Ký tự + cho biết đơn vị phải xuất hiện ớt nhất một lần và bao nhiờu lần tựy ý trong thành phần đƣợc xỏc định. Ký tự * cho biết đơn vị cú thể xuất hiện bao nhiờu lần cũng đƣợc, hoặc khụng trong thành phần đƣợc xỏc định.
Ký tự đại diện Diễn giải
eName* Khụng hoặc cú nhiều thành phần con giống nhau eName+ Cú một hoặc nhiều thành phần con giống nhau
eName? Thành phần eName hoặc khụng cú thành phần nào cả eName1,eName2 Thành phần eName1 tiếp đến thành phần eName2 eName1 | eName2 Thành phần eName1 hoặc thành phần eName2
(expression) Tập cỏc thành phần expression trong cặp ngoặc sẽ ảnh hƣởng bởi ký tự đại diện *, + hoặc ?
Bảng 2.3.2.1: Túm tắt nguyờn tắc sử dụng ký tự đại diện 2.3.2.2. Cỏc thực thể (Entities)
Một thực thể là cỏch XML tham chiếu đến một mục dữ liệu, thực thể cú thể là văn bản hoặc là dữ liệu nhị phõn. Cú nhiều loại thực thể, hoạt động của chỳng là nhƣ nhau. Khỏc biệt nằm ở cỏch quy định thực thể và chỳng chứa loại thụng tin nào. Cú thể chia thực thể thành hai nhúm chớnh: thực thể tổng quỏt (general entity) và thực thể tham số (parameter entity). Cú thể tiếp tục chia thực thể tổng quỏt thành nội hoặc ngoại tựy theo chỳng đƣợc quy định trong DTD hay tập tin ngoài. Thực thể cú thể ở dạng phõn tớch hoặc khụng phõn tớch. Nội dung thực thể phõn tớch đƣợc trỡnh phõn tớch XML phõn tớch khi nú đi qua tài liệu XML. Nội dung thực thể khụng phõn tớch-thƣờng trỏ vào dữ liệu nhị phõn phi văn bản-khi khụng muốn trỡnh phõn tớch XML phõn tớch chỳng, thớ dụ nhƣ cỏc tập tin ảnh, phim,....[3,5,10].
Thực thể tổng quỏt nội và thực thể tổng quỏt ngoại
Khai bỏo và định nghĩa một thực thể tổng quỏt:
<!ENTITY Name Definition>
Name là tờn thực thể, Definition là định nghĩa của thực thể. Tờn của thực thể đƣợc dựng để tham chiếu đến nội dung của nú, nội dung định nghĩa của thực thể đơn giản nhất là cỏc văn bản cần thay thế khi thực thể đƣợc tham chiếu đến. Để tham chiếu đến nội dung thực thể phải theo nguyờn tắc đặt tờn XML hợp lệ nhƣ
&Name. Thớ dụ, định nghĩa và tham chiếu đến thực thể tổng quỏt nội cú tờn DinhSinh:
<?xml version=“1.0” standalone=“yes”?> <!DOCTYPE BAIGIANG [
<!ENTITY DinhSinh „<entry>
<HOTEN><HO>Dinh</HO><TEN>Sinh</TEN></HOTEN> <DIENTHOAI>056-811438</DIENTHOAI> <EMAIL href=”mailto:pdsinh@yahoo.com ”/> </entry>‟> ]> <BAIGIANG> &DinhSinh; <BAIGIANG>
Thực thể cú thể đƣợc định nghĩa và khai bỏo từ một nguồn bờn ngoài và đƣợc gọi là thực thể ngoại. Việc khai bỏo thực thể ngoại bằng từ khúa SYSTEM (thực thể dựng trong nội bộ hay tổ chức cỏ nhõn) hoặc PUBLIC (cho phộp thực thể dựng chung toàn cục). Cỳ phỏp:
<!ENTITY Name System URI> <!ENTITY Name Public FPI URI>
Thớ dụ, định nghĩa và tham chiếu đến thực thể tổng quỏt ngoại cú tờn DinhSinh:
<?xml version=“1.0” standalone=“no”?> <!DOCTYPE BAIGIANG [
<!ENTITY DinhSinh SYSTEM “data.xml” ]>
<BAIGIANG>
&DinhSinh; <BAIGIANG>
Nội dung tập tin data.xml nhƣ sau:
<entry>
<HOTEN><HO>Dinh</HO><TEN>Sinh</TEN></HOTEN> <DIENTHOAI>056-811438</DIENTHOAI>
<EMAIL href=”mailto:pdsinh@yahoo.com ”/> </entry>
Thực thể tham số nội và thực thể tham số ngoại
Khỏc với tham chiếu thực thể tổng quỏt, nú bắt đầu bằng ký tự & thỡ tham chiếu thực thể tham số bắt đầu bằng tự %. Việc định nghĩa và khai bỏo thực thể tham số cũng tƣơng tự nhƣ thực thể tổng quỏt ngoại trừ thờm ký tự % vào sau thành phần chỉ thị <ENTITY>. Cỳ phỏp khai bỏo thực thể tham số nội nhƣ sau:
Khai bỏo cỏc thực thể tham số ngoại bằng cỏch thờm từ khúa SYSTEM và PUBLIC:
<!ENTITY %Name System URI> <!ENTITY %Name Public FPI URI>
Thớ dụ, định nghĩa và tham chiếu đến thực thể tham số nội cú tờn listTP (danh sỏch thành phố):
<?xml version=”1.0”?>
<!DOCTYPE DiaChi SYSTEM “DiaChi.dtd”[ <!ENTITY %listTP SYSTEM “listTPho.xml”> %listTP; ]> <DiaChi> <Dienthoai>811438</Dienthoai> <Duong>99 Vu Bao</Duong> <Thanhpho>&qn;</Thanhpho> </DiaChi>
Nội dung tập tin listTPho.xml
<?xml version=”1.0”?> <!ENTITY hn “Ha Noi”>
<!ENTITY hcm “Ho Chi Minh”> <!ENTITY h “Hue”>
<!ENTITY qn “Quy Nhon”> <!ENTITY dn “Da Nang”> <!— và tiếp tục -->
2.3.2.3. Thuộc tớnh (Attribute)
Thuộc tớnh nhằm bổ sung thờm thụng tin cho thành phần thẻ. Định nghĩa danh sỏch thuộc tớnh theo cỳ phỏp sau:
<!ATTLIST eName
attrName Type DefaultValue attrName Type DefaultValue ...
>
Trong đú, eName là tờn thành phần muốn đặt thuộc tớnh attrName cho nú.
Type là kiểu thuộc tớnh. DefaultValue là giỏ trị mặc định mà thuộc tớnh đƣợc gỏn. Thớ dụ, <!ATTLIST Tel Preferred (true|false) “false”>
Trong đú, tờn thành phần là Tel; tờn thuộc tớnh là Preferred, kiểu thuộc tớnh là (true | false) và giỏ trị mặc định của thuộc tớnh là false.
Kiểu Mụ tả
CDATA Dữ liệu ký tự đơn giản khụng chứa phần định dạng
ENTITIES Tham chiếu cỏc thực thể, những thực thể này phải đƣợc khai bỏo trong DTD
ENTITY Tờn tham chiếu của thực thể, nú cũng phải khai bỏo trong DTD Enumerated Đại diện cho một danh sỏch cỏc giỏ trị mà thuộc tớnh cú thể
đƣợc gỏn
ID Tờn định danh duy nhất trong tài liệu XML
Bảng 2.3.2.3.a: Mụ tả cỏc kiểu của thuộc tớnh.
Giỏ trị Mụ tả
VALUE Chuỗi giỏ trị văn bản thụ bọc trong dấu nhỏy kộp hoặc đơn
#IMPLIED Chỉ định rằng khụng cú trị mặc định cho thuộc tớnh và thuộc tớnh này khụng cần phải dựng đến
#REQUIRED Chỉ định rằng khụng cú trị mặc định cho thuộc tớnh nhƣng cần phải gỏn giỏ trị cho thuộc tớnh khi dựng
#FIXED VALUE VALUE là giỏ trị bắt buộc và cố định. Thuộc tớnh luụn mang giỏ trị VALUE này.
Bảng 2.3.2.3.b: Mụ tả giỏ trị mặc định mà thuộc tớnh.
2.4. Lƣợc đồ XML và khụng gian tờn
2.4.1. Lược đồ XML
Lƣợc đồ XML (XML Schema) quy định diện mạo của tài liệu XML đó cho, chẳng hạn nhƣ chỳng chứa thành phần nào, thứ tự ra sao, nội dung thế nào và chứa
thuộc tớnh gỡ. Cũng giống nhƣ DTD, nhƣng lƣợc đồ XML tỏ ra mạnh mẽ và chớnh xỏc hơn, nú cho phộp định nghĩa và khai bỏo dữ liệu một cỏch thực sự [3].
Lƣợc đồ là tài liệu XML theo dạng thức thuần văn bản với phần mở rộng.xsd. Nú mở đầu bằng khai bỏo chuẩn XML, tiếp theo dựng tiếp đầu ngữ xsd: để khai bỏo khụng gian tờn XML Schema, theo cỳ phỏp sau:
<?xml version = “1.0” >
<xsd:schema xmlns:xsd = “http://www.w3.org/1999/XMLSchema”> ...
</xsd:schema>
Để trỡnh xử lý XML cú thể sử dụng tập tin lƣợc đồ (.xsd) cho tài liệu XML, thỡ cỏc bộ xử lý phải cú cỏch cài đặt cụ thể của riờng nú để nhận ra lƣợc đồ đi kốm với tài liệu XML. Trong Internet Explorer sử dụng thuộc tớnh xmlns để tham chiếu đến tập tin chứa lƣợc đồ nhƣ sau:
<?xml version = “1.0” ?>
<rootElement xmlns = “x-shema:filename.xsd” ...
</rootElement>
Tuy nhiờn, W3C cho phộp khai bỏo khụng gian tờn cho tài liệu XML tham chiếu đến tập tin lƣợc đồ theo địa chỉ URL nhƣ sau:
<?xml version = “1.0” ?> <rootElement xmlns = “URL” ...
</rootElement>
2.4.2. Quy định kiểu đơn giản và kiểu phức tạp
Trong lƣợc đồ XML, tài liệu chia thành hai kiểu nội dung chớnh: thành phần thuộc kiểu đơn giản (simple types) và thành phần thuộc kiểu phức tạp (comples types).
Vấn đề đặt ra ở đõy là làm cỏch phõn biệt thành phần nào trong tài liệu cú kiểu đơn giản, thành phần nào cú kiểu phức tạp. Nếu nhỡn tài liệu XML dƣới dạng hỡnh
cõy thỡ cỏch dễ nhận ra nhất là thành phần cú kiểu đơn giản thƣờng khụng cú nhỏnh con (là nỳt lỏ) trong khi kiểu phức tạp thỡ cú thể cú.
2.4.2.1. Quy định kiểu đơn giản
Kiểu đơn giản là cỏc kiểu nội tại đó đƣợc định nghĩa sẵn và cú thể dựng nú tự do trong lƣợc đồ XML. Thành phần thuộc kiểu đơn giản chỉ chứa dữ liệu đơn giản nhƣ dữ liệu ngày thỏng, số, chuỗi,... và khụng cho phộp chứa thuộc tớnh và thành phần con. Để tạo một kiểu đơn giản dựng cỳ phỏp sau:
<xsd:simpleType name = “typeName” base = “xsd:type”> </xsd:simpleType>
Trong đú, typeName là tờn kiểu dữ liệu thành phần; type là kiểu dữ liệu. Thớ dụ, <xsd:simpleType name=“HOCPHAN” base=“xsd:String”>
</xsd:simpleType>
Tờn kiểu dữ liệu Mụ tả
Binary Kiểu dữ liệu nhị phõn Boolean Kiểu lý luận
Byte Kiểu byte
Date Kiểu ngày
Decimal Kiểu thập phõn Double Kiểu số thực 64-bit
ENTITY Kiểu thực thể
ID Kiểu định danh
Int, integer Kiểu số nguyờn NOTATION Kiểu ghi chỳ
Month Kiểu thỏng
String Kiểu chuỗi
Bảng 2.4.2.1. Liệt kờ một số kiểu đơn giản 2.4.2.2. Quy định kiểu phức tạp
Thành phần cú kiểu phức tạp tức nú cú thể chứa thành phần con khỏc hay đƣợc phộp chứa thuộc tớnh. Kiểu phức tạp cú bốn loại thành phần: thành phần thuần; Thành phần rỗng; Thành phần hỗn hợp; Cuối cựng là thành phần văn bản thuần. Cỳ phỏp tổng quỏt khai bỏo kiểu phức tạp:
<xsd:complexType name = “typeName”>
<xsd:element name = “subName” type = “xsd:typeName” > <xsd:element name = “subName” type = “xsd:typeName” > ...
<xsd:attribute name = “attName” type = “xsd:typeName”> </xsd:complexType>
Trong đú, subName là tờn thành phần con; attName là tờn thuộc tớnh; cũng giống nhƣ kiểu đơn giản, typeName cú thể là kiểu dữ liệu đó định nghĩa sẵn chẳng hạn nhƣ kiểu số, kiểu ngày giờ, kiểu lý luận,... hoặc do ngƣời dựng tự định nghĩa.
Thớ dụ, thành phần MUC (mục) là đề mục của một phần trong bài giảng đƣợc định nghĩa kiểu phức tạp MUC chứa thành phần con TENMUC (tờn mục) và NDMUC (nội dung mục).
<xsd:element name=“MUC” type=“MUC”/> <xsd:complexType name=“MUC”>
<xsd:element name=“TENMUC” type=“xsd:string”/> <xsd:element name=“NDMUC” type=“xsd:string”/> </xsd:complexType>
</xsd:element>
Quy định thành phần chứa thành phần thuần: Là thành phần thuộc kiểu phức tạp cơ bản nhất cú thể chứa thành phần khỏc và luụn cả thuộc tớnh, ngoại trừ văn bản. Thớ dụ, trong đoạn tài liệu XML này, thành phần book
là “thành phần thuần”: <book>
<name language=“VietNam”>Hoc XML bang vi du</name>
<name language=“English”>Learning XML by Example</name> </book>
Cỏch quy định thành phần book nhƣ sau: <xsd:element name=“book”>
<xsd:element name=“name” type=“xsd:string”/> </xsd:complexType>
</xsd:element>
Quy định thành phần chứa thành phần rỗng: Là thành phần khụng cú nội dung nhƣng cú thể chứa thuộc tớnh. Thớ dụ, trong đoạn tài liệu XML này, thành phần Picture là thành phần rỗng:
<Picture filename=“book.jpg” height=“10” width=“30”/> Cỏch quy định thành phần rỗng Picture nhƣ sau:
<xsd:element name=“Picture”>
<xsd:comlpexType content=“empty”>
<xsd:element name=“filename” type=“xsd:string”/> <xsd:element name=“height” type=“xsd:decimal”/> <xsd:element name=“width” type=“xsd:decimal”/> </xsd:complexType>
</xsd:element>
Quy định thành phần chứa thành phần hỗn hợp: Là thành phần chỉ chứa cỏc thành phần, thuộc tớnh và (hoặc) văn bản. Thớ dụ, trong đoạn tài liệu XML này, thành phần Software chứa nội dung hỗn hợp gồm: vừa văn bản lẫn thành phần con:
<Softwares>
Phan mem <software>XML Writer</software> Thoi gian su dung <maxDays>45</maxDays> </Softwares>
Cỏch quy định thành phần Software nhƣ sau: <xsd:element name=“Softwares”>
<xsd:comlpexType content = “mixed”>
<xsd:element name=“software” type=“xsd:string”/> <xsd:element name=“maxDays”> <xsd:simpleType base=“xsd:integer”> <xsd:maxExclusive value=“45”/> </xsd:simpleType> </xsd:complexType> </xsd:element>
Quy định thành phần chứa thành phần văn bản thuần: Là thành phần thuộc kiểu phức tạp chỉ chứa văn bản và cú thể cú thuộc tớnh. Thớ dụ, thành phần name là thành phần văn bản thuần”:
<name language=“English”>XML by Example</name> Cỏch quy định thành phần name nhƣ sau:
<xsd:element name=“name” type=“nameType”/>
2.4.3. Khụng gian tờn của XML
Do XML cho phộp ta tự do định nghĩa và đặt tờn cỏc thẻ, nờn việc khai bỏo một thành phần trựng tờn thẻ trờn hai ứng dụng khỏc nhau là khú trỏnh khỏi. Khi