You are on page 1of 76

THÔNG TIN VỀ HỌC PHẦN

Tên học phần: XML và ỨNG DỤNG


XML AND APPLICATIONS

Mã học phần: TIN4582 Số tín chỉ: 3

1. Chính sách đối với học phần:


Sinh viên bắt buộc phải tham gia các hoạt động sau:
EXTENSIBLE MARKUP LANGUAGE  Các giờ lý thuyết
 Thảo luận
 Làm bài tập
PGS.TS. Nguyễn Mậu Hân
Khoa CNTT-ĐHKH HUẾ  Kiểm tra định kỳ
Updated 01-2023  Thi cuối kỳ
1

THÔNG TIN VỀ HỌC PHẦN THÔNG TIN VỀ HỌC PHẦN


2. Mục tiêu của học phần:
 Cung cấp cho sinh viên các kiến thức cơ bản về
XML và công nghệ XML 3. Phƣơng pháp đánh giá
 Rèn luyện các kỹ năng lập trình xử lý trên các tài
liệu XML  Kiểm tra - đánh giá thường xuyên: 10%
 Ứng dụng tốt các công nghệ DTD, DOM, XSLT,  Kiểm tra bài tập ở lớp: 10%
CSS trong quá trình thiết kế và xây dựng ứng dụng.
 Kiểm tra đánh giá giữa kỳ: 20%
3. Môi trƣờng thực hành  Thi cuối kỳ (trên máy tính): 60%
 Notepad++
 C#
 VB.NET
 JAVA

NỘI DUNG TÀI LIỆU THAM KHẢO


CH1. TỔNG QUAN VỀ XML 1.Nguyễn Mậu Hân (2019), Giáo trình XML và ứng
CH2. ĐẶC TẢ NỘI DUNG & CẤU TRÚC TÀI LIỆU
dụng, nhà xuất bản Đại học Huế.
XML VỚI DTD
2. Nguyễn Phương Lan, XML nền tảng và
CH3. ĐẶC TẢ NỘI DUNG & CẤU TRÚC TÀI ứng dụng, NXB Lao động-Xã hội, 2008.
LIỆU XML VỚI XML Schema
3. Nguyễn Tiến, Đặng Xuân Hường,
CH4. TRÍCH XUẤT TÀI LIỆU XML VỚI XPath
Nhập môn XML thực hành và ứng dụng,
- XQuery
NXB Thống kê, 2008.
CH5. LIÊN KẾT TÀI LIỆU XML VỚI XLink- 4. Learning XML, Erik T. Ray, Oreilly Press, 2013.
XPointer
CH6. CHUYỂN ĐỔI ĐỊNH DẠNG TÀI LIỆU XML 5. http://www.xml.com
VỚI XSL
6. http://www.w3schools.com/xml (recommend)
CH7. ĐỊNH DẠNG TÀI LIỆU XML BẰNG BẢNG
ĐỊNH PHÂN TẦNG (CSS) 7. NotePad ++: http://download.phanmem.com/notepad-5.8.1-
CH8. TRUY XUẤT TÀI LIỆU XML VỚI DOM F2E5M6.html

1
TÀI LIỆU THAM KHẢO
.Learn more from http://www.w3schools.com/xml/

From

MỘT SỐ BÀI TẬP CÁ NHÂN MỘT SỐ BÀI TẬP CÁ NHÂN

1. Ứng dụng của XML và Web 9.


2. HTML5 (http://www.w3schools.com/html/html5_intro.asp) 10.
3. Javascript và XML:
(http://www.w3schools.com/js/js_intro.asp) 11.

4. Cách tạo HTML từ XML và XSL 12.


5. Hoán chuyển ADO qua XML 13.
6. Các ứng dụng của một XML Parser
14.
7. Sử dụng NNLT C# để thao tác trên một tài liệu XML
15. Generating XML Schema from Class Diagram
8. From Database to XML using Ecrion Data Architect http://sparxsystems.com.au/resources/xml_schema_generation.html
(http://www.ecrion.com/landingpage/databasetoxml)

ĐỊA CHỈ LIÊN HỆ

PGS.TS. NGUYỄN MẬU HÂN CHƢƠNG 1


BỘ MÔN CÔNG NGHỆ PHẦN MỀM
KHOA CÔNG NGHỆ THÔNG TIN
TRƢỜNG ĐẠI HỌC KHOA HỌC - ĐẠI HỌC HUẾ
77, NGUYỄN HUỆ – HUẾ
TỔNG QUAN VỀ XML
ĐIỆN THOẠI:
CQ: 054 382 6767
DĐ: 090 559 1515 AN OVERVIEW OF EXTENSIBLE MARKUP LANGUAGE

EMAIL: nmhan@husc.edu.vn PGS.TS. Nguyễn Mậu Hân


Khoa CNTT-ĐHKH HUẾ

12

2
NỘI DUNG 1.1 GIỚI THIỆU VỀ XML ...

1.1. GIỚI THIỆU VỀ XML Lịch sử ra đời của XML


 10/1986, SGML (Standard Generalised Markup Language)
1.2. ĐỊNH CHUẨN XML
ra đời.
1.3. NỘI DUNG TÀI LIỆU XML  1990 Tim Berners-Lee ở CERN, đã tạo ra HTML, một phần
nhỏ của SGML
1.4. TÀI LIỆU XML HỢP KHUÔN DẠNG
 Mùa hè 1996, Jonh Bosak ở Sun Microsystem thành lập
1.5. BỘ PHÂN TÍCH XML (XML Parser) nhóm cộng tác (working group) W3C SGML
1.6. NGÔN NGỮ ĐẶC TẢ CẤU TRÚC CHO TÀI LIỆU XML  1/1998 Microsoft cho ra một chương trình miễn phí tên
MSXSL để sinh ra một trang HTML từ một cặp trang XML
1.7. MỘT SỐ KỸ THUẬT ĐẶC TẢ NỘI DUNG THẺ và XSL.
 2/1998 W3C (World Wide Web Consortium) phê chuẩn cho
1.8. XML TREE
chính thức thi hành Version 1.0 của XML Specification.
1.9. LỢI ÍCH CỦA XML

XML LÀ GÌ? ...from W3SCHOOL XML LÀ GÌ?


...from W3SCHOOL

XML LÀ GÌ? LIÊN QUAN GIỮA HTML VÀ XML


 XML là ngôn ngữ đánh dấu mở rộng giống HTML HTML?
 XML được thiết kế để chuyển tải (transport) và lưu  HTML- Hyper Text Markup Language: Ngôn ngữ
trữ (store) dữ liệu chứ không phải để biểu diễn đánh dấu siêu văn bản Do Tim Berner Lee phát
(display) dữ liệu như HTML. minh năm 1990.
 XML là bộ quy luật về cách chia một tài liệu ra làm
 HTML là một ngôn ngữ để mô tả và định dạng nội
nhiều phần, rồi đánh dấu và ráp các phần giống
dung các trang web thông qua các thẻ (tag).
nhau để dễ nhận diện chúng.
 Tài liệu XML là một văn bản có cấu trúc theo định  Một file HTML là một file text bao gồm các thẻ (phần
chuẩn XML, cho phép biểu diễn thông tin về các tử) và có phần mở rộng là .htm hoặc .html
đối tượng trong thực tế.  Các trình duyệt web (web browser) sẽ hiển thị nội
 Các thẻ (element) của XML không được định dung các tag trên trang web.
nghĩa sẵn, NSD phải tự định nghĩa lấy.

3
SỰ GIỐNG/KHÁC NHAU GIỮA XML VÀ HTML VÍ DỤ VỀ TÀI LIỆU XML
...from W3SCHOOL

<Customer>
<FirstName>Stephen</FirstName>
<MiddleInitial></MiddleInitial>
<LastName>King</LastName>
</Customer>

foodmenu.xml Trình soạn thảo XML (XML Editor)


Mọi trình duyệt web đều có một XML Editor. Tuy
nhiên mỗi trình duyệt lại hiển thị nội dung file xml
theo các hình thức khác nhau.
 IE hiển thị toàn bộ nội dung, thẻ, thuộc tính (source code)
 Safari, Chrome chỉ hiển thị nội dung
 .....

Trình soạn thảo XML (XML Editor) Notepad View/Edit nội dung
của file books.xml
 Sử dụng editor của Dot.net để soạn thảo
 Sử dụng Notepad++. Dowload tại địa chỉ (Recommend):
http://notepad.joydownload.com/?c=11&gclid=CJ39r5mOyL0C
FUchpQodXVkA9Q
 Sử dụng XML Editor. Dowload tại: http://www.editix.com/
 Sử dụng XMLBlueprint (powerful). Dowload tại:
http://www.xmlblueprint.com/download-xml-editor.htm
 Sử dụng XML Writer. Dowload tại:
https://xmlwriter.net/download.shtml

4
XML Notepad 2007
IE10 view nội dung của file Tree View nội dung
file books.xml
books.xml

Notepad ++ View/Edit nội dung file books.xml


1.2. ĐỊNH CHUẨN XML
Qui định 1: Hệ thống các thẻ đánh dấu
Các thẻ đánh dấu trong ngôn ngữ theo định chuẩn
XML bao gồm 2 loại: Thẻ có nội dung và thẻ rỗng.
Thẻ có nội dung có dạng:
<Ten> Nội dung </Ten>
 Thẻ rỗng có dạng:
<Ten/> hoặc <Ten> </Ten>
Các thẻ có thể có hoặc không có thuộc tính với các
tên khác nhau.
Thuộc tính trong một thẻ có dạng:
Ten_thuoc_tinh=”Gia_tri”
hoặc Ten_thuoc_tinh=‟Gia_tri‟

1.2. ĐỊNH CHUẨN XML ... 1.2. ĐỊNH CHUẨN XML ...
Chú ý: Ví dụ:
Thuộc tính dùng để cung cấp thông tin về một thẻ <?xml version="1.0" encoding="utf-8"?>
(phần tử). Tuy nhiên không nên lạm dụng thuộc tính.
<DUONG_TRON Ban_kinh="5">
Xét 2 ví dụ dưới đây:
Ở ví dụ trên sex là <DIEM x="4" y="2"/>
thuộc tính
Ở ví dụ dưới sex là </DUONG_TRON>
một thẻ (phần tử)
Nói chung, không có
một luật lệ nào nói khi Thẻ có nội dung là thẻ DUONG_TRON
nào thì dùng thuộc tính Thẻ rỗng là thẻ DIEM có 2 thuộc tính là x, y
khi nào thì dùng thẻ. Tuy
nhiên nên sử dụng thẻ
Thẻ DUONG_TRON có 1 thuộc tính là Ban_kinh
thay thuộc tính để dễ
mở rộng hơn.

5
1.2. ĐỊNH CHUẨN XML ... 1.2. ĐỊNH CHUẨN XML ...
Ví dụ: Có một cách khác để biểu diễn thẻ rỗng là bỏ thẻ
<Customer> đóng (closing Tag) và thêm một dấu "/" (slash) ở
cuối thẻ mở (openning Tag).
<FirstName>Stephen</FirstName>
Ví dụ: Có thể viết lại thí dụ customer như sau:
<MiddleInitial></MiddleInitial>
<LastName>King</LastName>
<Customer>
</Customer>
<FirstName>Stephen</FirstName>
<MiddleInitial></MiddleInitial>
<MiddleInitial/>
 Thẻ có nội dung là các thẻ: <LastName>King</LastName>
Customer, FirstName, LastName </Customer>
 Thẻ rỗng là thẻ MiddleInitial không có thuộc
tính

1.2. ĐỊNH CHUẨN XML... 1.2. ĐỊNH CHUẨN XML ...


...from W3School Chú ý:
 Tên thẻ phải bắt đầu bằng chữ hoặc dấu “_”, các ký
tự tiếp theo có thể là chữ số, chữ cái, dấu nối dưới,
dấu chấm hoặc dấu hai chấm.
 Tên thẻ có phân biệt chữ hoa, chữ thường
 Thẻ rỗng không chứa dữ liệu hay bất kỳ thẻ nào
khác nhưng có thể có thuộc tính
 Giá trị thuộc tính phải được đặt trong cặp nháy kép
 Khi dùng thuộc tính thì phải có giá trị
 Cách đặt tên cho thuộc tính đúng theo quy tắc đặt
tên cho thẻ

1.2. ĐỊNH CHUẨN XML... 1.2. ĐỊNH CHUẨN XML...


Qui định 2: Quan hệ lồng nhau giữa các thẻ có nội Ví dụ : Giả sử thẻ A là cha của thẻ B.
dung Dạng hợp lệ:
Nội dung bên trong thẻ có nội dung có thể là các thẻ <A>
khác (có nội dung hay rỗng). <B> ….</B>
</A>
Khi thẻ A có nội dung là thẻ B ta gọi:
“Thẻ A là cha của thẻ B” hoặc “thẻ A chứa thẻ B”
Dạng không hợp lệ:
“Thẻ B là con của thẻ A” hoặc “thẻ B chứa trong thẻ A”
<A>
<B> ….</A>
Qui định 2 yêu cầu: Khi thẻ A là cha của thẻ B thì A
</B>
phải chứa phần bắt đầu và cả phần kết thúc của B

6
Một công thức nấu ăn viết bằng XML - Dạng lồng nhau
Một ví dụ đơn giản
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" standalone="yes"?> <Kỹ_thuật_nấu_nướng>
<greeting> <Món_ăn>
Chào các bạn. <Tên>BÚN BÒ HUẾ</Tên>
<Các_nguyên_liệu>
</greeting>
<Nguyên_liệu>
hay
<Chủng_loại>thịt giò heo</Chủng_loại>
<?xml version="1.0" standalone="yes"?> <Số_lượng đơn_vị=”g”>800</Số_lượng>
<chaohoi> </Nguyên_liệu>
Chào các bạn. <Nguyên_liệu>
</chaohoi> <Chủng_loại>thịt bò nạm</Chủng_loại>
hay <Số_lượng đơn_vị=”g”>400</Số_lượng>
<?xml version="1.0" standalone="yes"?> </Nguyên_liệu>
...
<tailieu>
</Các_nguyên_liệu>
Chào các bạn. </Món_ăn>
</tailieu> </Kỹ_thuật_nấu_nướng>

1.2. ĐỊNH CHUẨN XML... Một số ví dụ...


Qui định 3: Thẻ đánh dấu gốc
Tài liệu XML phải có duy nhất một thẻ, thẻ gốc, chứa
tất cả các thẻ còn lại (nếu có).
Ví dụ: Tài liệu XML sau biểu diễn thông tin 2 đuờng
tròn là không hợp lệ vì không có thẻ gốc.
<?xml version="1.0" encoding="utf-8"?>
<DUONG_TRON Ban_kinh="5">
<DIEM x="4" y="2"/>
</DUONG_TRON>
<DUONG_TRON Ban_kinh="5">
<DIEM x="4" y="2"/>
See also:
</DUONG_TRON>
http://www.w3schools.com/xml/xml_syntax.asp

1.3. NỘI DUNG TÀI LIỆU XML 1.3. NỘI DUNG TÀI LIỆU XML

Nội dung của tài liệu XML bao gồm 2 phần: Nội dung
phụ
Nội dung chính:
Hệ thống các thẻ đánh dấu (có hoặc không có nội
dung) tương ứng với các thông tin cần biểu diễn.
Nội dung
Nội dung phụ: chính

Bao gồm các thẻ khác có ý nghĩa bổ sung, tăng


cường một số thông tin về tài liệu XML.
Các thẻ này có tác dụng giúp cho việc sử dụng, xử
lý trên tài liệu XML tốt hơn trong một số trường
hợp nhất định.

7
1.3. NỘI DUNG TÀI LIỆU XML 1.3.1. Thẻ khai báo tham số
Các thẻ bên trong nội dung phụ bao gồm loại sau: Mục đích: cho phép mô tả thêm một số thông tin chung
(tham số) về tài liệu XML ngoài các thông tin đã biểu
1. Thẻ khai báo tham số diễn trong nội dung chính.
<?xml version=”1.0” encoding=”utf-8”?> Dạng khai báo
<?xml version=”1.0” ?>
<?xml standalone=”yes”?> <?xml Ten_1=”Gia_tri_1” Ten_2=”Gia_tri_2” … ?>
2. Thẻ chỉ thị xử lý
<?xml-stylesheet?> Trong đó,
Ten_1, Ten_2, … là các tên của các tham số và
3. Thẻ ghi chú
Gia_tri_1, Gia_tri_2, … là các giá trị tương ứng.
<!-- Nội dung ghi chú --> Cho đến nay chỉ có 3 tham số được dùng là:
4. Thẻ CDATA version, encoding, và standalone.
<sosanh><![cdata[6 is<7 & 7>6]]></sosanh>

1.3.1. Thẻ khai báo tham số ... 1.3.1. Thẻ khai báo tham số ...

Tham số version: Tham số encoding


 bắt buộc phải có nếu các tham số khác đuợc sử  Khai báo về cách mã hóa các ký tự trong tài liệu
dụng.  Ví dụ: Khai báo tài liệu XML sử dụng cách mã hóa
Unicode ký hiệu utf-8:
Tham số version dùng để khai báo phiên bản của <?xml version=”1.0” encoding=”utf-8”?>
định chuẩn XML đuợc sử dụng. Tham số standalone
 Khai báo về liên kết của tài liệu XML với các tài
 Ví dụ: liệu khác.
Khai báo tài liệu XML thuộc định chuẩn 1.0 Tham số này chỉ có 2 giá trị hợp lệ là “yes”, “no”.
Giá trị mặc định là “no”.
<?xml version=”1.0” ?>
 Ví dụ: Tài liệu XML có liên kết với các tài liệu khác
<?xml standalone=”yes”?>

1.3.2. Thẻ chỉ thị xử lý 1.3.2. Thẻ chỉ thị xử lý ...


Mục đích: Dạng khai báo: <?Bo_xu_ly Du_lieu?>
 Chỉ thị xử lý là những hướng dẫn cho trình xử lý Bo_xu_ly là ký hiệu của bộ xử lý sẽ tiến hành một số
XML. xử lý nào đó trên tài liệu XML. Du_lieu là thông tin
XML không có các chỉ thị được xây dựng sẵn, tùy được gửi đến Bo_xu_ly.
thuộc vào trình xử lý có hỗ trợ hay không. Ví dụ:
<?xml-stylesheet type=”text/css” href=”Dinh_dang.css”?>
 Ví dụ <?xml-stylesheet?> được IE5 và Nescape hỗ  Là thẻ chỉ thị cần xử lý định dạng thể hiện tài liệu
trợ nhưng không phải là chỉ thị chính thức được W3C XML với “chương trình định dạng” theo ngôn ngữ
công nhận. CSS đuợc lưu trữ bên trong tập tin Dinh_dang.css
Thẻ này sẽ có ý nghĩa với một số trình duyệt Web
Chỉ thị xử lý là một phương pháp cho phép mở rộng, như IE (phiên bản 5.0 về sau), Netscape (phiên
bổ sung các xử lý riêng vào một lớp tài liệu XML cùng bản 6.0 về sau).
thuộc một hệ thống phân lớp nào đó.

8
1.3.3. Thẻ ghi chú 1.3.4. Thẻ CDATA
Mục đích Mục đích
Bổ sung các thông tin ghi chú có ý nghĩa đối với CDATA là một đoạn dữ liệu trong tài liệu XML nằm
người sử dụng và hoàn toàn không có ý nghĩa với giữa <![CDATA[ và ]]>.
các hệ thống xử lý tài liệu XML, HTML. Yêu cầu các bộ phân tích tài liệu XML bỏ qua và
Dạng khai báo: <!-- Nội dung ghi chú --> không phân tích vào nội dung bên trong của thẻ này.
Chú ý: Tác dụng của thẻ là cho phép sử dụng trực tiếp bên
 Không dùng chuỗi "--" bên trong một ghi chú trong thẻ một số ký hiệu không đuợc phép nếu sử
Nghĩa là, các dòng sau là không hợp lệ: dụng bên ngoài (ví dụ các ký tự “<” , “>” , …)
 <!--Nội dung -- ghi chú --> Dạng khai báo
<![CDATA [Nội dung]]>
Ví dụ:
<sosanh><![cdata[6 is<7 & 7>6]]></sosanh>

1.3.5. Thẻ khai báo thực thể 1.3.5. Thẻ khai báo thực thể - Ví dụ

Trường hợp muốn sử dụng các ký tự dành riêng như <?xml version="1.0"?>
“<“, “&”, ... của XML chúng ta có thể dùng CDATA. <document>
 Một cách khác là dùng thẻ khai báo thực thể dạng <title>Thơ tình</title>
tham số với 5 khai báo thực thể chung được định <message>
nghĩa trước là: Bài thơ &quot;Biển&quot; của Xuân Diệu
 lt; Thay bằng dấu < </message>
 gt; Thay bằng dấu > </document>
 amp; Thay bằng dấu 
 quot; Thay bằng dấu “ Sẽ hiển thị:
 apos; Thay bằng dấu „ Bài thơ “Biển” của Xuân Diệu

1.3.6 Ký tự trắng và dấu xuống dòng 1.3.7 Tạo phần mở đầu

Các ký tự: trắng, xuống dòng, trở về đầu dòng và tab Phần mở đầu xuất hiện ở phần đầu của tài liệu, nó
<?xml version="1.0"?> <document> <message>
chứa thông tin về phần thân của tài liệu
đều được xử lý như ký tự trắng trong XML
Bài thơ &quot;Biển&quot; của Xuân Diệu
Ví dụ: Hai tài liệu sau là tương đương nhau Phần mở đầu có thể là các khai báo XML, ghi chú,
</message></document>
chỉ thị xử lý, ký tự trắng và khai báo DTD (Document Type
Definition)

<?xml version="1.0"?>
<document> Phần mở đầu không bắt buộc, nhưng ít nhất phải có
<message> phần khai báo XML
Bài thơ &quot;Biển&quot; của Xuân Diệu
</message>
</document> Ví dụ: Phần mở đầu chứa khai báo XML, chỉ thị xử lý
DTD (Document Type Definition)

9
1.3.7 Tạo phần mở đầu-Ví dụ Phần khai báo XML 1.4. TÀI LIỆU XML HỢP KHUÔN DẠNG
<?xml version = "1.0" encoding="UTF-8" standalone="yes"?> 1.4.1 XML Well_Formed
<!DOCTYPE emp:document [
<!ELEMENT emp:document (emp:employee)*> 1. Tài liệu XML phải bắt đầu bằng khai báo XML
<!ATTLIST emp:document (XML declaration)
xmlns:emp CDATA #FIXED "http://www.viduxml.com/dtds/">
2. Mỗi bộ phận, gọi là "element" phải nằm giữa một
<!ELEMENT emp:employee (emp:name, emp:hiredate, emp:projects)>
<!ELEMENT emp:name (emp:lastname, emp:firstname)> cặp thẻ
<!ELEMENT emp:lastname (#PCDATA)> 3. Nếu thẻ nào không chứa gì ở giữa thì phải chấm
<!ELEMENT emp:firstname (#PCDATA)> dứt bằng ký hiệu "/>“
<!ELEMENT emp:hiredate (#PCDATA)>
<!ELEMENT emp:projects (emp:project)*> 4. Phải có một thẻ độc nhất chứa tất cả các thẻ
<!ELEMENT emp:project (emp:product, emp:id, emp:price)> khác. Đó là thẻ gốc (root elemement)
<!ELEMENT emp:product (#PCDATA)>
<!ELEMENT emp:id (#PCDATA)> 5. Các cặp thẻ không được xen kẽ vào nhau
<!ELEMENT emp:price (#PCDATA)> Phần khai báo DTD
]> 6. Phải thoả mãn các các ràng buộc hợp khuôn
dạng trong đặc tả về XML

1.4. TÀI LIỆU XML HỢP KHUÔN DẠNG... Ví dụ: một tài liệu XML hợp khuôn dạng
<?xml version = "1.0" encoding="UTF-8" standalone="yes"?>
 Phải có một thẻ gốc (root Element) duy nhất, gọi <document>
<employee> Phần tử gốc là duy nhất Phần khai báo
là Document Element, nó chứa tất cả các thẻ khác <name>
<firstname>Nguyen</firstname>
trong tài liệu XML. <lastname>Mau Han</lastname> Phần tử gốc chứa
 Mỗi opening Tag phải có một closing Tag giống như </name> các phần tử khác
<hiredate>July 15, 2005</hiredate>
nó. <projects>
<project>
 Tags trong XML phải case sensitive, tức là opening <product>Printer</product>
Mỗi opening tag phải có một
Tag và closing Tag phải như nhau, có phân biệt chữ <id>HP2300</id>
<price>$111.00</price> closing tag giống như nó
hoa, chữ thường. </project>
<project>
 Mỗi thẻ con phải nằm trọn bên trong thẻ cha của nó. <product>Laptop</product>
<id>DELL1100</id>
 Giá trị thuộc tính trong XML phải được gói giữa một <price>$989.00</price>
cặp ngoặc kép hay một cặp ngoặc đơn </project>
</projects>
</employee>
</ document >

1.4. TÀI LIỆU XML HỢP KHUÔN DẠNG ... Ví dụ: một tài liệu XML không hợp khuôn dạng

1.4.2 XML Validating


XML Validating-“XML hợp lệ”: là khái niệm chặc chẻ
hơn XML Well-form
Một tài liệu XML muốn validating thì không những
phải well-formed mà còn phải đúng cú pháp và phải
thỏa mãn schema của nó (ở đây schema có thể là
DTD hoặc XML Schema).
Chúng ta có thể kiểm tra cú pháp và tính hợp lệ của
một tài liệu XML ở trang của W3C:
http://www.w3schools.com/xml/xml_validator.asp hoặc
Kiểm tra XML và XSD online:
http://www.xmlvalidation.com/index.php

10
1.5. BỘ PHÂN TÍCH XML (XML Parser) 1.5. BỘ PHÂN TÍCH XML (XML Parser)
 Parser là gì?  Mục tiêu của một Parser là để biến đổi XML thành một code có
Parser là công cụ (hàm, thư viện, API, phần mềm, …) cho thể đọc.
phép phân tích cấu trúc cũng như thực hiện các thao tác  Một số Parser được sử dụng phổ biến là:
(đọc/ghi) với file XML. MSXML (Microsoft Core XML Services): Đây là một tập hợp các
 Những kỹ thuật nào được các Parser sử dụng? XML Tool chuẩn từ Microsoft, bao gồm một Parser.
Có 2 kỹ thuật chính: DOM (Document Object Model) và SAX System.Xml.XmlDocument: Lớp này là một phần của thư viện
(Simple API for XML). .NET, chứa một số lớp có liên quan trong khi làm việc với XML.
 DOM thì tải toàn bộ cấu trúc của XML vào bộ nhớ rồi parse Thƣ viện Java có Parser riêng: Thư viện này được thiết kế để
nó thành một Tree. Do tốn kém bộ nhớ nên DOM khó có thể bạn có thể thay thế một Parser đã có sẵn với một triển khai
sử dụng với các file XML quá lớn. Ưu điểm chính của DOM ngoại vi như Xerces từ Apache hoặc Saxon.
là có thể thực hiện được các thao tác đọc/ghi trên tài liệu
XML. Saxon: Saxon cung cấp các tool để phân tích, biến đổi, và truy
vấn XML.
 SAX thì lại quét (scan) file XML từ trên xuống dưới, không
tạo Tree, nên không tốn nhiều bộ nhớ, có thể áp dụng với Xerces: Xerces được triển khai trong Java và được phát triển bởi
file XML cực lớn, nhưng chỉ có thể thực hiện thao tác đọc. mã nguồn mở nổi tiếng là Apache Software Foundation.

1.6. NGÔN NGỮ ĐẶC TẢ CẤU TRÚC CHO TÀI LIỆU XML 1.6. NGÔN NGỮ ĐẶC TẢ CẤU TRÚC CHO TÀI LIỆU XML...

Nhận xét: Đối tượng nào sử dụng đặc tả cấu trúc tài liệu XML?
Có rất nhiều ngôn ngữ đặc tả được đề xuất để mô tả cấu Có 2 trường hợp chính sử dụng đặc tả cấu trúc:
trúc tài liệu XML: Trường hợp 1: Sử dụng cho việc trao đổi thông tin
 DTD người – người
 XML Schema - Thông dụng
 XMl-Data - Dễ sử dụng
 Schematron Trường hợp 2: Sử dụng cho việc trao đổi thông tin
 RELAX NG, người – hệ thống xử lý
 ... - Chỉ sử dụng khi có hệ thống xử lý “hiểu” và thực
Trong số đó có 2 ngôn ngữ thông dụng là: hiện các xử lý tương ứng nào đó với tài liệu đặc
 DTD (chương 2) tả cấu trúc
 XML Schema (chương 3) - Xử lý thông dụng nhất là kiểm tra một tài liệu XML
có theo đúng cấu trúc đuợc mô tả trong tài liệu
đặc tả cấu trúc hay không.

1.7. MỘT SỐ KỸ THUẬT ĐẶC TẢ NỘI DUNG THẺ 1.7.1 Kỹ thuật sử dụng tên tiền tố

Nhận xét: Gr4, Gr1, Gr2 Tên thẻ, tên thuộc tính trong một tài liệu XML thuộc về
1 trong 2 loại sau: tên không tiền tố và tên có tiền tố:
 Ý nghĩa chung các thẻ khai báo thực thể là cho phép
 Tên không tiền tố :
tài liệu XML tham chiếu đến một tập hợp các giá trị Là một chuỗi ký tự lấy từ: (a, ..., z, A, ..., Z, 0, ..., 9)
đã chuẩn bị trước dưới dạng một tên gợi nhớ (tên và một số ký tự khác như „–„ , “_” , “.”.
thực thể).  Tên có tiền tố :
 Mỗi cách thức tham chiếu và “loại” của tập hợp giá trị  Có dạng <Chuoi_tien_to:Chuoi_ten>
 Ví dụ:
được tham chiếu tương ứng với một ý nghĩa/mục tiêu
<A:MAT_HANG …./>
riêng và sẽ yêu cầu dạng thẻ khai báo thực thể thích <B:MAT_HANG …/>
hợp. Thẻ A:MAT_HANG tương ứng thông tin về mặt hàng trong cty A.
Thẻ B:MAT_HANG tương ứng thông tin về mặt hàng trong cty B.
2 thẻ này có thể có các thuộc tính khác nhau.

11
Khi nào sử dụng tên tiền tố? Ví dụ: Sử dụng tên tiền tố
Nếu chỉ sử dụng tài liệu XML đơn lẻ, riêng cho ứng
dụng cục bộ thì không cần thiết dùng tiền tố trong tên.
<table> <v:table>
Nếu cần tiếp nhận, kết xuất toàn bộ/một phần tài liệu <tr> <v:tr>
XML từ/đến một ứng dụng khác thì việc sử dụng tên
<td>Apples</td> <v:td>Apples</v:td>
với tiền tố là cần thiết.
<td> Bananas </td> <v:td> Bananas </v:td>
Tiền tố của tên được dùng để phân biệt đuợc nguồn </tr> </v:tr>
gốc của một thẻ trong tài liệu XML được tạo thành từ </table> </v:table>
nhiều tài liệu XML khác có các thẻ trùng phần tên
không tiền tố.
Ví dụ minh họa:
Tài liệu XML không dùng tiền tố Tài liệu XML có dùng tiền tố

1.7.1 Kỹ thuật sử dụng tên tiền tố 1.7.1 Kỹ thuật sử dụng tên tiền tố

Name Conflicts
Name conflicts in XML can easily be avoided using a name prefix
In XML, element names are defined by the developer. This
often results in a conflict when trying to mix XML documents This XML carries information about an HTML table, and a
from different XML applications. piece of furniture:

If these XML fragments were added


together, there would be a name
conflict. Both contain a <table> there will be no
element, but the elements have conflict because
different content and meaning. the two <table>
elements have
different names.

A user or an XML
application will not
know how to handle
these differences.

1.7.2. Không gian tên (namespace) Khai báo không gian tên ...
XML cho phép dùng cùng một tên nhưng lại nói đến 1. Khai báo không gian tên bằng tên tiền tố
nhiều loại dữ liệu khác nhau trong cùng một tài liệu Để khai báo một không gian tên ta chỉ cần đưa thêm thuộc
XML. Xem ví dụ sau: tính xmlns:prefix vào bên trong phần tử gốc, trong đó:
• prefix là tên của không gian tên, mỗi không gian tên cần
Khi quan sát kỹ, ta
thấy có thể có sự
mang một định danh duy nhất.
nhầm lẫn về cách • Một không gian tên có thể là một địa chỉ trên internet
dùng Element Title. hoặc một địa chỉ nào đó, miễn là địa chỉ này phải duy nhất.
Trong tài liệu có hai • Ví dụ sau đây sẽ tạo ra một không gian tên hs và áp dụng
loại Title, một cái cho tất cả các thẻ con:
dùng cho khách
hàng Customer nói
đến danh hiệu Mr.,
Mrs., Dr., còn cái kia
để nói đến đề tựa
của một quyển
sách Book.

12
Khai báo không gian tên ... 1.6.2.
<?xml Không gian tên ...
version="1.0"?>
<BookOrder OrderNo="1234">
2. Khai báo không gian tên mặc định <OrderDate>2001-01-01</OrderDate>
Nếu các thẻ trong tài liệu chỉ sử dụng duy nhất một <Customer xmlns="http://www.northwindtraders.com/customer">
<Title>Mr.</Title>
không gian tên thì chúng ta có thể khai báo không
<FirstName>Graeme</FirstName>
gian tên mặc định cho các thẻ con của một thẻ cha <LastName>Malcolm</LastName>
bằng cách chỉ ghi thuộc tính xmlns và bỏ đi prefix </Customer>
<Book xmlns="http://www.northwindtraders.com/book">
<Title>Treasure Island</Title>
<Author>Robert Louis Stevenson</Author>
</Book>
</BookOrder>

Một ví dụ về namespace default

Nhận xét:Không gian tên ...


1.6.2. 1.7.2. Không gian tên ...
Ta đã tránh được sự nhầm lẫn vì bên trong Customer
thì dùng namespace: Tuy nhiên, ta sẽ giải quyết làm sao nếu trong order có
<?xml version="1.0"?>
nhiều customer
<BookOrder và nhiều book.
xmlns="http://www.northwindtraders.com/order"
http://www.northwindtraders.com/customer
Một cách giải quyết là khai báo chữ viết tắt cho các
xmlns:cust="http://www.northwindtraders.com/customer"
và bên trong Book thì dùng namespace: xmlns:book=http://www.northwindtraders.com/book OrderNo="1234">
namespaces trong root Element
<OrderDate>2001-01-01</OrderDate>
http://www.northwindtraders.com/book. đó bên trong tài liệu ta sẽ prefix các Element
Sau chữ viếtcần
<cust:Customer>
tắt của
<cust:Title>Mr.</cust:Title>
Tuy nhiên, ta sẽ giải quyết làm sao nếu trong order có xác<cust:FirstName>Graeme</cust:FirstName>
nhận namespace bằng chữ viết tắt của namespace
nhiều customer và nhiều book. namespace nó. Vídụ trên có thể viết như sau:
<cust:LastName>Malcolm</cust:LastName>
</cust:Customer>
Một cách giải quyết là khai báo chữ viết tắt cho các
<book:Book>
namespaces ngay trong thẻ gốc (root Element). Sau <book:Title>Treasure Island</book:Title>
đó bên trong tài liệu ta sẽ xác nhận namespace bằng <book:Author>Robert Louis Stevenson</book:Author>
</book:Book>
tên của namespace đó. </BookOrder>
Ví dụ trên viết lại bằng tên của namespace như sau:

Nhận xét:
Chú ý: Trong tài liệu XML trên ta dùng 3 namespaces:  Không gian tên là chuoi_tien_to có đặc điểm quan
 default namespace tên: http://www.northwindtraders.com/order trọng như sau: Chuoi_tien_to phải là duy nhất trên
namespace: http://www.northwindtraders.com/customer (viết tắt phạm vi toàn cầu.
là cust)
 Bản chất của không gian tên chính là Chuoi_tien_to
 và namespace:
được sử dụng trong một số các tài liệu XML.
http://www.northwindtraders.com/book (viết tắt là book).
 Đặc điểm trên nhằm bảo đảm rằng khi một ứng dụng
 Các Elements và Attributes không có prefix (tức là không có
chữ tắt đứng trước) như BookOrder, OrderNo, và OrderDate, được sử dụng các tài liệu XML của mình với Chuoi_tien_to
coi như thuộc về default namespace. thì không có tài liệu XML nào của các ứng dụng khác
 Để đánh dấu một Element hay Attribute không thuộc về default trên phạm vi toàn cầu sử dụng Chuoi_tien_to đó.
namespace, một chữ tắt, đại diện namespace sẽ được gắn làm  Với đặc điểm trên thông thường không gian tên đuợc
prefix cho tên Element hay Attribute. chọn là chuỗi tương ứng với một địa chỉ URL của một
Ví dụ như cust:LastName, book:Title tên miền trong định vị của Internet.

13
Định nghĩa không gian tên với URI (Uniform Resource Identifier) 1.8. XML TREE
<hr:employee xmlns:hr="http://www.hr.com/human_resources">
<hr:name>  XML documents form a tree structure that starts at
<hr:firstname>Nguyen</hr:firstname> "the root" and branches to "the leaves".
<hr:lastname>Mau Han</hr:lastname>
</hr:name>
<hr:hiredate>July 15, 2012</hr:hiredate> root element
<hr:projects>
<hr:project>
child
<hr:product>Printer</hr:product> elements
<hr:id>111</hr:id>
<hr:price>$111.00</hr:price>
</hr:project>
<hr:project>
<hr:product>Laptop</hr:product>
<hr:id>222</hr:id>
<hr:price>$989.00</hr:price>
</hr:project>
</hr:projects> See also from:
</hr:employee http://www.w3schools.com/xml/xml_namespaces.asp

1.9. LỢI ÍCH CỦA XML


1.9.1 Nhu cầu trao đổi thông tin
Trao đổi thông tin nội bộ bên trong một HTTT
Sự phát triển về qui mô, độ phức tạp, phạm vi sử
dụng của các hệ thống thông tin dẫn đến sự phân rã
hệ thống cần xây dựng thành các hệ thống con.

Ví dụ:
- A, B là 2 thành phần bên trong một hệ thống thông tin
(giao diện, xử lý hay lưu trữ)
- Tài liệu XML đuợc thiết kế cho việc sử dụng nội bộ
giữa 2 thành phần A, B.

1.9. LỢI ÍCH CỦA XML... Ngoài ra XML có thể đƣợc sử dụng để:

1.9.1 Nhu cầu trao đổi thông tin ... Trao đổi thông tin giữa các tầng của một ứng dụng
Trao đổi thông tin giữa các hệ thống thông tin; giữa đuợc thiết kế theo mô hình kiến trúc đa tầng.
các ứng dụng (đặc biệt các ứng dụng Web) Trao đổi thông tin giữa một tầng với hệ thống khác
bên ngoài. Chẳng hạn,
Trao đổi thông tin giữa hệ thống đang xây dựng và  Có thể sử dụng XML để trao đổi thông tin giữa hệ thống
lưu trữ dữ liệu (thông thường là hệ quản trị CSDL và tầng
các hệ thống có sẵn xử lý lưu trữ dữ liệu).
 Ví dụ:  Sử dụng XML trao đổi thông tin giữa tầng dữ liệu và tầng
- A là hệ thống thông tin đang xem xét. xử lý nghiệp vụ.
- B là hệ thống đã có trước với khả năng chuyên biệt  Sử dụng XML trao đổi thông tin giữa tầng xử lý nghiệp vụ
và tầng thể hiện.
nào đó.
 Sử dụng XML trao đổi thông tin giữa các tầng xử lý nghiệp
- A phải sử dụng tài liệu XML có cấu trúc do B đề vụ (khi hệ thống có nhiều tầng xử lý nghiệp vụ).
xuất.

14
Một ví dụ về sử dụng XML để trao đổi thông tin ví dụ về sử
dụng XML để
Một file XML chứa thông tin về Earthquake trao đổi thông
tin:

An XML
national
weather service
from NOAA
(National
Oceanic and
Atmospheric
Administration-
cơ quan quản
lý quốc gia về
Đại dương và
Khí quyển):

1.9.2 Lƣu trữ thông tin 1.9.2 Lƣu trữ thông tin...
Có 3 cách chính để sử dụng XML trong việc lưu trữ Cách 2 : Một số dữ liệu lưu trữ dưới dạng tập tin XML,
dữ liệu bên trong một HTTT. một số khác lưu trữ bên trong cơ sở dữ liệu.
Cách 1 : Chỉ sử dụng các tập tin XML để lưu trữ dữ liệu - Ưu điểm: Có thể kết hợp tốt ưu điểm của cả 2 mô
- Ưu điểm: Không cần sự hỗ trợ của các DBMS hình lưu trữ thông tin: XML và Cơ cở dữ liệu.
Dễ cài đặt, triển khai - Khuyết điểm: Cần phải có sự cân nhắc và quyết
- Khuyết điểm: Tính hiệu quả không cao khi khối lượng dữ định đúng đắn loại thông tin nào sẽ dùng hình thức
liệu lớn. lưu trữ nào.
- Nhận xét:
- Nhận xét:
 Các phần mềm trò chơi sử dụng tốt theo cách 1
 Cách 2 là cách sử dụng phổ biến nhất hiện nay
 Các phần mềm quản lý không thích hợp
 Rất thích hợp cho các ứng dụng trên các môi trường  Cấu hình của hệ thống thông tin hoặc các phân
không có (hoặc chưa có) DBMS như điện thoại di động, hệ ứng dụng là loại thông tin thường được chọn
máy công cụ , v.v… để lưu trữ theo dạng tài liệu XML.

1.9.2 Lƣu trữ thông tin 1.9.3 Ứng dụng XML với các cấu trúc dữ liệu
Cách 3 : Lưu trữ toàn bộ dữ liệu bên trong CSDL, tài Trong mô hình DOM, có thể sử dụng XML như một
liệu XML khi đó đuợc nhúng vào nội dung các bảng loại cấu trúc dữ liệu động với nhiều ưu điểm:
dữ liệu Đọc/Ghi dễ dàng:
Các cấu trúc dữ liệu động như: mảng động (Dynamic
Array), Xâu (List), Ngăn xếp (Stack), Hàng đợi (Queue), Cây
- Ưu điểm: Có thể kết hợp tốt ưu điểm của cả 2 mô (Tree), … có nhiều tính năng tốt trong việc biểu diễn và xử lý
hình lưu trữ thông tin: XML, Cơ cở dữ liệu. thông tin trong bộ nhớ chính.
Tuy nhiên việc đọc/ghi thông tin của các cấu trúc dữ liệu
- Khuyết điểm: tốn kém chi phí thời gian chuyển đổi này từ/vào bộ nhớ phụ (thông thường thông qua tập tin) là
không đơn giãn và thường phải thực hiện gián tiếp với một
dữ liệu.
bộ đọc ghi.
Tài liệu XML có thể sử dụng để cài đặt lại hầu hết các cấu
trúc dữ liệu động.

15
1.9.3 Ứng dụng XML với các cấu trúc dữ liệu ... Ngoài ra:
 Khả năng truy vấn cao:
Việc truy vấn các thành phần/tập hợp thành phần
của các cấu trúc dữ liệu động thường phải thông XML được tự do mở rộng
qua các vòng lặp duyệt đến từng phần tử.
XML có thể tách rời dữ liệu khỏi HTML

Với tài liệu XML, có thể sử dụng ngôn ngữ truy XML được dùng để chia sẻ dữ liệu
vấn Xpath để truy xuất đến thành phần/tập hợp
thành phần một cách dễ dàng (chỉ với một lệnh gọi XML làm cho dữ liệu hữu dụng hơn
hàm đơn giãn)
XML có thể được dùng để tạo ngôn ngữ mới

BÀI TẬP: BÀI TẬP:

1. Viết một file XML để mô tả về lí lịch sinh viên như Xem các ví dụ về XML ở:
sau: http://www.w3schools.com/xml/xml_examples.asp

Viết một file XML để chứa các thông tin về một MV.
Tham khảo:
http://www.w3schools.com/xml/cd_catalog.xml

Ứng dụng của XML vào Web


See Also:
 http://www.w3schools.com/xml/default.asp

 Kiểm tra XML và XSD online:


http://www.xmlvalidation.com/index.php

NỘI DUNG

2.1. ĐẶC TẢ CẤU TRÚC TÀI LIỆU XML


CHƢƠNG 2: VỚI DTD
2.2. PHẦN TỬ <!DOCTYPE>
ĐẶC TẢ NỘI DUNG & CẤU TRÚC
TÀI LIỆU XML VỚI DTD 2.3. PHẦN TỬ <!ELEMENT>

CONTENT SPECICATION &


2.4. PHẦN TỬ <!ATTLIST>
STRUCTION A XML DOCUMENT BY DTD
(Document Type Definition)
2.5. PHẦN TỬ <!ENTITY>

95

16
2.1. ĐẶC TẢ CẤU TRÚC TÀI LIỆU XML VỚI DTD 2.1. ĐẶC TẢ CẤU TRÚC TÀI LIỆU XML ...

DTD là gì?
Mục đích của DTD:
 DTD (Document Type Definition) là một tài liệu dùng
để định nghĩa kiểu dữ liệu cho các phần tử trong tài DTD được sử dụng để xác định cấu trúc và luật lệ
liệu XML của một tài liệu XML. Mỗi tài liệu XML có một khai
Việc định nghĩa các phần tử trong XML là tùy ý, miễn báo DTD riêng tùy theo mục đích của người viết.
sao cho nó hợp quy tắc của tài liệu XML. Tuy nhiên  Để có thể đọc được dữ liệu trong XML, người đọc
để tường minh hơn thì ta nên định nghĩa kiểu dữ liệu phải biết DTD của bản XML tương ứng.
cho từng phần tử (thẻ, thuộc tính) trong tài liệu XML
Khi đọc một tài liệu XML nào đó thì chỉ cần đọc phần Mục đích của DTD là làm sao cho nhiều người hay
DTD mô tả tài liệu XML chúng ta sẽ biết được cấu chương trình khác nhau có thể đọc file lẫn nhau.
trúc của tài liệu XML đó
DTD của một tài liệu XML là một file text có phần mở
rộng *.dtd

phần DTD dùng để mô phần DTD dùng để mô


Ví dụ về một DTD... tả kiểu dữ liệu của tài Ví dụ về một DTD... tả kiểu dữ liệu của tài
liệu XML bên dưới liệu XML bên dưới
<?xml version="1.0"?> <?xml version="1.0"?>
<!DOCTYPE note [ <!DOCTYPE author [
<!ELEMENT note (to,from,heading,body)> <!ELEMENT author (#PCDATA)>
<!ELEMENT to (#PCDATA)>
<!ATTLIST author CR CDATA #REQUIRED>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)> <!ENTITY writer SYSTEM
<!ELEMENT body (#PCDATA)> "http://www.w3schools.com/entities/entities.xml">
phần tài liệu
]> XML <!ENTITY copyright SYSTEM "copyright.txt">
<note> ]> phần tài liệu XML
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading> <author CR="C" >& writer; &copyright; </author>
<body>Don't forget me this weekend</body>
</note>

Ví dụ về một DTD đƣợc định nghĩa bên ngoài tài liệu XML

Why Use a DTD?


With a DTD, each of your XML files can carry a
description of its own format.
With a DTD, independent groups of people can
agree to use a standard DTD for interchanging data.
Your application can use a standard DTD to verify
that the data you receive from the outside world is
valid.
You can also use a DTD to verify your own data.

...from W3CSchool

17
2.2. Phần tử <!DOCTYPE> của tài liệu DTD 2.2. Phần tử <!DOCTYPE> ...
1. Định nghĩa DTD tham chiếu nội
Phần tử <!DOCTYPE> dùng để khai báo thẻ gốc
Cú pháp: <!DOCTYPE root-element [element-declarations]
của tài liệu XML.
Trong đó:
- root-element là thẻ gốc của tài liệu XML,
Khai báo cấu trúc DTD có 2 dạng: - element-declarations là các định nghĩa cho các phần tử
DTD tham chiếu nội: DTD được định nghĩa ngay trong tài liệu XML. khai báo các định nghĩa cho
trong tài liệu XML Ví dụ: version="1.0"?>
- <?xml Xét một tài liệu DTD thẻ gốc các phần tử trong
<!DOCTYPE note [ tài liệu XML
<!ELEMENT note body>
DTD tham chiếu ngoại: DTD được định nghĩa bên <!ELEMENT body (#PCDATA)> thẻ gốc
ngoài tài liệu XML ]>
phần tài liệu XML
<note>
<body>Don't forget me this weekend</body>
</note>

Ví dụ về một DTD tham chiếu nội 2.2. Phần tử <!DOCTYPE> ...
2. Định nghĩa DTD tham chiếu ngoại
 Nhận xét: sử dụng định nghĩa DTD tham chiếu ngoại sẽ làm
cho các ứng dụng XML trở nên dễ dàng chia sẻ và dùng
chung với các ứng dụng khác.
 Có hai cách để định nghĩa một DTD tham chiếu ngoại:
 Tham chiếu ngoại riêng: mang tính cá nhân, không được
dùng cho mục đích chung rộng lớn/mục đích phân phối.
 Tham chiếu ngoại chung: mang tính cộng đồng
a) DTD tham chiếu ngoại riêng:
Cú pháp:
<!DOCTYPE root-element SYSTEM “filename”>
Trong đó root-element là tên thẻ gốc trong tài liệu XML,
filename là tên file DTD định nghĩa kiểu tài liệu XML (*.dtd)

Ví dụ định nghĩa một DTD tham chiếu ngoại riêng 2.2. Phần tử <!DOCTYPE> ...
File note.xml với nội dung như sau: Chú ý:
<?xml version="1.0"?> Khi định nghĩa một DTD tham chiếu ngoại thì khai báo
<!DOCTYPE
<!DOCTYPE notenote SYSTEM
SYSTEM "note.dtd">
"http://www.w3schools.com/dtd/note.dtd">
<!DOCTYPE note SYSTEM “filename">
<note>
<to>Tove</to>
phải đặt sau phần khai báo XML.
<from>Jani</from> Các khai báo:
<heading>Reminder</heading> <!ELEMENT note (to,from,heading,body)>
<body>Don't forget me this weekend!</body> <!ELEMENT to (#PCDATA)>
</note>
<!ELEMENT from (#PCDATA)>
File note.dtd với nội dung như sau: <!ELEMENT heading (#PCDATA)>
<!ELEMENT note (to,from,heading,body)> Chú ý: Địa chỉ chứa
file DTD có thể một
<!ELEMENT body (#PCDATA)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)> URL/URI. phải đặt trong file dtd
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

18
2.2. Phần tử <!DOCTYPE> ... 2.2. Phần tử <!DOCTYPE> ...
b) Định nghĩa DTD tham chiếu ngoại chung (tham khảo):  Trường thứ ba chỉ định kiểu của tài liệu được mô tả,
Cú pháp: <!DOCTYPE root-element PUBLIC “FPI” “URL”> thường thì trường này kèm theo một số định danh duy
Trong đó: nhất nào đó (chẳng hạn như version 1.0).
 FPI (Formal Public Identifier) là một định danh chung hình  Trường thứ tư chỉ định ngôn ngữ mà bạn định nghĩa DTD
thức. FPI gồm có 4 trường và tuân theo một số quy tắc sau: (ví dụ như ngôn ngữ Tiếng Anh - EN)
 Trường đầu tiên của một FPI là xác định kết nối của DTD  Mỗi trường của FPI cách nhau bởi dấu //
đến chuẩn hình thức. Đối với các DTD chúng ta tự định <?xml version="1.0"?>
nghĩa thì trường này là một dấu chấm. Đối với các chuẩn <!DOCTYPE note PUBLIC “.//w3schools//note XML version 1.0//EN”
hình thức trường này sẽ tự tham chiếu đến chuẩn của nó. "http://www.w3schools.com/dtd/note.dtd">
 Trường thứ hai là tên nhóm hay tên người chịu trách <note>
nhiệm bảo trì và nâng cấp các định nghĩa DTD và tên này <to>Tove</to>
URL là địa chỉ của file DTD
phải mang tính duy nhất. <from>Jani</from>
<heading>Reminder</heading>
<!DOCTYPE note PUBLIC “.//w3schools//note XML version 1.0//EN” <body>Don't forget me this weekend!</body>



</note>

2.2. Phần tử <!DOCTYPE> ... 2.3. Phần tử <!ELEMENT>

Phần tử <!ELEMENT> dùng để định nghĩa kiểu dữ


liệu cho một thẻ của tài liệu XML.
Cú pháp:
<!ELEMENT element-name content_model>
Trong đó:
 element_name là tên của thẻ cần định nghĩa
 content_model là kiểu của thẻ này, có thể là:
 EMPTY
 ANY
 #PCDATA
 Các trường hợp cụ thể:

2.3. Phần tử <!ELEMENT>... 2.3. Phần tử <!ELEMENT>...


Định nghĩa một thẻ rỗng Định nghĩa một phần tử có kiểu văn bản
<!ELEMENT element_name EMPTY> <!ELEMENT element_name (#PCDATA)>
Ví dụ: <!ELEMENT PHAN_SO EMPTY> Ví dụ: <!ELEMENT note (#PCDATA)>
Thẻ PHAN_SO không thể có nội dung mà chỉ có thể Nhận xét:
có thuộc tính.  Đây là một trong các hạn chế của DTD vì nó không
cho phép mô tả chi tiết về “kiểu” hay “loại” của chuỗi
Định nghĩa một thẻ có chứa nhiều kiểu dữ liệu văn bản.
<!ELEMENT element_name ANY>  Nếu muốn mô tả chi tiết hơn có thể dùng thẻ ghi chú:
Ví dụ: <!ELEMENT note ANY> Ví dụ:
Nhận xét: cách khai báo này thường để mô tả sự tồn <!ELEMENT He_so (#PCDATA)>
tại của một thẻ bên trong một thẻ khác. <!-- He_so: A_Float -->

19
Ví dụ File note.xml với nội dung như sau: 2.3. Phần tử <!ELEMENT>...
<?xml version="1.0"?> Định nghĩa một thẻ có chứa thẻ con (cách 1)
<!DOCTYPE note SYSTEM "note.dtd"> <!ELEMENT element_name (child_element)>
<note> Ví dụ: khai báo thẻ note có 4 thẻ con là to, from,
<to>Tove</to> heading, body:
<from>Jani</from> <!ELEMENT note (to,from,heading,body)>
<heading>Reminder</heading>
Có hai cách định nghĩa một thẻ có chứa nhiều hơn
<body>Don't forget me this weekend!</body>
một thẻ con:
</note>
Cách thứ nhất: liệt kê tất cả các thẻ con và mỗi thẻ
File note.dtd với nội dung như sau:
con cách nhau bởi dấu phẩy.
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)> Cách thứ hai: dùng ký tự đại diện cho những thẻ
<!ELEMENT from (#PCDATA)> con.
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

2.3. Phần tử <!ELEMENT>... 2.3. Phần tử <!ELEMENT>...


Định nghĩa một thẻ có chứa thẻ con (cách 2) Định nghĩa một thẻ có chứa thẻ con (cách 2)
Giả sử ROOT là thẻ gốc và có hai thẻ con là ELE_A
<!ELEMENT ROOT (ELE_A,ELE_B)>
và ELE_B, DTD có một số quy định sau: Thẻ ROOT có 2 thẻ con, đầu tiên là thẻ ELE_A tiếp đến là thẻ
ELE_B
<!ELEMENT ROOT (ELE_A*)>
Thẻ ROOT không có hoặc có nhiều thẻ con ELE_A
<!ELEMENT ROOT (ELE_A |ELE_B)>
<!ELEMENT ROOT (ELE_A+)> Thẻ ROOT có một thẻ con hoặc là ELE_A hoặc là ELE_B
Thẻ ROOT có một hoặc nhiều thẻ con ELE_A

<!ELEMENT ROOT (ELE_A?)> <!ELEMENT ELE_A (ELE_A1| #PCDATA)>


Định nghĩa một thẻ có chứa thẻ con hoặc chứa dữ liệu văn
Thẻ ROOT không có hoặc có một thẻ con ELE_A bản

2.3. Phần tử <!ELEMENT>... 2.3. Phần tử <!ELEMENT>...

Chú ý: Chú ý: Có thể kết hợp với biểu thức tuần tự.
 Các thẻ bên trong có thể có tên trùng nhau <!ELEMENT X (A,B?,C)>
Ví dụ: <!ELEMENT TAM_GIAC (DIEM,DIEM,DIEM)> Thành phần đầu tiên của thẻ X là thẻ A, kế đến có
Thẻ TAM_GIAC phải bao hàm bên trong đúng 3 thẻ thể có hay không có thẻ B và thành phần cuối cùng
con với tên thẻ là DIEM. phải là C.
 Có thể sử dụng từ khóa #PCDATA trong biểu thức <!ELEMENT X (A,B|C,D)>
tuần tự (và các loại biểu thức khác). Thành phần đầu tiên của thẻ X là thẻ A, kế đến là thẻ
Ví dụ: <!ELEMENT X (#PCDATA, A,#PCDATA)> B hay thẻ C và thành phần cuối cùng phải là D.
Thẻ X phải bao gồm 3 thành phần: <!ELEMENT X (A,B,C)?>
 Thành phần thứ 1 là chuỗi văn bản X có thể chứa các thẻ A, B, C (theo thứ tự trên) hay
 Thành phần thức 2 là thẻ có tên A cũng có thể không chứa bất kỳ thẻ nào.
 Thành phần thứ 3 là chuỗi văn bản
See also: http://www.w3schools.com/dtd/dtd_elements.asp from

20
Bài tập: Breakfastmenu.dtd
Hãy khai
báo cấu
trúc dtd
cho tài
liệu xml
bên cạnh

<!DOCTYPE breakfast_menu SYSTEM Breakfastmenu.dtd>

2.4. Phần tử <!ATTLIST> 2.4. Phần tử <!ATTLIST> ...


Phần tử <!ATTLIST> dùng để định nghĩa kiểu thuộc Kiểu Mô tả
CDATA Cho biết thuộc tính này chỉ có thể chứa kiểu dữ liệu ký tự
tính của một thẻ trong tài liệu XML
(en1|en2|..) Danh sách các giá trị mà thuộc tính có thể được gán
Cú pháp: ID Cho biết thuộc tính này là một ID, tức là các giá trị của thuộc tính
<!ATTLIST element-name attribute-name này không được trùng nhau và phải bắt đầu bởi một chữ cái
IDREF Cho biết giá trị của thuộc tính này phải là một trong các giá trị của
attribute-type default-value> thuộc tính ID của các phần tử khác
Trong đó: IDREFS Cho biết giá trị của thuộc tính này phải là các giá trị của các thuộc
tính có kiểu ID
element-name là tên của thẻ cần định nghĩa thuộc Cho biết giá trị của thuộc tính là các giá trị hợp với quy tắc đặt tên
NMTOKEN
tính phần tử (thẻ, thuộc tính) của tài liệu XML
attribute-name là tên thuộc tính cần định nghĩa NMTOKENS Cũng giống như NMTOKEN nhưng nó cho phép chứa nhiều
NMTOKEN
attribute-type kiểu của thuộc tính. Có thể nhận một ENTITY Cho biết thuộc tính này nhận giá trị là một tên tham chiếu của thực
trong các giá trị sau: thể
ENTITIES Cho biết thuộc tính này nhận giá trị là các tên tham chiếu của thực
thể và cách nhau bởi khoản trắng

2.4. Phần tử <!ATTLIST> 2.4. Phần tử <!ATTLIST> ...


default-value thông tin về giá mặc định trị của thuộc
Chúng ta cũng có thể định nghĩa một thẻ có nhiều
tính. Nó có thể nhận một trong các giá trị sau:
thuộc tính theo cú pháp sau:
Giá trị Mô tả
value value là một giá trị mặc định nào đó <!ATTLIST element-name
attribute-name_1 attribute-type_1 default-value_1
#REQUIRED Thuộc tính đang xét là thuộc tính bắt buộc phải có. attribute-name_2 attribute-type_2 default-value_2
Đây là cách sử dụng phổ biến nhất.
...
#IMPLIED Thuộc tính đang xét là tùy chọn và không bắt buộc attribute-name_n attribute-type_n default-value_n>
phải có
#FIXED value thuộc tính này chỉ mang duy nhất giá trị value này

21
Thuộc tính đang Thuộc tính đang
Một số ví dụ minh họa xét có kiểu ký tự xét là thuộc tính Ví dụ2: Giả sử chúng ta có file att.dtd với nội dung sau:
bắt buộc phải có Cho biết giá trị của
<!ELEMENT attributes (#PCDATA)> thuộc tính là các giá trị
Ví dụ1: Giả sử chúng ta có file att.dtd với nội dung sau: hợp với quy tắc đặt tên
Thuộc tính đang xét
<!ATTLIST attributes aaa CDATA #IMPLIED
là tùy chọn và không bbb NMTOKEN #REQUIRED
<!ELEMENT attributes (#PCDATA)> bắt buộc phải có
<!ATTLIST attributes aaa CDATA #REQUIRED ccc NMTOKENS #REQUIRED>
File XML chúng ta viết như sau là đúng quy tắc:
bbb CDATA #IMPLIED>
<?xml version="1.0"?>
File XML chúng ta viết như sau là đúng quy tắc: <!DOCTYPE attributes SYSTEM "att.dtd">
<attributes aaa="#d1“ bbb="a1:12" ccc=" 3.4 div -4"/>
<?xml version="1.0"?>
Nếu chúng ta viết như sau sẽ không hợp quy tắc vì kiểu
<!DOCTYPE attributes SYSTEM "att.dtd"> NMTOKEN và NMTOKENS không chấp nhận ký tự # :
<attributes aaa="#d1" bbb="*~*“ Text >/attributes> <?xml version="1.0"?>
<!DOCTYPE attributes SYSTEM "att.dtd">
<attributes aaa="#d1“ bbb="#d1" ccc="#d1"/>

Cho biết thuộc tính này là một ID, tức


Ví dụ3: Giả sử chúng ta có file att.dtd
là các giá với
trị củanội dung
thuộc sau:
tính này không Ví dụ4: Giả sử chúng ta có file att.dtd với nội dung sau:
<!ELEMENT XXX (AAA+,BBB+,CCC+)> được trùng nhau và phải bắt đầu bởi <!ELEMENT XXX (AAA+,BBB+,CCC+)>
<!ELEMENT AAA (#PCDATA)> một chữ cái <!ELEMENT AAA (#PCDATA)>
<!ELEMENT BBB (#PCDATA)> Cho biết giá trị của thuộc tính list là các <!ELEMENT BBB (#PCDATA)>
<!ELEMENT CCC (#PCDATA)> giá trị hợp với quy tắc đặt tên của tài <!ELEMENT CCC (#PCDATA)>
liệu XML
<!ATTLIST AAA id ID #REQUIRED> <!ATTLIST AAA id ID #REQUIRED>
<!ATTLIST BBB code ID #IMPLIED list NMTOKEN #IMPLIED> <!ATTLIST BBB code ID #IMPLIED list NMTOKEN #IMPLIED>
<!ATTLIST CCC X ID #REQUIRED Y NMTOKEN #IMPLIED> <!ATTLIST CCC X ID #REQUIRED Y NMTOKEN #IMPLIED>
Viết như sau là không hợp quy tắc vì phần tử CCC có thuộc tính X có kiểu là ID nên
Filelà XML
phải chúng ta viết như sau là hợp quy tắc:
duy nhất.
Nếu chúng ta viết như sau sẽ không hợp quy tắc vì phần tử AAA và CCC có
thuộc tính có kiểu là ID nên không được có giá trị giống nhau.
<?xml version="1.0"?>
<?xml version="1.0"?>
<!DOCTYPE XXX SYSTEM "att.dtd">
<!DOCTYPE XXX SYSTEM "att.dtd">
<XXX>
<XXX>
<AAA id="L12"/>
<AAA id="L12"/>
<BBB code="QW" list="L12"/>
<BBB code="QW" list="L12"/>
<CCC X="ZA"
X="x-0" Y="QW" />
<CCC X="L12" Y="QW" />
<CCC X="ZA"
X="x-1" Y="QW" />
</XXX>
</XXX>

Cho biết giá trị của thuộc


Ví dụ5: Giả sử chúng ta có file att.dtd với nộiphải
tính này dung sau:
là các giá trị Ví dụ6: Giả sử chúng ta có file att.dtd với nội dung sau:
của các thuộc tính có kiểu ID
<!ELEMENT XXX (AAA+, BBB+, CCC+, DDD+)> <!ELEMENT XXX (AAA+, BBB+)>
<!ELEMENT AAA (#PCDATA)>
<!ELEMENT AAA (#PCDATA)>
<!ELEMENT BBB (#PCDATA)>
<!ELEMENT BBB (#PCDATA)>
<!ELEMENT CCC (#PCDATA)>
<!ATTLIST AAA mark ID #REQUIRED>
<!ATTLIST AAA true ( yes | no ) #REQUIRED>
<!ATTLIST BBB id ID #REQUIRED>
<!ATTLIST BBB month (1|2|3|4|5|6|7|8|9|10|11|12) #IMPLIED>
Nếu viết như sau File sẽXML
khôngviết
hợp
<!ATTLIST CCC ref IDREF #REQUIRED> quy tắc vì phần tử DDD có File XML viết
như sau là hợp <?xml version="1.0"?>
<!ATTLIST DDD ref IDREF #REQUIRED> thuộc tính ref và có kiểu là
quy tắc: như sau là hợp
IDREFS, trong khi đó chúng ta <!DOCTYPE XXX SYSTEM "att.dtd"> quy tắc:
<?xml
<?xml version="1.0"?>
version="1.0"?> lại gán giá trị cho thuộc tính của <XXX>
<!DOCTYPE
<!DOCTYPE XXXXXX SYSTEM
SYSTEM "att.dtd">
"att.dtd"> phần tử này là ref=”a1 b001 a2” <AAA true="yes"/>
<XXX>
<XXX> nhưng b001 không phải là giá <AAA true="no"/>
<AAA
<AAA mark="a1"/>
mark="a1"/> trị của một ID nào cả.
<AAA true="yes"/>
<AAA
<AAA mark="a2"/>
mark="a2"/> <BBB month="8" />
<BBB
<BBB id="b001"
id="b01" />/>
<BBB month="2" />
<CCC
<CCC ref="a3"
ref="a3" />
/>
<BBB month="12" />
<DDD
<DDD ref="a1
ref="a1 b001
b001 a2"
a2" />
/>
</XXX>
</XXX>
</XXX>

22
<!ELEMENT XXX (AAA+, BBB+)>
<!ELEMENT AAA (#PCDATA)> 2.5. Phần tử <!Entity>
<!ELEMENT BBB (#PCDATA)>
<!ATTLIST AAA true ( yes|no ) #REQUIRED> Entity (thực thể) là gì?
<!ATTLIST BBB month (1|2|3|4|5|6|7|8|9|10|11|12) #IMPLIED> Thực thể là một biến lưu trữ một khối dữ liệu, khi
Nếu viết như sau sẽ không hợp quy tắc vì AAA và BBB có thuộc tính true và thực thể này được triệu gọi thì nó sẽ chèn nguyên
month có kiểu liệt kê, trong khi đó chúng ta lại gán giá trị cho hai thuộc tính này khối dữ liệu của nó vào vị trí triệu gọi.
ngoài giá trị đã liệt kê.
Khối dữ liệu của thực thể thường là ở dạng text, tuy
<?xml version="1.0"?>
<!DOCTYPE XXX SYSTEM "att.dtd"> nhiên nó cũng có thể là dữ liệu nhị phân, miễn là
<XXX> khối dữ liệu này không phá vỡ khuôn dạng của một
<AAA true="yes"/> tài liệu XML khi nó được triệu gọi.
<AAA true="no"/>
Có hai loại thực thể:
<AAA true="maybe"/>
<BBB month="8" />  thực thể tổng quát
<BBB month="2" />  thực thể tham số
<BBB month="16" />
</XXX> Thực thể được khai báo trong phần định nghĩa DTD.

2.5. Phần tử <!Entity>... 2.5.1 Thực thể tổng quát


Khai báo thực
Cách khai báo: Ví dụ thể trong DTD
 Để tham chiếu đến thực thể tổng quát ta viết theo
<?xml version="1.0"?>
cú pháp:
<!DOCTYPE attributes [
&name_entity;
<!ELEMENT attributes (#PCDATA)>
Trong đó name_entity là tên thực thể tổng quát cần
tham chiếu. <!ATTLIST attribute aaa CDATA #REQUIRED>
 Để tham chiếu đến thực thể tham số chúng ta viết <!ENTITY out-text “CNTT”> Lời triệu gọi trong
]> tài liệu XML
theo cú pháp:
%name_entity; <attributes aaa="C"> &out-text; attributes>
Trong đó name_entity là tên thực thể tham số cần
tham chiếu.

2.5.1 Thực thể tổng quát 2.5.1 Thực thể tổng quát ...
entity-name
Có hai loại thực thể tổng quát Ví dụ về thực thể tổng quát nội
<?xml version="1.0"?> URL
 thực thể tổng quát nội <!DOCTYPE author [
 thực thể tổng quát ngoại (tham khảo) <!ELEMENT author (#PCDATA)>
<!ATTLIST author CR CDATA #REQUIRED>
a.Thực thể tổng quát nội <!ENTITY writer SYSTEM
Lời triệu gọi
"http://www.w3schools.com/entities/entities.xml"> trong tài liệu
 Thực thể tổng quát nội là thực thể được định nghĩa
<!ENTITY copyright SYSTEM "copyright.txt"> XML
ngay trên DTD của tài liệu XML. ]>
<author CR="C" >&writer; &copyright; </author>
 Cú pháp:
Chú ý: Chúng ta không thể dùng tham chiếu thực thể
<!ENTITY entity-name “entity-value”> tổng quát ngay trong bản thân các khai báo DTD

23
2.5.1 Thực thể tổng quát 2.5.2 Thực thể tham số
b. Thực thể tổng quát ngoại Thực thể tham số khác với thực thể tổng quát ở chổ
 Thực thể được định nghĩa và tham chiếu từ một là nó cho phép tham chiếu đến nó ngay trong bản
nguồn bên ngoài. thân các khai báo DTD và vùng hoạt động của nó
 Sử dụng theo 1 trong 2 cú pháp sau: chỉ nằm trong vùng khai báo các DTD.
<!ENTITY entity-name SYSTEM "URI/URL"> Mục đích của việc sử dụng thực thể tham số là để
tránh các khai báo lặp lại khi định nghĩa DTD và giúp
<!ENTITY entity-name PUBLIC FPI "URI/URL"> cho chúng ta dễ dàng thay đổi.
Trong đó: Tương tự như thực thể tổng quát, thực thể tham số
FPI đã được đề cập đến trong phần Định nghĩa DTD cũng có hai loại:
tham chiếu ngoại chung
 thực thể tham số ngoại
URI/URL là địa chỉ đến nguồn dữ liệu cần gán cho
entity-name  thực thể tham số nội

2.5.2 Thực thể tham số ... 2.5.2 Thực thể tham số ...
a.Thực thể tham số nội Ví dụ
 Thực thể tham số nội là thực thể được định nghĩa Có sử dụng thực thể tham số nội Không sử dụng thực thể tham số nội
ngay trên DTD của tài liệu XML. <?xml version="1.0"?> <?xml version="1.0"?>
 Cú pháp: <!DOCTYPE author [ <!DOCTYPE author [
<!ENTITY name “Hue Uni"> <!ENTITY name1 "Hue Uni">
<!ENTITY %entity-name “entity-value”>
<!ENTITY name-Faculty "&name; <!ENTITY name-Faculty
Trong đó: Faculty"> "&name1; Faculty">
 Ký tự % là tham số bắt buộc <!ENTITY % EL "<!ELEMENT <!ELEMENT author (#PCDATA)>
author (#PCDATA)>" >
 entity-name là tên của thực thể tham số cần > ]>
định nghĩa %EL; <author>&name-Faculty;</author>
 entity-value là giá trị cần gán cho entity-name ]>
<author>&name-Faculty;</author>

2.5.2 Thực thể tham số ... Ví dụ về thực thể tham số ngoại


b.Thực thể tham số ngoại Giả sử file hocsinh.dtd có nội dung như sau:
<!ELEMENT HOCSINH (HOTEN, NGAYSINH, LOP)>
 Thực thể được định nghĩa và tham chiếu từ một <!ELEMENT HOTEN (#PCDATA)>
nguồn bên ngoài. <!ELEMENT NGAYSINH (#PCDATA)>
<!ELEMENT LOP (#PCDATA)>
 Cú pháp:
<!ENTITY % entity-name SYSTEM "URI/URL"> file tài liệu XML có tên test.xml với thực thể tham số ngoại:
<?xml version=”1.0”?> có nghĩa là file
<!ENTITY % entity-name PUBLIC FPI “URI/URL"> <!DOCTYPE HOCSINH [ hocsinh.dtd nằm
<!ENTITY
<!ENTITY %%hshsSYSTEM
SYSTEM“http://hs.com.vn/hocsinh.dtd”>
“hocsinh.dtd”>
Trong đó: %hs;
cùng thư mục
với file test.xml.
SYSTEM cho biết đây là thực thể tham số ngoại riêng ]>
<HOSCINH> Nếu file hocsinh.dtd đặt tại địa
PUBLIC cho biết đây là thực thể tham số ngoại chung <HOTEN>Le Van A</HOTEN> chỉ http://hs.com.vn/hocsinh.dtd
FPI (Formal Public Identifier) như đã trình bày. <NGAYSINH>26-06-79</NGAYSINH> thì chúng ta thay đổi như sau:
<LOP>6A3</LOP>
URI/URL là địa chỉ của khối dữ liệu cần gán cho entity- </HOSCINH>
name

24
Khi nào thì sử dụng/không sử dụng DTD? Ví dụ về khai báo cấu trúc DTD cho CSDL quan hệ

Một khách sạn có 3 lọai dịch vụ với đơn giá tương


ứng như sau:
1. Thuê phòng:
• Lọai A: 600.000 đ/ngày,
• Lọai B: 480.000 đ/ngày,
• Lọai C: 360.000 đ/ngày.
2. Thuê xe:
• Lọai 1 (7 chỗ): 300.000 đ/giờ,
• Lọai 2 (4 chỗ): 200.000 đ/giờ.
3. Điện thoại:
• Lọai 1: 50.000 đ/phút,
• Lọai 2: 30.000 đ/phút.

Ví dụ về khai báo cấu trúc DTD cho CSDL quan hệ Ví dụ về khai báo cấu trúc DTD cho CSDL quan hệ
Để quản lý khách hàng thuê phòng và sử dụng các dịch vụ của
khách sạn người ta sử dụng Hóa đơn thanh toán theo mẫu sau:
HÓA ĐƠN THANH TOÁN
Số hóa đơn: 12345
Họ và tên khách hàng: Nguyễn Văn A
Ngày lập: 01/06/2020
Dịch vụ Số lƣợng Đơn giá Thành tiền
Thuê phòng 4 ngày 600.000 đ 2.400.000 đ
(loại A)
Thuê xe 5 giờ 150.000 đ 750.000 đ
(Loại 4 chỗ)
Điện thoại 10 phút 50.000 đ 500.000 đ
(loại 1)
Tổng tiền: 3.650.000 đ

25
Ví dụ về khai báo cấu trúc DTD cho CSDL quan hệ Ví dụ về khai báo cấu trúc DTD cho CSDL quan hệ

Ví dụ về khai báo cấu trúc DTD cho CSDL quan hệ Ví dụ về khai báo cấu trúc DTD cho CSDL quan hệ

Cách 2: khai báo cấu trúc DTD cho CSDL quan hệ Cách 2: khai báo cấu trúc DTD cho CSDL quan hệ

ChiTietHoaDon

26
Cách 2: khai báo cấu trúc DTD cho CSDL quan hệ Cách 2: khai báo cấu trúc DTD cho CSDL quan hệ

DTD Summary

This tutorial has taught you how to describe the


structure of an XML document.
You have learned how to use a DTD to define the
legal elements of an XML document, and how a
DTD can be declared inside your XML document,
or as an external reference.
You have learned how to declare the legal
elements, attributes, entities, and CDATA sections
for XML documents.
You have also seen how to validate an XML
document against a DTD.

27
BÀI TẬP:

1. Xem thêm các ví dụ về DTD ở: CHƢƠNG 3


http://www.w3schools.com/dtd/dtd_examples.asp
ĐẶC TẢ NỘI DUNG & CẤU TRÚC
2. Tìm hiểu về XML Editor để soạn thảo các file XML
TÀI LIỆU XML VỚI XML Schema
thay cho NotePad ở : http://www.editix.com/
CONTENT SPECICATION & CONSTRUCTION
A XML DOCUMENT BY XML Schema
3. Làm bài tập ở site:
PGS.TS. Nguyễn Mậu Hân
http://www.w3schools.com/quiztest/quiztest.asp? Khoa CNTT-ĐHKH HUẾ
qtest=XML
164

NỘI DUNG 3.1. ĐẶC TẢ CẤU TRÚC XML VỚI XML Schema

3.1 ĐẶC TẢ CẤU TRÚC XML VỚI XML Schema

3.2 THẺ ĐƠN GIẢN TRONG XSD

3.3 KHAI BÁO THUỘC TÍNH TRONG XSD

Định nghĩa các thẻ trong tài liệu XML


3.4 THẺ PHỨC TRONG XSD Định nghĩa các thuộc tính trong tài liệu XML
Định nghĩa các thẻ con
3.5 KIỂU DỮ LIỆU TRONG XML Schema Định nghĩa thứ tự các thẻ con
Định nghĩa số các thẻ con
3.6. ĐẶC TẢ THẺ TRONG XML Schema Định nghĩa thẻ rỗng hoặc thẻ có nội dung
Định nghĩa kiểu dữ liệu của thẻ và thuộc tính
3.7 MỘT SỐ PHƢƠNG PHÁP THIẾT KẾ XSD 165
Định nghĩa giá trị mặc định và cố định của thẻ và thtính166

3.1. ĐẶC TẢ CẤU TRÚC XML VỚI XML Schema

3.1.1 Giới thiệu về XML Schema


XML Schema, giống như DTD, có chức năng mô tả
cấu trúc và kiểu dữ liệu của tài liệu XML.
XML Schema mô tả: Ví dụ
Các thẻ và thuộc tính trong tài liệu XML
Thứ tự và số lượng các thẻ con
Các kiểu dữ liệu của thẻ và thuộc tính

XML Schema sử dụng cú pháp của XML và được xem


là sự thay thế cho DTD.
167 168

28
a. Lý do sử dụng XML Schema i. XML Schema hỗ trợ kiểu dữ liệu

i. XML Schema hỗ trợ kiểu dữ liệu (data type): thuận


tiện cho việc thao tác với CSDL, chuyển đổi các kiểu
dữ liệu, dễ dàng mô tả cấu trúc của tài liệu, …
ii. XML Schema sử dụng cú pháp XML và dễ dàng mở
rộng
iii. Bảo toàn sự giao tiếp dữ liệu Dễ dàng mô tả nội dung tài liệu cho phép
Dễ dàng xác định tính đúng đắn của dữ liệu
iv. Ràng buộc khóa và tham chiếu mạnh hơn DTD Dễ dàng làm việc với dữ liệu từ cơ sở dữ liệu
v. Tích hợp với namespace Dễ dàng xác định tính chặc chẻ của dữ liệu
Dễ dàng định nghĩa định dạng dữ liệu
vi. XML Schema có tính bảo mật của dữ liệu truyền tải
Dễ dàng chuyển đổi các kiểu dữ liệu khác nhau
Giải thích 169 170

ii. XML Schema sử dụng cú pháp XML iii. XML Schema dễ dàng mở rộng

Sử dụng lại lược đồ của mình trong các lược đồ khác
Bạn không cần phải học thêm một ngôn ngữ mới Tạo kiểu dữ liệu riêng của mình từ các kiểu dữ liệu chuẩn
Bạn có thể dùng XML Editor để soạn thảo XML Schema Tham chiếu nhiều lược đồ trong cùng một tài liệu XML
Bạn có thể sử dụng XML Parser để phân tích XML Schema
Bạn có thể thao tác trên XML Schema với XML DOM
Bạn có thể chuyển XML Schema với XSLT
171 172

iv. XML Schema bảo toàn sự giao tiếp dữ liệu b. Đặc điểm các tài liệu XLM Schema
 XML Schema được lưu trữ theo dạng plain text với phần mở
rộng xsd (XML Schema Definition).
 Một tài liệu XML Schema tương tự như một tài liệu XML và
thường sẽ có dạng sau:

Các thẻ trong tài liệu XML Schema đều sử dụng một prefix (tiền
tố) để khai báo. Prefix này được khai báo ngay từ thẻ gốc của tài
liệu. Tên prefix có thể đặt bất kì nhưng thông thường hai tên
prefix thường được sử dụng là xs và xsd. Ví dụ:
173
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">174

29
3.1.1 Giới thiệu về ... 3.1.1 Giới thiệu về ...

b. Cấu trúc của các tài liệu trong XML Schema Nhận xét:
 Với DTD, thông tin về một thẻ được mô tả qua 2 phần:
Dạng tổng quát:
 Đặc tả cấu trúc nội dung: mô tả cách sắp xếp các thành
<?xml version="1.0"encoding="utf-8"?> phần bên trong của thẻ đang xét
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">  Đặc tả thuộc tính: mô tả các thuộc tính của thẻ đang xét.
Đặc tả các thẻ  Với XML Schema, thông tin về một thẻ được mô tả tập trung
Đặc tả các kiểu qua một ý niệm duy nhất là kiểu.
</xs:schema>
 Mỗi thẻ sẽ có tương ứng một kiểu.
 Đặc tả kiểu sẽ mô tả kiểu của thẻ cùng với một số tính chất
khác.
namespace của các từ  Đặc tả kiểu mô tả các thông tin về các thẻ thuộc kiểu, bao
khóa dùng trong sự gồm cả các thông tin về cách sắp xếp các thành phần bên
xác định lược đồ XML trong của thẻ và hệ thống các thuộc tính của thẻ.
175 176

Các thẻ được định nghĩa trong


Ví dụ về XML Schema Ví dụ về XML và XML Schema XML Schema gồm có “Blog”,
“Title” và “Author”. Trong đó
Xem tài liệu XML: note.xml Với tài liệu XML như sau: “Blog” là một kiểu dữ liệu phức
XML Schema tương ứng: note.xsd (complex type) do chứa các thẻ
con bên trong. Các thẻ “Title” và
“Author” được gọi là thẻ có kiểu
đơn giản (simple type).

Sẽ cho ta một XML Schema tương ứng:

DTD tương ứng: note.dtd

177 178

3.1.2 Khai báo thẻ trong XML Schema 3.1.2 Khai báo thẻ trong XML Schema
thẻ và loại dữ liệu trong lược đồ
a. Khai báo thẻ gốc a. Khai báo thẻ gốc được khai báo trong namespace
http://www.w3.org/2001/XMLSchema
Thẻ gốc thường chứa một và
vàicó thuộc tính. Thông
tiền tố là xs
thường có dạng như sau: Các thẻ được định nghĩa trong lược
đồ đến từ namespace
http://www.w3schools.com
namespace mặc định là
xmlns="http://www.w3schools.com"

Thẻ Schema là thẻ gốc của <schema> là thẻ gốc trong


XML Schema, được đặt ngay các tài liệu XML Schema
<xs:schema> sau khai báo tài liệu XML

Bất kỳ thẻ nào được sử dụng trong


179 tài liệu XML phải từ namespace đảm
180
</xs:schema>
bảo chất lượng

30
Tài liệu XML tham chiếu đến DTD hoặc XML Schema Tài liệu XML tham chiếu đến DTD hoặc XML Schema

note.xml

181 182

Tài liệu XML tham chiếu đến DTD Tài liệu XML tham chiếu đến XML Schema

183 184

3.2. Thẻ đơn giản 3.2. Thẻ đơn giản...

3.2.2 Cách khai báo trong XSD:


3.2.1 Định nghĩa:
Các thẻ
Thẻ đơn giản (simple element) là thẻ không có thuộc đơn giản
tính và không chứa thẻ khác.

Khai báo các thẻ


đơn giản trong
XSD

Trong đó, xxx: tên thẻ; yyy: tên kiểu của thẻ

185 186

31
3.2. Thẻ đơn giản... 3.3. Định nghĩa thuộc tính trong XSD
3.2.3 Khai báo giá trị mặc định, cố định Chú ý:
Một thẻ đơn giản có thể có giá trị mặc định (default Một thẻ đơn giản không thể có thuộc tính.
value) hoặc giá trị cố định (fix value)
Một thẻ có thuộc tính thì PHẢI khai báo kiểu phức

Tuy nhiên, thuộc tính của một thẻ được khai báo như
một thẻ đơn giản.

187 188

3.3. Định nghĩa thuộc tính trong XSD... 3.3. Định nghĩa thuộc tính trong XSD...
Khai báo giá trị mặc định cho thuộc tính
Một thuộc tính có thể có giá trị mặc định (default
value) hoặc giá trị cố định (fix value).

Khai báo giá trị bắt buộc (required) cho thuộc tính
189 190

3.4. Thẻ phức trong XSD ... 3.4. Thẻ phức trong XSD ...
Định nghĩa: thẻ phức (complex element) là thẻ chứa
thẻ khác và/hoặc có thuộc tính. c. Thẻ chứa thuộc tính và text
Có 4 loại thẻ phức:
a. Thẻ rỗng có thuộc tính

d. Thẻ chứa vừa thẻ khác vừa text


b. Thẻ chứa thẻ khác

191 192

32
3.4. Thẻ phức trong XSD ... 3.5. KIỂU DỮ LIỆU TRONG XML SCHEMA

3.4.2 Khai báo trong XSD: Các kiểu phần tử:


XML Schema có 3 loại kiểu dữ liệu chính:

Loại 1: Kiểu cơ sở (BultinType)


Loại 2: Kiểu đơn giản (SimpleType)
Loại 3: kiểu phức (ComplexType).

193 194

3.5.1. Kiểu cơ sở (BuiltinType) 3.5.1. Kiểu cơ sở (BultinType)...

Được xây dựng, định nghĩa sẵn trong XML Schema. Ý nghĩa sử dụng: dùng để mô tả trực tiếp kiểu của
Một số kiểu cơ sở thông dụng: các thuộc tính hay của thẻ thỏa 2 điều kiện:
Ten_kieu_co_so Ý nghĩa Điều kiện 1: thẻ không có thuộc tính.
string Kiểu ký tự Điều kiện 2: thẻ không chứa thẻ khác và có miền
integer Kiểu số nguyên giá trị thích hợp với kiểu.
float Kiểu số thực
double Kiểu số thực 64-bit
boolean Kiểu logic
Với các thẻ có thuộc tính hay có chứa thẻ khác, bắt
buộc phải dùng kiểu phức vì kiểu cơ sở và kiểu
date Kiểu ngày
đơn giản không cho phép mô tả thông tin về thuộc
month Kiểu Tháng
tính, thẻ con bên trong.
ID Kiểu định danh
binary Kiểu nhị phân
195 196

3.5.1. Kiểu cơ sở (BultinType) ... 3.5.1. Kiểu cơ sở (BultinType) ...


Cú pháp: Kiểu cơ sở Ví dụ 3: (khai báo kiểu cho thuộc tính)
 Khi dùng với thẻ: <xs:attribute name="He_so" type="xs:float"/>
<xs:element name=”Ten_the” type=”Ten_kieu_co_so” .... /> Thuộc tính He_so phải là số thực
Kiểu cơ sở sử dụng
 Khi dùng với thuộc tính: cho thuộc tính
<xs:attribute name=”Ten_thtinh” type=”Ten_kieu_co_so” ... /> Ví dụ 4: (khai báo kiểu cho thuộc tính)
Ví dụ 1: (khai báo kiểu cho thẻ) <xs:attribute name="x" type="xs:int"/>
<xs:element name="Ho_ten" type="xs:string”/> Thuộc tính x phải là số nguyên
Thẻ Ho_ten không có thuộc tính, không chứa thẻ con và có nội
dung là chuỗi văn bản.
Ví dụ 5: (khai báo kiểu cho thuộc tính)
Ví dụ 2: (khai báo kiểu cho thẻ)
<xs:attribute name=“Gioitinh“ type="xs:boolean"/>
<xs:element name="Ngay_sinh" type="xs:date”/>
Thẻ Ngay_sinh không có thuộc tính, không chứa thẻ con và có
Thuộc tính gioitinh phải là kiểu logic
nội dung tương ứng một ngày. 197 198

33
3.5.2. Kiểu đơn giản (simpleType) 3.5.2. Kiểu đơn giản (simpleType) ...
Là các kiểu do người dùng định nghĩa dựa trên các Cú pháp: (dạng đơn giản và thông dụng)
kiểu cơ sở có sẵn trong XML Schema. <xs:simpleType name="Ten_kieu">
Ý nghĩa sử dụng: dùng để mô tả trực tiếp kiểu của các <xs:restriction base="Ten_kieu_co_so">
thuộc tính hay các thẻ thỏa 2 điều kiện: Giới hạn (ràng buộc) trên miền giá trị
Điều kiện 1: thẻ không có thuộc tính </xs:restriction>
Điều kiện 2: thẻ không chứa thẻ khác và có miền </xs:simpleType>
giá trị là tập con của miền giá trị một kiểu cơ sở nào
đó. Giải thích:
Tương tự như kiểu cơ sở, các thẻ có thuộc tính hay Ten_kieu: Tên kiểu đơn giản do người dùng định nghĩa.
thẻ có chứa thẻ con khác phải dùng kiểu phức. Ten_kieu_co_so: Tên của kiểu cơ sở tương ứng.
Người dùng có thể thêm ràng buộc cho kiểu dữ liệu
Chú ý: cần phân biết thẻ đơn giản (Simple Element) với kiểu
để giới hạn nội dung của nó, hoặc yêu cầu dữ liệu đơn giản (SimpleType)
199 200
thỏa mãn một ràng buộc nào đó.

3.5.2. Kiểu đơn giản (simpleType) ... 3.5.2. Kiểu đơn giản (simpleType) ...
Xác định giá trị x thuộc miền giá trị của kiểu: Xác định cận trên, cận duới của kiểu cơ sở đang xét.
Cú pháp: Cú pháp:
<xs:minInclusive value="Gia_tri_bien_duoi"/> <xs:simpleType
Ví dụ: name="Ten_kieu">
Kiểu đơn giản đang xét có miền giá trị là tập hợp các <xs:restriction base="Ten_kieu_co_so_loai_so">
<xs:simpleType name="SO_NGUYEN_DUONG">
số x thỏa điều kiện cơ sở x>= Gia_tri_bien_duoi Khai báo cận
<xs:restriction dưới
base="xs:int">
Ví dụ: <xs:minInclusive
Khai báo cận trênvalue="0”/>
<xs:simpleType name="SO_THUC_DUONG"> </xs:restriction>
</xs:restriction>
<xs:restriction base="xs:float"> </xs:simpleType>
</xs:simpleType>
<xs:minInclusive value="0”/> Khai báo cận dưới: Sử dụng từ khoá minInclusive (cận
</xs:restriction> dưới cho phép sử dụng biên) và từ khóa minExclusive (cận
</xs:simpleType> dưới không cho phép sử dụng biên)
201 202

3.5.2. Kiểu đơn giản (simpleType) ... 3.5.2. Kiểu đơn giản (simpleType) ...
Khai báo cận trên: Sử dụng từ khoá maxInclusive Ví dụ:
Ràng buộc trên các giá trị
(cận trên cho phép sử dụng biên) , maxExclusive (cận trên
không cho phép sử dụng biên)
Ví dụ:

<xs:simpleType name="DIEM_SO">
<xs:restriction base="xs:float">
<xs:minInclusive value="0”/>
<xs:maxExclusive value="10”/>
</xs:restriction>
</xs:simpleType>

203 204

34
3.5.2. Kiểu đơn giản (simpleType) ... 3.5.2. Kiểu đơn giản (simpleType) ...
Ràng buộc trên một tập các giá trị Ràng buộc trên một tập các giá trị ...

Cú pháp:
<xs:simpleType name="Ten_kieu">
<xs:restriction base="Ten_kieu_co_so_loai_so">
<xs:enumeration value=”Gia_tri_1”/>
<xs:enumeration value=”Gia_tri_2”/> Thẻ car chỉ chấp
nhận những giá trị:
.... Audi, Goft, BMW
<xs:enumeration value=”Gia_tri_k”/>
</xs:restriction>
</xs:simpleType>
205 206

3.5.2. Kiểu đơn giản (simpleType) ... 3.5.2. Kiểu đơn giản (simpleType) ...
Ràng buộc trên một tập các giá trị ... Ràng buộc trên một chuỗi các giá trị
Cú pháp:
Ví dụ:
<xs:simpleType name="Ten_kieu">
</xs:simpleType> <xs:simpleType name="LOAI_HOC_LUC">
<xs:restriction base="Ten_kieu_co_so_loai_so">
<xs:restriction base="xs:string">
<xs:enumeration value=”Gia_tri_1”/>
<xs:enumeration value="Giỏi”/>
<xs:enumeration value=”Gia_tri_2”/>
<xs:enumeration value="Khá”/>
.... Thẻ letter chỉ chấp
<xs:enumeration
<xs:enumeration value="Trung bình”/>
value=”Gia_tri_k”/> nhận một trong các
chữ cái thường từ a
<xs:enumeration
</xs:restriction> value="Yếu”/> đến z
</xs:restriction>
</xs:simpleType>
</xs:simpleType>

207 208

3.5.2. Kiểu đơn giản (simpleType) ... 3.5.2. Kiểu đơn giản (simpleType) ...
Ràng buộc trên một chuỗi các giá trị ... Ràng buộc theo sự lựa chọn

Thẻ initial chỉ chấp nhận


giá trị là một bộ 3 các ký
tự hoa từ A đến Z

Thẻ choice chỉ


chấp nhận một
trong các chữ cái:
x,y hoặc z

209 210

35
3.5.2. Kiểu đơn giản (simpleType) ... 3.5.2. Kiểu đơn giản (simpleType) ...
Ràng buộc theo sự lựa chọn ... Ràng buộc về độ dài

Thẻ prodid chỉ


chấp nhận giá trị là 5
chữ số từ 0 đến 9 Thẻ password chỉ
chấp nhận một xâu
gồm 8 ký tự

211 212

3.5.2. Kiểu đơn giản (simpleType) ... 3.5.2. Kiểu đơn giản ... Các tham số ràng buộc
Ràng buộc về sự hạn chế của độ dài
Định nghĩa một danh sách các giá trị có thể chấp nhận được

Mô tả số chữ số thập phân lớn nhất cho phép. Số này phải lớn
hơn hoặc bằng 0
Thẻ password chỉ
chấp nhận một xâu
Mô tả chính xác số ký tự hoặc dãy các hạng mục cho phép. Số
từ 5 đến 8 ký tự
này phải lớn hơn hoặc bằng 0

Mô tả cận trên của một dãy các giá trị số. Mỗi phần tử của dãy
phải nhỏ hơn cận trên này

Mô tả cận trên của một dãy các giá trị số. Mỗi phần tử của dãy
phải nhỏ hơn hoặc bằng cận trên này

Mô tả số lớn nhất các ký tự hoặc danh sách các hạng mục cho
213 214
See also: https://www.w3schools.com/xml/schema_facets.asp phép. Độ dài này phải lớn hơn hoặc bằng 0

3.5.2. Kiểu đơn giản ... Các tham số ràng buộc 3.5.3. Kiểu phức (complexType)

Mô tả cận dưới của một dãy các giá trị số (mỗi phần tử của
dãy phải lớn hơn cận dưới này)

Mô tả cận dưới của một dãy các giá trị số (các giá trị của dãy
phải lớn hơn hoặc bằng cận dưới này

Mô tả số nhỏ nhất các ký tự hoặc danh sách các hạng mục cho
phép. Độ dài này phải lớn hơn hoặc bằng 0

Định nghĩa chính xác một dãy các ký tự có thể chấp nhận
được

Mô tả số các chữ số cho phép. Số này phải lớn hơn 0

Mô tả dấu cách (dấu xuống dòng, phím tab, phím enter) được
215 216
sử dụng như thế nào

36
3.5.3. Kiểu phức (complexType) 3.5.3. Kiểu phức (complexType) ...
Có 4 loại thẻ complexType Thẻ rỗng chứa thuộc tính Là kiểu do người dùng định nghĩa để mô tả nội
1. dung và thuộc tính của các thẻ được khai báo
thuộc về kiểu phức đang xét.
Thẻ chứa thẻ khác
2. Ý nghĩa sử dụng: dùng để mô tả kiểu của các thẻ
thỏa một trong 2 điều kiện:
Thẻ chứa thuộc
tính và text
Điều kiện 1: Có thuộc tính Mô tả cách tổ chức,
Điều kiện 2: Có chứa thẻ khác sắp xếp các thẻ
con bên trong thẻ
Dạng khai báo chung:
3.
<xs:complexType name="Ten_kieu">
Thẻ vừa chứa thẻ khác vừa chứa text
4. Dac_ta_cau_truc_noi_dung
Mô tả hệ thống
Dac_ta_thuoc_tinh các thuộc tính của
thẻ có kiểu là kiểu
</xs:complexType> phức đang xét.
217 218
Chú ý: một thẻ phức thì phải khai báo kiểu phức

3.5.3. Kiểu phức (complexType) ... 3.5.3. Kiểu phức (complexType) ...

1. Khai báo thẻ phức rỗng 2. Khai báo thẻ phức chứa thẻ con
 Xét thẻ rỗng có thuộc tính: Dạng tuần tự: Mô tả thứ tự xuất hiện tuần tự các
thành phần.
Cú pháp:
 Khai báo trong XSD: <xs:complexType name="Ten_kieu">
<xs:sequence>
Thanh_phan_1
Thanh_phan_2
......
Thanh_phan_k
</xs:sequence>
......
219 220
</xs:complexType>

Đặc tả cấu trúc nội dung của thẻ phức Đặc tả cấu trúc nội dung của thẻ phức ...

Ví dụ về khai báo theo dạng tuần tự  Ví dụ về khai báo theo dạng tuần tự

Cách 2: khai báo thẻ


Cách 1: khai báo thẻ phức thông qua tên kiểu
phức thông qua tên thẻ

Hoặc có thể khai báo như sau: Nhận xét: cách này thông dụng hơn
221 222

37
Đặc tả cấu trúc nội dung của thẻ phức ... Đặc tả cấu trúc nội dung của thẻ phức ...

 Dạng tùy chọn: Sử dụng thẻ/từ khóa choice Ví dụ: <xs:complexType name=“X">
Cú pháp: <xs:complexType name="Ten_kieu"> <xs:choice>
<xs:choice> <xs:element name="A” type="A”/>
Thanh_phan_1 <xs:element name="B” type="xs:string”/>
Thanh_phan_2 </xs:choice>
... </xs:complexType>
Thanh_phan_k
</xs:choice> Giải thích:
... Các thẻ có khai báo kiểu X phải bao hàm bên trong
</xs:complexType> một trong 2 thẻ con:
Ý nghĩa:
Thẻ có kiểu Ten_kieu phải sử dụng một thành phần trong số Thẻ có tên A và có kiểu A (cho phép tên kiểu và
các thành phần Thanh_phan_i. tên thẻ trùng nhau).
Dạng này chỉ sử dụng trong một số trường hợp đặc thù và ít Thẻ có tên B và có kiểu là chuỗi.
thông dụng. 223 224

Đặc tả cấu trúc nội dung ... Đặc tả cấu trúc nội dung ...
Chỉ thị Choice Chỉ thị MinOccurs ... MaxOccurs

225 226

Đặc tả cấu trúc nội dung ... Đặc tả cấu trúc nội dung ...
Chỉ thị MinOccurs ... MaxOccurs Chỉ thị MinOccurs ... MaxOccurs
Cú pháp (thông dụng): Ý nghĩa: Một số trường hợp thông dụng:
<xs:complexType name="Ten_kieu">  Lặp lại ít nhất 0 lần (nhiều hoặc không có lần nào):
<xs:sequence> minOccurs=”0”
....
<xs:element name="Ten_the_con”type="Kieu_the_con"  Lặp lại ít nhất 1 lần:
minOccurs=”So_lan_lap_toi_thieu” minOccurs=”1”
maxOccurs=”So_lan_lap_toi_da”/>
....
 Lặp lại ít nhất 1 lần và nhiều nhất 5 lần:
</xs:sequence> minOccurs=”1”
...... maxOccurs=”5”
</xs:complexType>  Lặp lại đúng 3 lần
minOccurs=”3”
227 maxOccurs=”3” 228

38
Đặc tả thuộc tính của thẻ phức Đặc tả thuộc tính của thẻ phức...

Mục đích: Dùng để mô tả hệ thống các thuộc tính  Giải thích:


của một thẻ.  Ten_thuoc_tinh: tên thuộc tính của kiểu đang xét, không
Cú pháp: cho phép 2 thuộc tính có cùng tên.
 Kieu_thuoc_tinh: Tên của kiểu cơ sở hay kiểu đơn giản.
<xs:complexType name="Ten_kieu">
Đặc tả cấu trúc nội dung  Tinh_chat_thuoc_tinh: Mô tả một số tính chất của thuộc
...... tính. XML Shema cho phép mô tả nhiều loại tính chất khác
<xs:attribute name="Ten_thuoc_tinh" nhau, mỗi tính chất tương ứng với một từ khóa riêng.
type="Kieu_thuoc_tinh“ Tinh_chat_thuoc_tinh /> <xs:attribute name="Ten_thuoc_tinh“ type="Kieu_thuoc_tinh"
...... Tu_khoa_1=”Gia_tri_1”
</xs:complexType>
Tu_khoa_2=”Gia_tri_2”
...
Giải thích: Tu_khoa_k=”Gia_tri_k”/>
229 230

Đặc tả thuộc tính ... 3.6. ĐẶC TẢ THẺ TRONG XML SCHEMA

Một số tính chất thông dụng: 3.6.1 Các thông tin cần mô tả
Giá trị mặc định: từ khóa default Đặc tả các thẻ trong XML nhằm xác định kiểu sẽ
Giá trị cố định: từ khóa fixed được sử dụng của thẻ.
Tùy chọn (có hay không có sử dụng: từ khóa use)
 Ví dụ: Các thông tin cần mô tả khi đặc tả một thẻ trong
<xs:attribute name="Tu_so" type="SO_NGUYEN_DUONG" XML bao gồm:
default=”1”/> - Tên thẻ
<xs:attribute name="Bien_so" type="xs:string“ fixed=”x”/> - Kiểu của thẻ
<xs:attribute name="Ten_don_thuc" type="xs:string"
- Một số tính chất khác của thẻ
use=”optional”/>

231 232

3.6.2 Cú pháp khai báo 3.6.3 Thuật toán đặc tả thẻ

Dạng khai báo chung: Input: loại kiểu của A


<xs:element name=”Ten_the” type=”Ten_kieu” Output: cách đặc tả kiểu
Thuoc_tinh_khac/> Method:
 Ten_the: Tên của thẻ đang xét và tuân theo cách If A là kiểu phức then
đặt tên của định chuẩn XML. Đặc tả kiểu phức A bao gồm:
 Ten_kieu: Tên của kiểu tương ứng mô tả thông tin Đặc tả hệ thống các thẻ con của thẻ gốc X
về thẻ. Thông thường tên kiểu và tên thẻ sẽ được For i=1 to k do
đặt trùng nhau. Đặc tả thẻ Xi với thông tin về kiểu (giả sử là Ai)
Đặc tả hệ thống các thuộc tính của thẻ gốc X
 Thuoc_tinh_khac: Có nhiều loại thuộc tính khác
For i=1 to k do
nhau cho phép mô tả các tính chất của thẻ mà trong
đó thông dụng nhất là 2 thuộc tính minOccurs, Đặc tả thuộc tính Ti với thông tin về kiểu (giả sử là Bi)
maxOccurs 233 234

39
3.6.3 Thuật toán đặc tả thẻ 3.7 MỘT SỐ PHƢƠNG PHÁP THIẾT KẾ XSD
If A là kiểu đơn giản then
Begin
Đặc tả kiểu cơ sở của A
Đặc tả các hạn chế trên kiểu cơ sở của A
end
If A là kiểu cơ sở then Không cần đặc tả thêm
For i=1 to k do
Xét loại kiểu của Ai
For i=1 to k do
Xét loại kiểu của Bi
For i=1 to k do
Xét loại kiểu của Ti
235 236
See also: https://www.w3schools.com/xml/schema_example.asp

Cách1: Tạo một file XML Schema từ một file XML Tạo một xml schema từ shiporder.xml
Giả sử chúng ta có tài Mở một file mới có tên shiporder.xsd bằng một editor nào đó
liệu xml: shiporder.xml
Trong đó: Lần theo cấu trúc của shiporder.xml để khai báo các thẻ:
•Thẻ gốc: "shiporder“ có
(1)
(2) Bắt đầu bằng việc khai báo thẻ gốc xs:schema của lược đồ
thuộc tính "orderid". Và
có các thẻ con là:
"orderperson", "shipto"
and "item".
•Thẻ Item xuất hiện 2 lần
và có các thẻ con là:
"title", "note“, "quantity“
shiporder.xml Trong Schema ở trên chúng ta đã sử dụng không gian tên
và "price”. chuẩn (xs) và URI chỉ nơi định nghĩa ngôn ngữ Schema
•Dòng (1): nói với XML Tiếp theo, khai báo thẻ gốc “shiporder”. Thẻ này chứa 1
Parser rằng tài liệu này
được xác định đối với thuộc tính và các thẻ con nên nó phải có kiểu phức
lược đồ.
•Dòng (2): chỉ vị trí của
lược đồ (ở đây là trong
cùng một thư mục với
"shiporder.xml").
237 238

Tạo một xml schema từ shiporder.xml : Tạo một xml schema từ shiporder.xml :
Tiếp tục khai báo các thẻ "orderperson" có kiểu đơn giản (vì Tiếp tục khai báo cho "item"
nó không chứa thuộc tính hoặc thẻ con)

 Khai báo 2 thẻ có kiểu phức là: "shipto" và "item".


Trước hết khai báo cho "shipto"

 Khai báo thuộc tính cho thẻ gốc “shiporder”. Chú ý rằng
khai báo thuộc tính phải sau cùng.

 Đến đây chúng ta đã có file shiporder.xsd như sau:


239 240

40
Cách 2: Phƣơng pháp phân chia lƣợc đồ
shiporder.xsd
Nhận xét:
https://www.w3schools.com/xml/schema_example.asp

 Phương pháp thiết kế một XSD ở trên là khá đơn


giản nhưng khó đọc, khó chỉnh sửa và khó bảo trì khi tài
liệu XML là khá lớn.

 Phương pháp thiết kế XSD sau đây-Phương pháp


phân chia lược đồ (Divide the Schema)-có nhiều ưu
điểm hơn:
 khai báo tất cả các thẻ đơn giản
 Khai báo tất cả các thuộc tính của thẻ phức
 Khai báo thẻ phức (từ thẻ con đến thẻ cha)

241 242

shiporder.xsd được thiết kế như sau: shiporder.xsd được thiết kế như sau:
<!– Phần khai báo đầu tiên--> <!– Khai báo thẻ phức-->

<!– Khai báo các thẻ đơn giản-->

<!– Khai báo thuộc tính -->

<!– Khai báo thẻ phức-->

243 244

shiporder.xsd được thiết kế như sau: Ví dụ1: Về khai báo cấu trúc XSD cho CSDL quan hệ
Một khách sạn có 3 lọai dịch vụ với đơn giá tương
ứng như sau:
1. Thuê phòng:
• Lọai A: 600.000 đ/ngày,
• Lọai B: 480.000 đ/ngày,
• Lọai C: 360.000 đ/ngày.
2. Thuê xe:
• Lọai 1 (7 chỗ): 300.000 đ/giờ,
• Lọai 2 (4 chỗ): 150.000 đ/giờ.
3. Điện thoại:
Xem phương pháp thiết kế Divide the Schema ở site:
https://www.w3schools.com/xml/schema_example.asp • Lọai 1: 50.000 đ/phút,
• Lọai 2: 30.000 đ/phút.

245 246

41
Ví dụ1: Về khai báo cấu trúc XSD cho CSDL quan hệ Ví dụ1: Về khai báo cấu trúc XSD cho CSDL quan hệ
Để quản lý khách hàng thuê phòng và sử dụng các dịch vụ của
khách sạn người ta sử dụng Hóa đơn thanh toán theo mẫu sau:
HÓA ĐƠN THANH TOÁN
Số hóa đơn: 12345
Họ và tên khách hàng: Nguyễn Văn A
Ngày lập: 01/06/2020
Dịch vụ Số lƣợng Đơn giá Thành tiền
Thuê phòng 4 ngày 600.000 đ 2.400.000 đ
(loại A)
Thuê xe 5 giờ 150.000 đ 750.000 đ
(Loại 4 chỗ)
Điện thoại 10 phút 50.000 đ 500.000 đ
(loại 1)
Tổng tiền: 3.650.000 đ 247
XSD
248

Ví dụ1: Về khai báo cấu trúc DTD cho CSDL quan hệ Ví dụ1: Về khai báo cấu trúc DTD cho CSDL quan hệ

249 250

Ví dụ1: Về khai báo cấu trúc XSD cho CSDL quan hệ Ví dụ1: Về khai báo cấu trúc XSD cho CSDL quan hệ
hoadon.xsd được thiết kế như sau: <!– Khai báo thuộc tính -->
<!– Phần khai báo đầu tiên-->
<xs:attribute name="MSDV" use="required" type="ID">
<xs:restriction base="xs:string"/>
</xs:attribute>
<xs:attribute name=“TenDV" use="required" type="xs:string">
<!– Khai báo các thẻ đơn giản - Không có thẻ đơn giản->
<xs:restriction base="xs:string"/>
<!– Khai báo thuộc tính --> </xs:attribute>
<xs:attribute name="SoHD" use="required" type="ID">
<xs:attribute name="MSLoaiDV" use="required" type="ID">
<xs:restriction base="xs:string"/>
<xs:restriction base="xs:string"/>
</xs:attribute>
</xs:attribute>
<xs:attribute name=“HoTenKH" use="required" type="xs:string">
<xs:attribute name=“TenLoaiDV" use="required" type="xs:string">
<xs:restriction base="xs:string"/>
<xs:restriction base="xs:string"/>
</xs:attribute
</xs:attribute>
<xs:attribute name=“NgayLap" use="required" type="xs:date">
<xs:attribute name=“DonGia” use="required" type="xs:int">
<xs:restriction base="xs:date"/>
<xs:restriction base="xs:int"/>
</xs:attribute
</xs:attribute>
<xs:attribute name=“SoLuong” use="required" type="xs:int"> <!– Khai báo thẻ phức-->
<xs:restriction base="xs:int"/>
</xs:attribute>
251 252

42
Ví dụ1: Về khai báo cấu trúc XSD cho CSDL quan hệ Ví dụ1: Về khai báo cấu trúc XSD cho CSDL quan hệ
<!– Khai báo thẻ phức-->
<!– Khai báo thẻ phức-->
<xs:element name=“HoaDon">
<xs:element name=“LoaiDichVu"> <xs:complexType>
<xs:complexType> <xs:element ref=" DichVu"/>
<xs:sequence> <xs:attribute ref=“SoHD" use="required"/>
<xs:attribute ref=" MSLoaiDV“ use="required"/> <xs:attribute ref=“HoTenKH" use="required"/>
<xs:attribute ref=" TenLoaiDV“ use="required"/> <xs:attribute ref=“NgayLap" use="required"/>
<xs:attributet ref=" DonGia" use="required"/> </xs:complexType>
<xs:attribute ref=" SoLuong" use="required"/> </xs:element>
</xs:sequence>
</xs:complexType> <xs:element name=“Danh_Sach_Hoa_Don">
</xs:element> <xs:complexType>
<xs:element name=“DichVu"> <xs:element ref=" HoaDon"/>
<xs:complexType> </xs:complexType>
<xs:element ref=" LoaiDichVu"/> </xs:element>
<xs:attribute ref=“MSDV" use="required"/>
<xs:attribute ref=“TenDV" use="required"/> </xs:schema>
</xs:complexType>
</xs:element>
Xem phương pháp thiết kế Divide the Schema ở site:
253 254
https://www.w3schools.com/xml/schema_example.asp

Cách 3: Phƣơng pháp sử dụng tên kiểu Cách 3: Phƣơng pháp sử dụng tên kiểu ...
Bằng cách định nghĩa các lớp và kiểu, phương pháp
này sử dụng lại các thẻ và thuộc tính đã định nghĩa
trước. Using Named Types
Trong trường hợp này, shiporder.xsd được thiết kế
như sau:

255 256

Cách 3: Phƣơng pháp sử dụng tên kiểu ... Cách 3: Phƣơng pháp sử dụng tên kiểu ...

Xem phương pháp thiết kế Using Named Types ở site:


https://www.w3schools.com/xml/schema_example.asp
257 258

43
Ví dụ2: Xét biểu đồ lớp của một hệ thống tra cứu thông tin về
Bài tập
nhân viên của một công ty. Bằng XML Schema hãy mô tả cấu trúc
của file XML chứa các dữ liệu như trong khai báo của biểu đồ lớp.
Sử dụng các tài liệu xml đã có: CD Catalog.xml,
Foodmenu.xml, Plant.xml ở các site:
www.w3schools.com/xml/cd_catalog.xml
www.w3schools.com/xml/simple.xml
www.w3schools.com/xml/plant_catalog.xm
để thiết kế các XSD tương ứng bằng các phương
pháp khác nhau.

259 260

Chuyển Class Diagram trong UML thành cấu trúc XSD Chuyển Class Diagram trong UML thành cấu trúc XSD ...

261 262

Chuyển Class Diagram trong UML thành cấu trúc XSD ... Chuyển Class Diagram trong UML thành cấu trúc XSD ...

Bảng sau đây mô tả ánh xạ mặc định của các cấu trúc UML sang các cấu trúc
XSD.
Một phần tử lƣợc đồ đƣợc tạo cho gói
đích. Nếu gói mục tiêu bao gồm các lớp
từ gói khác, có các giá trị đƣợc gắn thẻ,
Target targetNamespace, và Target
targetNamespacePrefix, thì chúng đƣợc
bao gồm nhƣ là các thuộc tính của
phần tử lƣợc đồ.

Ngoài ra, một phần tử nhập hoặc bao


gồm đƣợc tạo cho mỗi gói đƣợc tham
chiếu. (Một phần tử bao gồm đƣợc sử
dụng nếu gói bên ngoài chia sẻ cùng
giá trị đƣợc gắn thẻ không gian đích
nhƣ gói mục tiêu. Một phần tử nhập
đƣợc sử dụng khi khác biệt của mục
tiêu tên miền.)

263 264

44
Chuyển một class Diagram trong UML thành XML file ...

See also from

265
http://sparxsystems.com.au/resources/xml_schema_generation.html 266

Ví dụ: Xét biểu đồ lớp của một hệ thống tra cứu thông tin các
nhân viên của một công ty. Hãy mô tả cấu trúc của file XML chứa
các dữ liệu như trong khai báo của biểu đồ Class bằng XML
Schema

267 268

269 270

45
NỘI DUNG

4.1. GIỚI THIỆU VỀ XPath


CHƢƠNG 4:
4.2. CHỌN CÁC NÚT CỦA XPath
TRÍCH XUẤT TÀI LIỆU XML 4.3. MỘT SỐ HÀM VÀ TOÁN TỬ
VỚI XPath, XQuery THÔNG DỤNG
4.4. XML VÀ CSDL QUAN HỆ
EXTRACT DATA FROM XML DOCUMENT
BY XPath, XQuery
4.5. XQuery

PGS.TS. Nguyễn Mậu Hân


4.6. ỨNG DỤNG XQuery TRONG XPath
Khoa CNTT-ĐHKH HUẾ
nmhan@husc.edu.vn
4.7. ỨNG DỤNG XQuery TRONG HTML 272
271

4.1. GIỚI THIỆU VỀ XPath 4.1. GIỚI THIỆU VỀ XPath...


❖XPath là một ngôn ngữ để tìm kiếm thông tin trong
một tài liệu xml.
Xpath (XML Path Language) ❖XPath xem XML như một cây với nút gốc là thẻ gốc
▪ Trong XPath, có 7 loại nodes: element (thẻ), attribute, text,
namespace, processing-instruction, comment, and
document (root) nodes.
❖XPath sử dụng biểu thức đường dẫn (Path
Expressions) để chọn các nút hoặc một tập các nút trong
tài liệu xml
❖Xpath có trên 100 hàm chuẩn được sử dụng trong
việc xác định thông tin

❖XPath là một bộ phận chủ yếu được sử dụng trong
273 XSLT, XQuery, Xpointer 274

4.1. GIỚI THIỆU VỀ XPath... 4.1. GIỚI THIỆU VỀ XPath


Order (thẻ gốc)
Ví dụ: xét tài liệu XML Chú thích

OrderNo = “1047” Thẻ


<?xml version="1.0"?>
Thuộc tính
<Order OrderNo="1047"> OrderDate (2002-03-26)
<OrderDate>2002-03-26</OrderDate> Customer (John Costello)
<Customer>John Costello</Customer> Item
<Item> Product (Chair)
<Product ProductID="1" UnitPrice="70">Chair</Product> ProductID=”1”
<Quantity>6</Quantity> UnitPrice=”70”
Quantity(6)
</Item>
<Item>
Item
<Product ProductID="2“ UnitPrice="250">Desk</Product>
Product (Desk)
<Quantity>1</Quantity> ProductID=”2”
Cách duyệt các nút
</Item>
Tài liệu XML được biểu diễn dưới dạng cây như sau:
UnitPrice=”250” như thế nào để trích
</Order> 275 Quantity(1) 276
xuất thông tin?

46
4.2. CHỌN CÁC NÚT CỦA XPath Ví dụ: Xét tài liệu books.xml dưới đây:

a. Chọn các nút bằng biểu thức đường dẫn (path


expression): XPath sử dụng biểu thức đường dẫn để
chọn các nút trong một tài liệu xml.

Biểu thức Mô tả
nodename Chọn tất cả các nút có tên "nodename"
/ Chọn từ nút gốc Parse
Chọn những nút từ nút hiện thời mà không
//
quan tâm các nút được chọn hiện đang ở đâu
. Chọn nút hiện thời
.. Chọn nút cha của nút hiện thời
@ Chọn thuộc tính
277 278

Ví dụ: Xét tài liệu books.xml dưới đây: b. Chọn các nút bằng vị từ (Predicate)
BT đƣờng dẫn Kết quả

bookstore
Chọn tất cả các nút có tên ❖Vị từ được sử dụng để tìm những nút đặc biệt hoặc
là "bookstore" nút chứa giá trị đặc biệt.
/bookstore Chọn nút gốc là bookstore ❖Vị từ luôn luôn được đặt trong cặp dấu móc vuông
[...].
Chọn tất cả các nút con của
bookstore/book
bookstore có tên book
Chọn tất cả các nút book
//book mà không quan tâm chúng
nằm ở đâu trong xml tree

Chọn tất cả các nút book là


con cháu của nút bookstore
bookstore//book
mà không quan tâm chúng
nằm ở đâu trong xml tree
Chọn tất cả các thuộc tính
//@lang
có tên là lang 279 280

Ví dụ c. Chọn các nút chưa biết (Unknown Nodes)

❖Xpath sử dụng các ký tự đại diện (wildcards) để chọn các nút


Chọn thẻ /bookstore/book đầu tiên chưa biết trong một tài liệu xml.
Chọn thẻ /bookstore/book cuối cùng Wildcard Description
Chọn thẻ /bookstore/book gần cuối cùng * Chọn tất cả các nút
@* Chọn tất cả các thuộc tính của nút
Chọn 2 thẻ đầu là con của thẻ /bookstore
node() Chọn tất cả các nút thuộc loại bất kỳ

Chọn các thẻ có tên thuộc tính là lang Ví dụ:


Chọn các thẻ có attribute named là lang với Path
Result
giá trị là „eng‟ Expression

Chọn tất cả thẻ /bookstore/book mà có /bookstore/* Chọn tất cả các nút con của nút bookstore
price>35 //* Chọn tất cả các nút trong tài liệu
Chọn title của các thẻ /bookstore/book mà có
281
//title[@*] Chọn tất cả các nút title mà có thuộc tính 282
price>35

47
4.3. DUYỆT CÁC NÚT CỦA XPath... 4.3. DUYỆT CÁC NÚT CỦA XPath...
4.3.1 Đường dẫn tuyệt đối ❖Đến thuộc tính của nút: cần phải khai báo từ khóa
Attribute trong cú pháp nguyên hoặc @ trong cú
❖/ : bắt đầu từ thẻ gốc. pháp tắt.
Ví dụ:
Ví dụ: muốn chọn nút Order: Để lấy giá trị của thuộc tính
OrderNo của nút Order ta dùng
▪ Cú pháp nguyên: /child::Order
cú pháp XPath như sau:
▪ Cú pháp tắt: /Order
Cú pháp nguyên:
❖Đi ra nhánh con Customer: /child::Order/Attribute::OrderNo
Cú pháp nguyên: /child::Order/child::Customer Cú pháp tắt:
Cú pháp tắt: /Order/Customer /Order/@OrderNo
283 284

4.3. DUYỆT CÁC NÚT CỦA XPath... 4.3. DUYỆT CÁC NÚT CỦA XPath ...
4.3.2 Đường dẫn tương đối 4.3.3 Chọn các thẻ theo điều kiện
❖Sử dụng trong trường hợp muốn trích thông tin một Sử dụng dấu ngoặc vuông ([ ]) để lấy các thẻ thỏa mãn
thẻ nào đó mà chỉ biết tên chứ không biết vị trí. điều kiện nào đó.
Ví dụ: trích các thẻ có tên là Product: Ví dụ, lấy mọi thẻ Product có thuộc tính UnitPrice>70:
Cú pháp nguyên: //child::Product Cú pháp nguyên:
//child::Product[Attribute::UnitPrice>70]
Cú pháp viết tắt: //Product Cú pháp tắt:
4.3.3 Chọn các thẻ bằng ký tự đại diện //Product[@UnitPrice>70]
* : chọn tất cả các nút con của một của một nút nào đó. Ví dụ, để lấy những thẻ Item có thẻ con là Product và
Ví dụ: để lấy tất cả các thẻ con của thẻ Order: có thuộc tính ProductID=1:
Cú pháp nguyên: /child::Order/child::* Cú pháp nguyên:
Cú pháp tắt: /Order/* //child::Item[child::Product/Attribute::ProductID=1]
285
Cú pháp tắt: //Item[Product/@ProductID=1] 286

4.4. MỘT SỐ HÀM VÀ TOÁN TỬ THÔNG DỤNG... 4.4. MỘT SỐ HÀM VÀ TOÁN TỬ THÔNG DỤNG...

Tên hàm Ý nghĩa Ví dụ


Hàm lấy tổng số nút con //Item[count(*)=2]
count() của một thẻ nào đó Chọn tất cả các thẻ Item có số
thẻ con là 2
Lấy tên của thẻ /Order/*[name()=’Item’]
name() Chọn tất cả các thẻ con của
Order có tên là Item
Hàm phủ định //Item/*[not(@*)]
not() Chọn tất cả các thẻ con của Item
không chứa thuộc tính nào
Hàm bỏ khoảng trắng //Item/*[normalize-
space(@ProductID)=’abc’]
normalize-
Chọn tất cả các thẻ con của Item
space(str) có thuộc tính ProductID=abc
(không phân biệt khoảng trắng)

287 288

48
Tên hàm Ý nghĩa Ví dụ
Hàm kiểm tra chuỗi str có //item/*[starts-with(name(),’P’)]
4.4. MỘT SỐ HÀM VÀ TOÁN TỬ THÔNG DỤNG...
starts- chứa chuỗi substr (tính từ Chọn tất cả các thẻ con của Item có
with(str,substr) vị trí đầu tiên) hay không tên bắt đầu bởi ký tự P Tên toán tử Chức năng Ví dụ
Toán tử hoặc dùng //Item/*[starts-with(name(),‟U‟) |
Kiểm tra chuỗi str có chứa //item/*[contains(name(),’u’)] starts-with(name(),‟Q‟) ]
chuổi con substr hay Chọn tất cả các thẻ con của thẻ Item | để chọn ra một lần
contains(str,substr) không nhiều thẻ có điều Chọn tất cả các thẻ là con của Item
mà tên của các thẻ con này có chứ ký có có tên bắt đầu bởi ký tự U hoặc Q
tự u kiện khác nhau
Hàm lấy chiều dài của 1 //Item/*[string-length(name())=5] Chọn thẻ con của /Order
chuỗi thẻ chỉ định /Item/Product/descendant::*
Chọn tất cả các thẻ con của Item mà descendant
string-length(str) Chọn tất cả các thẻ là con của
độ dài tên của các thẻ con này là 5
/Order/Item/Product
Cho biết vị trí hiện tại của //Item[position()=5] Chọn thẻ cấp trên /Order/Item/Product/ancestor::*
ancestor
position() thẻ chọn 2 thẻ Item và thẻ Order
Chọn thẻ Item có vị trí là 5
Lấy giá trị nhỏ nhất gần Chọn thẻ cùng cấp /Order/OrderDate/following-
floor() kế tiếp sibling::*
với giá trị chỉ định following-
Lấy giá trị lớn nhất gần với chọn các thẻ Custumer và hai thẻ
ceiling() sibling Item theo sau và cùng cấp với thẻ
giá trị chỉ định
OrderDate
Vị trí nút cuối cùng //Item[last()]
last() 289 290
Chọn thẻ Item cuối cùng

4.4. MỘT SỐ HÀM VÀ TOÁN TỬ THÔNG DỤNG... MỘT SỐ VÍ DỤ

Tên toán tử Chức năng Ví dụ Chọn thẻ gốc AAA? /AAA


Chọn thẻ theo sau thẻ /Order/OrderDate/following::* <AAA>
following chỉ định chọn thẻ Custumer và 2 thẻ Item AAA
và các thẻ con của Item <BBB/>
Chọn các thẻ đứng trước /Order/Custumer/preceding::* <CCC/> BBB
preceding thẻ chỉ định chọn tất cả các thẻ đi trước thẻ
Custumer <BBB/>
CCC
Chọn thẻ cấp dưới và thẻ /Order/Item/descendant-or- <DDD>
descendant- chỉ định self::* BBB
or-self Chọn tất cả các thẻ Item và các
<BBB/>
thẻ con của thẻ này </DDD> DDD BBB
Chọn thẻ cấp trên và thẻ /Order/Item/product/ancestor-
ancestor-or- chỉ định or-self::* <CCC/>
self chọn 2 phân tử product, 2 thẻ CCC
Item và thẻ Order </AAA>
291 292

Chọn tất cả các thẻ BBB là con của DDD mà DDD là con của AAA?
Chọn thẻ CCC là con của AAA? /AAA/CCC
(/AAA/DDD/BBB)
<AAA> AAA <AAA> AAA
<BBB/>
<BBB/> <CCC/> BBB
BBB
<CCC/> <BBB/>
<DDD> CCC
<BBB/> CCC <BBB/>
<DDD> <DDD> BBB
<BBB/> BBB <CCC/>
DDD BBB
<DDD>
</DDD>
DDD BBB <BBB/> CCC DDD BBB
<CCC/>
<BBB/>
</AAA> CCC </AAA> BBB
293 294

49
Chọn tất cả các thẻ BBB là con của DDD? //DDD/BBB
Chọn tất cả các thẻ BBB? //BBB
<AAA>
AAA
<AAA> AAA <BBB/>
<BBB/> <CCC/> BBB
<CCC/> BBB <BBB/>
<BBB/> <DDD>
<DDD> <BBB/> CCC
CCC
<BBB/> </DDD>
</DDD> <CCC> BBB
<CCC> BBB <DDD>
<DDD> <BBB/> DDD BBB
<BBB/> DDD BBB <BBB/>
<BBB/> </DDD> CCC DDD BBB
</DDD> CCC DDD BBB </CCC>
</CCC> </AAA> BBB
</AAA> BBB 295 296

Chọn tất cả các thẻ mà dòng họ của nó là /AAA/CCC/DDD?


/AAA/CCC/DDD/* Chọn tất cả các thẻ BBB mà nó có 3 cấp cha? /*/*/*/BBB
<AAA>
<XXX> AAA <AAA> AAA
<DDD> <XXX>
<BBB/> XXX DDD BBB <DDD>
<BBB/>
XXX DDD BBB
<BBB/>
<EEE/> BBB <BBB/>
BBB
<FFF/> <EEE/>
</DDD> EEE <FFF/>
</XXX> </DDD> EEE
<CCC>
FFF </XXX>
<DDD> <CCC> FFF
<BBB/> CCC DDD BBB <DDD>
<BBB/> <BBB/> CCC DDD BBB
<EEE/>
BBB <BBB/>
<FFF/> <EEE/> BBB
</DDD>
EEE <FFF/>
</CCC> </DDD>
FFF </CCC>
EEE
<CCC>
<BBB> <CCC>
<BBB>
CCC BBB BBB <BBB> FFF
<BBB/> <BBB>
</BBB> <BBB/> CCC BBB BBB
</BBB>
BBB </BBB>
</CCC> 297 </BBB> 298
</AAA> </CCC>
</AAA> BBB

Chọn thẻ BBB đầu tiên là con của AAA? /AAA/BBB[1] Chọn tất cả các thuộc tính có tên id? //@id
BBB

<AAA> AAA <AAA>


AAA
<BBB/> <BBB id = "b1"/> id
BBB <BBB id = "b2"/> BBB
<BBB/> id
<BBB/> <BBB name = "bbb"/> BBB
BBB name
<BBB/> <BBB/>
</AAA> BBB
</AAA> BBB
BBB
BBB
Chọn tất cả các thẻ BBB có thuộc tính tên là id? //BBB[@id]
Chọn thẻ BBB cuối cùng là con của AAA? /AAA/BBB[last()]
<AAA>
<AAA> AAA <BBB id = "b1"/> AAA
id
<BBB/> <BBB id = "b2"/> BBB
<BBB/> BBB
<BBB name = "bbb"/> id
<BBB/> BBB <BBB/> BBB
name
<BBB/> </AAA>
</AAA> BBB BBB
BBB 299 BBB 300

50
Chọn tất cả các thẻ BBB có thuộc tính:
BBB (//BBB[@*]) Chọn tất cả các thẻ có chứa các thẻ mà trong đó có 2 thẻ con tên là
BBB

<AAA> BBB: (//*[count(BBB)=2])


AAA
<BBB id = "b1"/> id <AAA>
<BBB id = "b2"/> BBB <CCC> AAA BBB
id
<BBB name = "bbb"/> <BBB/>
BBB
<BBB/> name <BBB/> CCC BBB
</AAA> BBB <BBB/>
BBB </CCC> BBB
<DDD>
Chọn tất cả các thẻ BBB có tên thuộc tính là bbb, không phân biệt <BBB/> DDD BBB
khoản trắng: (//BBB[normalize-space(@name)='bbb']) <BBB/>
<AAA> </DDD> BBB
AAA
<BBB id = "b1"/> id <EEE>
<BBB name=" bbb "/> BBB <CCC/> EEE CCC
<BBB name = "bbb"/> id <DDD/>
</AAA> BBB
name </EEE> DDD
</AAA>
BBB 301 302

Chọn tất cả các thẻ mà tên của nó bắt đầu là ký tự B


BBB
Chọn tất cả các thẻ mà tên của nó có chứa ký tự B
BBB

(//*[starts-with(name(),’B’)]) (//*[contains(name(),’B’)])
<AAA>
<AAA> <BCC> AAA
<BCC> AAA <BBB/>
<BBB/> <BBB/> BCC BBB
<BBB/> BCC BBB </BCC>
</BCC>
<BEC> BBB
<BEC> BBB
<CCC/> <CCC/>
<DBD/> BEC CCC <DBD/> BEC CCC
</BEC> </BEC>
</AAA> DBD </AAA> DBD

303 304

Chọn tất cả các thẻ mà tên của nó có độ dài là 3


BBB Chọn tất cả các thẻ mà tên
BBBcủa nó là CCC hoặc BBB

(//*[string-length(name())=3)]) ( //*[name()=’CCC’]| //*[name()=’BBB’])


<AAA> <AAA>
AAA AAA
<Q/> <BBB/>
Q <CCC/> BBB
<SSSS/>
<BB/> SSSS <DDD>
<CCC/> <CCC/> CCC
BB </DDD>
<DDDD/> DDD CCC
CCC <EEE/>
</AAA> </AAA>
DDDD EEE
Chọn tất cả các thẻ mà tên của nó có độ dài khác 3 Chọn tất cả các thẻ là cha của thẻ DDD: (//DDD/parent::*)
(//*[string-length(name())!=3)]) <AAA>
<BBB> AAA
<AAA> AAA
<Q/> <DDD>
<SSSS/>
Q <CCC>
<DDD/> BBB DDD
<BB/> SSSS
<CCC/> <EEE/>
<DDDD/>
BB </CCC> CCC DDD
</DDD>
</AAA> CCC
</BBB> EEE
DDDD 305
</AAA> 306

51
Chọn tất cả các thẻ là con của AAA/BBB:
BBB Chọn tất cả các thẻ là tổ tiên của thẻ DDD
BBB

(/AAA/BBB/descendant::*) (//DDD/ancestor::*)
<AAA>
<BBB>
<AAA> <DDD>
AAA
<BBB>
AAA
<CCC>
<DDD> <DDD/>
<CCC> BBB DDD CCC <EEE/> BBB DDD
<DDD/> </CCC>
<EEE/> DDD </DDD>
</CCC> </BBB> CCC DDD
</DDD> <CCC>
</BBB>
EEE <DDD>
CCC DDD EEE
<CCC> <EEE>
<DDD/> <DDD>
</CCC> CCC DDD <FFF/>
</AAA> </DDD> EEE DDD
</EEE>
</DDD> FFF
</CCC>
307 </AAA> 308

Chọn tất cả các thẻ cùng cấp đi sau thẻ BBB


BBB Chọn tất cả các thẻ cùng cấp đi trước thẻ XXX
BBB

(//BBB/following-sibling::*) (//XXX/preceding-sibling::*)
<AAA> <AAA>
<BBB> <BBB>
<CCC/>
AAA <CCC/> AAA
<DDD/> CCC <DDD/>
</BBB> </BBB> CCC
BBB
<XXX> <XXX> BBB
DDD
<DDD> <DDD> DDD
<EEE/> <EEE/>
XXX DDD EEE
</DDD> </DDD> XXX DDD EEE
</XXX> </XXX>
<CCC> <CCC>
CCC DDD <DDD/>
<DDD/> CCC DDD
</CCC> </CCC>
</AAA> </AAA>

309 310

Chọn tất cả các thẻ đi sau thẻ ZZZ


BBB Chọn tất cả các thẻ đi trước thẻ XXX ngoại trừ những thẻ gốc:
BBB

(//ZZZ/following::*) (//XXX/preceding::*)
<AAA>
<AAA> AAA <BBB>
<BBB> <CCC/> AAA
<CCC/> CCC <ZZZ>
CCC
<ZZZ> <DDD/>
BBB </ZZZ> BBB
<DDD/>
</ZZZ> ZZZ DDD <FFF> ZZZ DDD
<FFF> <GGG/>
<GGG/> </FFF>
FFF GGG FFF GGG
</FFF> </BBB>
</BBB> <XXX>
<XXX> EEE <DDD> EEE
<DDD> <EEE/>
<EEE/> <DDD/> XXX DDD DDD
XXX DDD DDD <FFF/>
<DDD/>
<FFF/> </DDD>
</XXX>
FFF
</DDD> FFF
</XXX> <CCC>
<CCC> <DDD/> CCC DDD
<DDD/>
CCC DDD </CCC>
</CCC> 311 </AAA> 312
</AAA>

52
Chọn tất cả các thẻ CCC và con của nó:
BBB Chọn tất cả các thẻ GGG và tổ tiên của nó:
BBB

(//CCC/descendant-or-self::*) (//GGG/ancestor-or-self::*)
<AAA> <AAA>
<BBB> AAA <BBB>
<CCC/> <CCC/>
<ZZZ> CCC </BBB>
AAA
<DDD/> BBB <XXX>
</ZZZ> <DDD>
ZZZ DDD BBB CCC
</BBB> <FFF/>
<XXX> <FFF>
<DDD> <GGG/>
<CCC/> CCC FFF
</FFF>
<FFF/> XXX DDD </DDD> XXX DDD
</DDD> FFF </XXX> FFF
</XXX> <CCC>
<CCC> <DDD/> GGG
<DDD/> </CCC>
</CCC> CCC DDD
CCC DDD </AAA>
</AAA>
313 314

BBB BBB

Chọn thẻ BBB đầu tiên: (//BBB[floor(1.2)])


<AAA>
AAA
<BBB>
<CCC/>
</BBB> BBB CCC Một trong những công cụ để hiển thị kết quả khi sử dụng XPart:
- Netbeans 6.9.1
<BBB/> - JDK 6 update 22
</AAA> BBB - Các bước thực hiện:
o Add plugin hỗ trợ kiểm tra biễu thức XPath vào Netbeans 6.9.1
• Download gói plugin Xpath tại đây với tên org-sougata-util-nb-xpathev_6.9.1.0.nbm.
Chọn thẻ BBB thứ hai: (//BBB[ceiling(1.2)]) Tập tin có đuôi .nbm
• Di chuyển đến thư mục
<AAA> AAA ✔ Windows C:\Documents and Settings\[Tên account login vào
<BBB> windows]\.netbeans\6.9
✔ Windows C:\Users\[Tên account login vào windows]\.netbeans\6.9
<CCC/> • Tạo thư mục update
</BBB> BBB CCC • Vào thư mục update, tạo thư mục download
• Chép tập tin download ở trên vào trong thư mục download.
<BBB/>
• Mở lại Netbeans 6.9.1, màn hình update sẽ xuất hiện, sau đó netbeans được khởi động
</AAA> BBB như bình thường (tập tin nbm trong thư mục download sẽ biến mất)
315 316

4.5. XML VÀ CSDL QUAN HỆ ... 4.5. XML VÀ CSDL QUAN HỆ ...
❖XML và trao đổi dữ liệu trên mạng
❖Ví dụ: Thông tin về lương của nhân viên Công ty
⮚XML là giải pháp thích hợp cho vấn đề trao đổi dữ VINAMEX được mô tả theo dữ liệu quan hệ:
liệu tự động giữa các kho thông tin và các CSDL
trên Internet. Lương Phụ
STT Họ và Tên Chức Vụ
⮚Đối với các thông tin có cấu trúc như thông tin Chính Cấp
trong các CSDL, việc mô tả chúng bằng XML là 1 Nguyễn Nam Giám Đốc 5.000.000 70%
rất dễ dàng và chính xác.
2 Trần Thị Thêm Trợ lý giám đốc 1.500.000 30%
⮚XML không có được những tính năng của CSDL
quan hệ như: lưu trữ hiệu quả với số lượng mẫu 3 Phạm Văn Bớt Trưởng phòng tvụ 2.500.000 40%
tin cực lớn, sao chép dự phòng, phục hồi dữ liệu,
tối ưu hệ thống.
Biểu diễn
⮚Trong thực tế nhu cầu chuyển đổi dữ liệu từ XML sang XML
sang CSDL quan hệ là cần thiết. 317 318

53
<?xml version='1.0' encoding='ISO-8859-1'?>
5.4. XML VÀ CSDL QUAN HỆ
<SALARYTABLE> ... 4.5. XML VÀ CSDL QUAN HỆ ...
<TABLENAME>
Bảng lương nhân viên Công ty VINAMEX
</TABLENAME>
❖Mô tả một quan hệ dƣới dạng XPath
<EMPLOYEE ID="1">
<NAME>Nguyễn Nam</NAME>
<POSITION>Giám đốc</POSITION>
<SALARY>5000000</SALARY>
<PERCENT>70</PERCENT>
</EMPLOYEE> row1 row2 row3
<EMPLOYEE ID="2">
<NAME>Trần Thị Thêm</NAME> Name MSSV
<POSITION>Trợ lý giám đốc</POSITION>
Hùng 038
<SALARY>1500000</SALARY>
MSSV MSSV MSSV
<PERCENT>30</PERCENT> Cƣờng 742
</EMPLOYEE> name
name name
<EMPLOYEE ID="3"> Thủy 513
<NAME>Phạm Văn Bớt<NAME>
<POSITION>Trưởng phòng tài vụ</POSITION>
<SALARY>2500000</SALARY>
“Hùng” 038 “Cƣờng” 742 “Thủy” 513
<PERCENT>40</PERCENT>
</EMPLOYEE>
</SALARYTABLE> 319 320

4.5. XML VÀ CSDL QUAN HỆ 4.6. Xquery


❖Cơ sở dữ liệu thuần XML (pure XML)
▪ Sử dụng mô hình phân cấp của dữ liệu XML để
lưu trữ và xử lý XML bên trong
▪ Định dạng lưu trữ giống như định dạng xử lý,
không có sự ánh xạ đến mô hình quan hệ.
▪ Không lưu các tài liệu XML thành dạng ảnh
▪ Khi sử dụng các câu lệnh XPath hay XQuery, một
cơ chế riêng sẽ xử lý các câu lệnh đó chứ không
chuyển sang SQL.
▪ DB2 là cơ sở dữ liệu thương mại duy nhất cung
cấp tính năng này.

321 322

4.6. XQuery 4.6. Xquery


4.6.1 XQuery là gì? 4.6.1 XQuery là gì?
❖XQuery là ngôn ngữ để truy vấn tài liệu XML, tương ❖Cấu trúc ngữ pháp của XQuery được dựa trên cấu
tác trên bất kỳ dữ liệu nào được tổ chức trên bộ nhớ trúc cây của tài liệu XML tương ứng
dưới dạng hình cây của tài liệu XML ❖XQuery có khả năng truy xuất nhiều tài liệu XML hay
❖XQuery cho phép sử dụng các biểu thức để lấy dữ nhiều DB cùng một lúc (đặc điểm nổi bật hơn XPath)
liệu ra từ các tài liệu XML. Dữ liệu đó có thể là một để trích xuất dữ liệu theo đúng yêu cầu định dạng
giá trị hoặc là một cấu trúc cây con của tài liệu XML. ❖Xquery không có context mặc định như Xpath. Ví dụ:
❖XQuery sử dụng các biểu thức XPath, liên quan đến XQuery: doc(“dictionary.xml”)/dictionary/entry[6]
các từ khóa FLWOR (For, Let, Where, Order by, XPath: /dictionary/entry[6]
và Return), dùng để tách và lấy dữ liệu từ tài liệu
Trong ví dụ trên, chúng ta thấy biểu thức Xpath không cần chỉ định tài liệu truy vấn vì
XML trong hầu hết các trường hợp. mặc định Xpath chỉ truy vấn trên duy nhất một tài liệu và bộ xử lý. Trong khi, Xquery
phải xác định rõ nội dung document vì cùng một lúc nó có thể truy xuất nhiều document
❖Cấu trúc ngữ pháp của ngôn ngữ XQuery được dựa hay nhiều DB. Do vậy, nguồn truy vấn phải được xác định rõ ràng, cụ thể trong ví dụ trên
trên cấu trúc cây của chính tài liệu XML. 323 là tài liệu dictionary.xml 324

54
4.6.2. Mục đích của XQuery 4.6.3. Phân biệt XPath và XQuery
❖ XPath và XQuery giống nhau về một số mặt. Thậm chí
XPath là một phần trọn vẹn của XQuery. Cả hai ngôn ngữ
cho phép chọn những mẫu dữ liệu từ một tài liệu XML hoặc
một kho lưu trữ tài liệu XML.
❖ XPath là một ngôn ngữ định vị, có khả năng trích ra một
hoặc một số thẻ nào đó trong tài liệu XML, nhưng nó không
có khả năng chỉ ra chính xác dữ liệu cần lấy.
❖ XPath mang lại sự đơn giản còn XQuery cung cấp thêm
sức mạnh và tính linh hoạt.
❖ XPath là công cụ hoàn hảo cho nhiều kiểu truy vấn. Ví dụ,
XPath là cách dễ nhất để tạo một danh sách không sắp thứ
tự các số điện thoại từ một tập hợp con các bản ghi trong
một tài liệu XML. Tuy nhiên, nếu cần một truy vấn biểu diễn
các tiêu chuẩn lựa chọn bản ghi phức tạp hơn, có chuyển
325 đổi tập kết quả, hoặc yêu cầu đệ quy, thì cần XQuery. 326

4.6.3. Phân biệt XPath và XQuery... 4.6.4. Phân biệt XQuery và SQL
<user>
Nếu muốn thu được một danh sách các tên họ của XQuery SQL
Ví dụ 1: Xem tài liệu Listing.xml: trẻ em mà <name>
được sắp thứ tự, chúng ta có thể sử dụng
câu lệnh FLWOR trong XQuery như sau.
<first>Tracy</first> XQuery được thiết kế để thao tác với Các bảng biểu được hỗ trợ trong
<users> let $xml:= XML from Listing
<last>Keller</last> các mô hình dữ liệu có nhiều đặc DBMS quan hệ là cấu trúc phẳng và
<user> for $user in $xml//user[age lt 18]
<name> </name> trưng khác biệt. Tài liệu XML có cấu dựa trên tập hợp, do đó các bản ghi là
order by $user/name/last
<first>Lola</first> return <age>35</age>
$user/name/last/text() trúc phân cấp và có tính chất thứ bậc. không có thứ tự.
<last>Solis</last> </user>
(: Result XQuery cho phép người lập trình SQL phẳng không có (hoặc không cần
</name> </users>
Serafina
Solis
duyệt trên cấu trúc phân cấp của tài thiết) các biểu thức tương ứng để
<age>2</age> liệu XML. duyệt trên cấu trúc dữ liệu bảng.
:)
</user>
<user> Nếu muốn thu được một danh sách các tên XQuery hỗ trợ cả hai loại dữ liệu có Dữ liệu SQL luôn luôn phải được định
<name> họ của trẻ em trong tài liệu này, chúng ta có kiểu và không có kiểu. kiểu rõ ràng.
<first>Nina</first> thể sử dụng biểu thức XPath sau. XQuery không có giá trị null bởi vì các SQL lại sử dụng giá trị null để biểu
<last>Serafina</last>
tài liệu XML bỏ qua dữ liệu thiếu hoặc diễn những dữ liệu dạng đó.
</name> /user[age lt 18]/name/last/text()
<age>4</age>
dữ liệu không biết.
<visits> (: Result XQuery trả về một chuỗi dữ liệu XML. SQL trả về kết quả là các tập hợp các
Solis
<first>2008-01-15</first>
Serafina
kiểu dữ liệu SQL khác nhau.
<last>2008-02-15</last>
</visits>
:) XQuery hoạt động trên các kiểu XML. SQL hoạt động trên các cột được định
</user>
327 kiểu SQL truyền thống. 328

4.6.5. Cú pháp XQuery Một ví dụ đơn giản


Một số quy ước: Xét file books.xml:
❖XQuery có phân biệt chữ HOA chữ thƣờng.
❖Tên thẻ, thuộc tính, biến trong XQuery phải hợp lệ
❖Một chuỗi giá trị trong XQuery phải được đặt trong
dấu nháy kép “... “ hoặc đơn „...‟
❖Một biến trong XQuery được định nghĩa với kí tự $
trước tên của biến. Ví dụ: $book.
❖Các chú thích trong XQuery được đặt trong 2 kí tự (:
và :). Ví dụ: (:This is a recommend:).

329 330

55
Một ví dụ đơn giản ... 4.6.5. Cú pháp Xquery ...
Predicates Cú pháp tổng quát:
XQuery uses predicates to limit the extracted data from XML
documents. (for | let) duyệt qua các nút của cây xml.
The following predicate is used to select all the book elements where điều kiện lọc, sử dụng các toán
under the bookstore element that have a price element with a tử and, or.
value that is less than 30:
order by sắp xếp dữ liệu.
return Kết quả trả về.

FLWOR Đọc là flower

FOR, LET, WHERE, ORDER BY và RETURN

331 FLWOR tương tự như câu lệnh truy vấn SELECT trong SQL332

Mệnh đề for Mệnh đề for


❖ Tạo ra các bộ dữ liệu tuần tự, mỗi bộ được gán cho một giá trị ❖Cú pháp
biến điều khiển, được gọi là tuple stream for $varName [as sequenceType] [at $pos] in expr [, …]
❖ Cơ chế hoạt động của mệnh đề for khi XQuery xử lý: Trong đó,
❑ Tạo ra các bộ dự liệu theo thứ tự sequenceType: các kiểu dữ liệu được định nghĩa như
❑ Kiểm tra từng bộ dữ liệu với điều kiện trong câu lệnh element(), attribute(), node(), item(), …
FLWOR (nếu có) pos: thể hiện vị trí – thứ tự tương ứng với bộ dữ liệu đang
❑ Đưa ra kết quả trả về có thể là một bộ dữ liệu đang có hay được duyệt
trích xuất hay kết xuất của quá trình xử lý dựa trên bộ dữ expr: biểu thức Xpath
liệu tùy theo biểu thức kết quả trong mệnh đề return ❖ Ví dụ: Chọn các cuốn sách có giá >30$
❑ Ba bước trên được thực hiện cho đến khi các bộ dữ liệu
được duyệt qua hết
❑ Mệnh đề for có thể xử lý nhiều hơn một biểu thức với
nhiều biến
333 Kết quả 334

Mệnh đề let Sự khác nhau giữa for và let


❖ Ý nghĩa: tương tự như mệnh đề for nhưng các biến với ❖ for: sử dụng để duyệt ❖ let: sử dụng để duyệt
biểu thức chỉ được thực hiện duy nhất một lần lặp lại nhiều lần các nút một lần các nút của cây
Nếu như có nhiều hơn một biến khai báo thì XQuery chỉ tạo ra của cây XML. XML.
bộ dữ liệu duy nhất chứa tất cả biến đó
Xét truy vấn: Xét truy vấn:
❖ Cú pháp:
let $varName [as sequenceType] := expr [, …] for $x in (1 to 5) let $x:=(1 to 5)
Trong đó, return <test> {$x} </test> return <test> {$x} </test>
sequenceType: các kiểu dữ liệu được định nghĩa như Kết quả: Kết quả:
element(), attribute(), node(), item(), …
<test>1</test> <test>12345</test>
expr: biểu thức XPath
<test>2</test> Kết quả Tránh lặp lại cùng 1 biểu
❖ Ví dụ: được lặp
let $i := (1 to 3)
<test>3</test> thức nhiều lần.
return <oneEval>{$i}</oneEval> <test>4</test> nhiều lần
<test>5</test>
Kết quả 335 336

56
Mệnh đề where Mệnh đề order by
❖Ý nghĩa: sử dụng để xác định một hoặc nhiều điều ❖Ý nghĩa: Được sử dụng để sắp xếp các kết quả,
kiện cho dữ liệu kết quả. Tương tự mệnh đề order by trong SQL nhưng sử
Thể hiện điều kiện để lọc các kết quả của các bộ dữ dụng XPath
liệu có được trong mệnh đề for hay let, tương tự ❖Cú pháp: order by expr [ascending|descending]
như mệnh đề where trong câu lệnh SQL nhưng biểu ❖Ví dụ: Xét truy vấn
thức trong where ở XQuery chính là câu lệnh XPath for $x in doc("books.xml")/bookstore/book
❖Cú pháp: where expr order by $x/@category, $x/title
❖Ví dụ: return $x/title
Xét điều kiện: where $x/price>30 and $x/price<100 <title lang="en">Harry Potter</title>
<title lang="en">Everyday Italian</title>
Kết quả: chỉ những nút thỏa vị từ sau where mới được Kết quả
<title lang="en">Learning XML</title>
duyệt <title lang="en">XQuery Kick Start</title>
337 338

if – then – else So sánh trong XQuery


Biểu thức điều kiện trong XQuery Trong XQuery có 2 cách để so sánh giá trị:
Xét truy vấn: ❖So sánh chung: =, !=, <, <=, >, >=
for $x in doc("book.xml")/bookstore/book ❖So sánh giá trị: eq, ne, lt, le, gt, ge.
return if ($x/@category="CHILDREN") Sự khác nhau giữa 2 cách so sánh:
then <child>{data($x/title)}</child> Ví dụ:
else <adult>{data($x/title)}</adult> ⮚ $bookstore//book/@q>10
Kết quả: Trả về true nếu trong các thuộc tính của q, có một
<adult>Everyday Italian</adult> thuộc tính có giá trị lớn hơn 10.
<child>Harry Potter</child> ⮚ $bookstore//book/@q gt 10:
<adult>Learning XML</adult> Trả về true nếu q chỉ có một thuộc tính và giá trị của
<adult>XQuery Kick Start</adult> thuộc tính đó lớn hơn 10.
339 340

Một số ví dụ về XQuery Một số ví dụ về XQuery ...


Ví dụ 1 Ví dụ 2
for $i in 1 to 3 for $i in (1, 2)
return <oneEval>{$i}</oneEval> for $j in ('a', 'b')
Câu lệnh trên đang duyệt các giá trị từ 1 đến 3, mỗi lần return <oneEval>i is {$i}
duyệt một số sẽ gán số đó vào biến i and j is {$j}</oneEval>
Trong mỗi lần duyệt sẽ trả về kết quả là một node oneEval ❖ Cho i chạy từ 1 đến 2, khi i đang chạy thì thực hiện duyệt j
với giá trị biến i đang được duyệt với hai giá trị a và b để đưa ra kết quả tổng hợp từ i và j.

❖ Xquery hỗ trợ duyệt lồng nhiều cấp for $i in (1, 2),


mà không cần sử dụng nhiều lần for, $j in ('a', 'b')
chỉ cần khai báo các biến với các biểu return <oneEval>i is {$i}
thức trong mệnh đề for thì cũng cho and j is {$j}</oneEval>
kết quả tương đương.
341

57
Một số ví dụ về XQuery 4.7. ỨNG DỤNG XQuery TRONG HTML
Ví dụ 3 1.Thêm thành phần HTML vào kết quả truy vấn XQuery.
for $a in (1 to 50),$b in (2, 3, 5, 7) Xét tập tin books.xml
where $a mod $b eq 0 Ta đặt kết quả vào file HTML như sau:
return $a * $b <html>
áp dụng mệnh đề where để chọn những giá trị a chia hết cho <body>
b và đưa ra kết xuất là tích của a và b <h1>Bookstore</h1>
<ul>
{
for $x IN document(„book.xml‟)/bookstore/book
order by $x/title
return
<li> {data($x/title)}. Category: {data($x/@category)}</li>
}
</ul>
</body>
343 </html> 344

4.7. ỨNG DỤNG XQuery TRONG HTML 4.7. ỨNG DỤNG XQuery TRONG HTML...
Kết quả trả về: 2. Thêm thuộc tính của thành phần HTML trong kết quả truy
<html> vấn XQuery.
<body> <html> Chú ý: Ở đây, sử dụng thuộc
<body> tính category như 1 thuộc
<h1>Bookstore</h1> tính lớp trong HTML.
<h1>Bookstore</h1>
<ul>
<ul>
<li>Everyday Italian. Category: COOKING</li>
{
<li>Harry Potter. Category: CHILDREN</li> for $x in doc("books.xml")/bookstore/book
<li>Learning XML. Category: WEB</li> order by $x/title
<li>XQuery Kick Start. Category: WEB</li> return
</ul> <li class="{data($x/@category)}">{data($x/title)}
</body> </li>}
</html> </ul>
</body>
345 </html> 346

4.7. ỨNG DỤNG XQuery TRONG HTML

Kết quả trả về:


<html>
<body>
<h1>Bookstore</h1>
<ul>
<li class="COOKING">Everyday Italian</li>
<li class="CHILDREN">Harry Potter</li>
<li class="WEB">Learning XML</li>
<li class="WEB">XQuery Kick Start</li>
</ul>
</body>
</html>

347 348

58
BÀI TẬP VỀ XPart-XQuery

Thực hiện các thao tác FLWOR trên tài liệu CD Catalog.xml
(http://www.w3schools.com/xml/cd_catalog.xml) CHƢƠNG 6
Chú ý: có thể sử dụng EXISTDB để kiểm tra kết quả truy vấn CHUYỂN ĐỔI ĐỊNH DẠNG
của Xquery từ một file XML:
http://exist-db.org/exist/apps/homepage/index.html TÀI LIỆU XML VỚI XSLT
Bài đọc thêm: Sử dụng giao diện lập trình API của XQuery
cho Java (XQJ) để giới thiệu việc cài đặt các hàm XQuery TRANSFORM A XML DOCUMENT STYLE BY XSLT
trong môi trường Java™.
(eXtensible StyLe sheet Transformations)
http://www.ibm.com/developerworks/vn/edu/x-xqfunc/#listing6
PGS.TS. Nguyễn Mậu Hân
Khoa CNTT-ĐHKH HUẾ
nmhan@husc.edu.vn
349
350

NỘI DUNG 6.1. GIỚI THIỆU VỀ XSL

6.1. GIỚI THIỆU VỀ XSL

6.2. QUÁ TRÌNH CHUYỂN ĐỔI TRONG eXtensible StyLe sheet Transformations
XSLT
6.3. CÁC PHẦN TỬ THÔNG DỤNG
CỦA XSLT
6.3.1. Phần tử <xsl:template>
• CSS = Style Sheets for HTML
6.3.2 Phần tử <xsl:value-of> • XSL = Style Sheets for XML
6.3.2 Phần tử <xsl:for-each>
6.3.4 Phần tử <xsl:if>
6.3.5 Phần tử <xsl:choose>
6.3.6 Phần tử <xsl:sort> 351 352

6.1. GIỚI THIỆU VỀ XSL 6.1. GIỚI THIỆU VỀ XSL ...

XSLT (eXtensible StyLe sheet Transformations). XSL bao gồm 3 thành phần sau:
XSL là ngôn ngữ chuẩn dùng để chuyển đổi tài  XSLT (XSL Transformation ), ngôn ngữ dựa trên
liệu XML thành các định dạng khác như HTML, XML, để chuyển đổi một tài liệu XML thành một tài
XHTML ... và ngay cả XML liệu khác: XML, WML, HTML, XHTML
 XSL-FO (XSL Formatting Objects), ngôn ngữ dùng
Bản thân XSL cũng là một XML well-formed, một để định dạng các tài liệu XML để hiển thị
textfile có phần mở rộng *.xsl  Xpath: XSLT dùng Xpath để di chuyển trên các
nodes của XML Tree
XSLT sử dụng các biểu thức đường dẫn của
Xpath để di chuyển trên XML Tree.

353 354

59
Ví dụ:
6.1. GIỚI THIỆU VỀ XSLT
6.1.2 Khai báo
Để trình phân tích XML nhận diện được các lệnh của
XSL thì chúng ta cần phải khai báo một namespace
trong thẻ gốc của tài liệu XML. Một style sheet thường
chứa một trong hai namespace:
 Namespace nguyên thủy: http://www.w3.org/TR/WD-xsl
text file  Namespace của XSLT:
http://www.w3.org/1999/XSL/Transform
Khai báo namespace phải đặt ở đầu tài liệu xml

*.xml *.xsl
355 356

Khai báo Namespace


6.1. GIỚI THIỆU VỀ XSLT Ví dụ: xét file test.xsl của XSLT

Thẻ gốc trong tài liệu XSL thường là phần tử


xsl:stylesheet, nó chứa một hay nhiều thẻ xsl:template
Thuộc tính match=“/” của thẻ
Để tham chiếu một tài liệu XSL vào trong tài liệu XML template để chỉ node xuất phát.
ta thêm vào đầu tài liệu XML dòng:
<?xml-stylesheet type=”text/xsl” href=”URI/URL”?>
Trong đó URI/URL là địa chỉ của tài liệu XSL trên Thẻ gốc của XSLT
internet mà chúng ta muốn tham chiếu
Hoặc khai báo file test.xsl nằm ở thư mục hiện thời:
<?xml-stylesheet type=”text/xsl” href=”test.xsl”?>
357 358

Sử dụng XML parser để hiển thị kết quả 6.2. QUÁ TRÌNH CHUYỂN ĐỔI TRONG XSLT
Bằng cách thêm một hàng processing instruction xml-
stylesheet vào đầu tài liệu XML như sau:
Ví dụ chuyển một tài liệu XML thành XHTML
<?xml-stylesheet type="text/xsl" href=“Filename.xsl"?>
Giả sử ta có file catalog.xml

Ví dụ: Giả sử 2 file Order.xml và Order.xsl được lưu trữ trên


cùng một thư mục. Để hiển thị kết quả theo yêu cầu của
Order.xsl thì thêm vào đầu Order.xml như sau:

xem toàn bộ file catalog.xml ở đây


359 360

60
Kết nối file XSL Style Sheet đến tài liệu XML bằng cách thêm
dòng lệnh tham chiếu vào "catalog.xml"

tạo file XSL Style Sheet


(“cdcatalog.xsl")

361 362

Kết quả ASP chuyển XML


thành XHTML
Kết quả PHP chuyển XML
thành XHTML
363 364

6.2. QUÁ TRÌNH CHUYỂN ĐỔI TRONG XSLT 6.2. QUÁ TRÌNH CHUYỂN ĐỔI TRONG XSLT

XSLT là một tập các khuôn mẫu (template) và


cách xử lý tương ứng.
XSLT không phải là ngôn ngữ lập trình mà chỉ
định nghĩa các qui tắc chuyển đổi. Còn việc thực
File Result
hiện chuyển đổi phải nhờ một chương trình khác XML, XSL,
XSLT
Processor
Document
… HTML,..
XML Chƣơng trình (C#, VB.NET…) XML XSL
HTML
XHTML

Dữ liệu đầu vào Dữ liệu đầu ra


Cách thức hoạt động
- Chương trình sẽ duyệt tài liệu xml (duyệt cây)
- Với mỗi node khớp với khuôn mẫu định nghĩa trong file XSL,
sẽ được xử lý như định nghĩa trong file XSL 365 366

61
6.2. QUÁ TRÌNH CHUYỂN ĐỔI TRONG XSLT 6.3. CÁC PHẦN TỬ THÔNG DỤNG CỦA XSL
6.3.1 Phần tử <xsl:template>
Bƣớc 1: XSL processor chuyển đổi văn bản XML
• Mục đích:
thành cấu trúc dạng cây
Dùng để định nghĩa các template (mẫu)
Bƣớc 2: • Cú pháp:
XSL processor bắt đầu áp dụng các khuôn mẫu <xsl:template match=”(Biểu thức Xpath)”></xsl:template>
(template) được khai báo trong file XSL cho cấu trúc
cây của tài liệu XML. Thuộc tính match dùng để kết hợp một template với
Quá trình này bắt đầu từ nút root và đến các nút một nút trong xml Tree
con, khi tìm thấy nút có khai báo template trong XSL,
XSL processor sẽ áp dụng template này cho nút đó Thuộc tính match cũng có thể được dùng để xác
và kết quả thu được cũng là một cấu trúc cây nhưng định một template cho toàn bộ các nút trong cây xml
dữ liệu đã được chuyển đổi. Giá trị của thuộc tính match là một biểu thức Xpath
367 368

Ví dụ:
Minh họa phần tử <xsl:template>

<xsl:template>: dùng để định nghĩa các template


<xsl:stylesheet version = '1.0„
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
Khai báo đây là tài liệu XSLT Khi gặp những nút thỏa đk “…” thì
<xsl:template match=“…"> thực hiện những chỉ thị sau
Khai báo phần <h1>
tử template <xsl:value-of select="//title"/>
chính và cho </h1>
biết vị trí khởi <h2>
đầu là nút gốc <xsl:value-of select="//author"/>
</h2>
</xsl:template>
<xsl:template match=“…">
….. Biểu thức Xpath
</xsl:template>
</xsl:stylesheet>
*.xsl
369 370

Giải thích ví dụ
6.3.2 Phần tử <xsl:value-of> DòngVí dụ về
2: Khai báo phần
kiểu dữ tử <xsl:value-of>
liệu ra, kiểu dữ liệu ra là dưới dạng HTML
Dòng 3: Khai báo phần tử template chính và cho biết vị trí khởi đầu là nút gốc
• Mục đích: Dòng 5, 6, 7: Chọn nội dung của nút BBB thứ 1, 2, 3
rút trích nội dung nằm trong các thẻ XML và kết
xuất ra file kết quả (cũng là file xml).
Các thẻ được rút trích nội dung được xác định
thông qua thuộc tính select.
Nếu select trả về một tập các thẻ thì nội dung các
thẻ này đều được kết xuất ra file kết quả.

• Cú pháp:
<xsl:value-of select="(Biểu thức Xpath)"/>

371 372

62
Minh họa về phần tử <xsl:value-of> 6.3.2 Phần tử <xsl:for-each>

Phần tử <xsl:for-each>
<hocsinh>
<hoten>Nguyen Van A</hoten>
<mssv>0412341</mssv> • Mục đích:
</hocsinh>
 Dùng để đi qua tất cả các nút được chỉ ra trong
*.xml thuộc tính select
 for-each làm việc giống như lệnh FOR của các ngôn
ngữ lập trình.
<xsl:stylesheet….>
<xsl:template match=“/”>
<h1><xsl:value-of
<h1> </h1>
select=“//hoten”/></h1> • Cú pháp:
Nguyen Van A
<h2><xsl:value-of
<h2> select=“//mssv”/></h2>
0412341 </h2>
</xsl:template> <xsl:for-each select=”(Biểu thức Xpath)”/></xsl:for-each>
</xsl:stylesheet>

*.xsl
373 374

Dòng 4: Phần tử for-each sẽ cho phép duyệt qua hết tất cả các nút BBB Ví dụ:
DòngVí dụ về
5: Phần Phần sẽ
tử value-of tửlấy<xsl:for-each>
nội dung của nút BBB hiện thời.

375 376

Minh họa về phần tử <xsl:for-each> 6.3.4 Phần tử <xsl:if>


<xsl:for-each> Duyệt và xử lý thông tin từng nút trong tập nút kết • Mục đích:
quả đƣợc chọn ra từ thuộc tính select Dùng để kiểm tra điều kiện của một biểu thức
<root>
id=1 hoten=Nguyen Van A
logic, nếu biểu thức logic có giá trị true thì các nút
<hoten id=“1”>Nguyen Van A</hoten>
<hoten id=“2”>Nguyen Thi B</hoten>
Id=2 hoten=Nguyen Thi B bên trong phần tử if sẽ được thực hiện và ngược
</root> lại thì không thực hiện.

<xsl:stylesheet….>
• Cú pháp:
<xsl:template match=“/”>
<xsl:for-each select = “//hoten”>
<xsl:if test=”(Biểu thức điều kiện)”></xsl:if>
<xsl:text>id=</xsl:text>
<xsl:value-of select=“@id”/>  Thuộc tính test là một biểu thức điều kiện, nó có
<xsl:text>hoten=</xsl:text> thể là một biểu thức so sánh hoặc một biểu thức
<xsl:value-of select=“.”/>
</xsl:for-each> Xpath.
</xsl:template>  <xsl:if test> giống như cấu trúc if ... then trong
</xsl:stylesheet>
các ngôn ngữ lập trình
377 378

63
Ví dụ:
Minh họa về phần tử <xsl:if test>
<xsl:if test>

<root>
<value>1</value>
<value>20</value>
<value>9</value>
</root>

<xsl:stylesheet….>
<xsl:template match=“/”>
<xsl:for-each select = “//value”>
<xsl:sort data-type=“number” select=“.”/>
<xsl:value-of select=“.”/> Kết quả:
<xsl:if test=“not (position()=last())”> 1,9,20
<xsl:text>,</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
379 </xsl:stylesheet> 380

Ví dụ:
6.3.5 Phần tử <xsl:choose>
• Mục đích: Dùng để điều khiển chọn lựa.
• Cú pháp:
<xsl:choose>
<xsl:when test=”(biểu thức điều kiện)”>
......
</xsl:when>
<xsl:otherwise>
......
</xsl:otherwise>
</xsl:choose>
 </xsl:choose> giống như câu lệnh switch trong
ngôn ngữ lập trình C, các lựa chọn trong phần tử
điều khiển choose là các phần tử xsl:when và
381 382
xsl:otherwise

Minh họa phần tử <xsl:choose> 6.3.6 Phần tử <xsl:sort>


<xsl:choose> • Mục đích:
<root>
Kết quả:
<value>A</value>
<value>B</value>
30 Dùng để sắp xếp các thẻ đầu ra, nó được dùng
</root> trong phần tử <xsl:for-each>
<xsl:stylesheet….>
Thuộc tính select: dùng để xác lập phần tử dùng
<xsl:template match=“/”> để sắp xếp, thường thì nó có giá trị là biểu thức
<xsl:for-each select = “//value”> Xpath.
<xsl:choose>
<xsl:when test = “A”/>
<xsl:text>30</xsl:text> • Cú pháp:
</xsl:when>
……
</xsl:choose> <xsl:sort select=”(biểu thức xpath)”/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet> 383 384

64
Ví dụ:
Minh họa phần tử <xsl:sort>

<xsl:sort>: Thực hiện sắp xếp trên file output

<root> Nguyen Thi B


<hoten>Tran Van A</hoten> Tran Van A
<hoten>Nguyen Thi B</hoten>
</root>

<xsl:stylesheet….> <root>
<xsl:template match=“/”> <value>1</value>
<xsl:for-each select = “//hoten”> <value>9</value>
<xsl:sort order=“ascending” select=“.”/> <value>20</value>
</root>
<xsl:value-of select=“.”/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet> ?????

385 386

Minh họa phần tử <xsl:sort> Kiểm tra kết quả thực hiện của XSL (Online)
• Vào trang: ttps://www.w3schools.com/xml/xsl_intro.asp
<xsl:sort data-type>
• Chọn để vào trang:
• https://www.w3schools.com/xml/tryxslt.asp?xmlfile=cdcatalog&x
<root>
sltfile=cdcatalog
Kết quả:
<value>1</value> 1
<value>20</value> 9
<value>9</value> 20
</root>

<xsl:stylesheet….> Nếu không xác lập thì


<xsl:template match=“/”> data-type = “text”
<xsl:for-each select = “//value”>
<xsl:sort data-type=“number” select=“.”/>
<xsl:value-of select=“.”/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet> 387 388

Bài tập: CẦN QUAN TÂM THÊM

Các hàm tính toán và format số


Khai báo và sử dụng biến

Các hàm boolean


a) Tạo file Book.xml dùng để lưu trữ
thông tin về các quyển sách như
trên. Các hàm xử lý chuỗi
b) Viết file Book.xsl để in ra các cuốn
sách theo dạng sau: Các hàm sao chép node

389 390

65
Ví dụ về XSLT Giải tham khảo:
Giả sử file PTB2.xml chứa thông tin các hệ số của PT bậc 2.
Dùng XSL để đọc và giải PT với dữ liệu trong PTB2. xml

391 392

NỘI DUNG
CHƢƠNG 7: 7.1 GIỚI THIỆU VỀ CSS

ĐỊNH DẠNG TÀI LIỆU XML BẰNG 7.2 CÁC CÁCH KHAI BÁO CSS

BẢNG ĐỊNH DẠNG PHÂN TẦNG 7.3 CÚ PHÁP CỦA CSS

FORMAT A XML DOCUMENT BY CSS 7.4 TẠO BỘ CHỌN CHO BẢNG ĐỊNH
(CASCADING STYLE SHEETS) KIỂU

PGS.TS. Nguyễn Mậu Hân 7.5 TẠO LỚP ĐỊNH DẠNG


Khoa CNTT-ĐHKH HUẾ
nmhan@husc.edu.vn
7.6 TẠO ĐẶC TẢ QUY TẮC ĐỊNH DẠNG

7.1. GIỚI THIỆU VỀ CSS 7.1. GIỚI THIỆU VỀ CSS

66
7.1. GIỚI THIỆU VỀ CSS 7.1. GIỚI THIỆU VỀ CSS
CSS (Cascading Style Sheets) là file định dạng văn Ví dụ: nội dung một file CSS
bản theo tầng, là cách mà chúng ta thêm các kiểu
hiển thị (font chữ, kích thước, màu sắc, ...) cho một
trang web. Ngoài ra nó còn được dùng để định dạng
cho tài liệu XML.
CSS là một file text có phần mở rộng *.css, trong
file này chứa những câu lệnh của CSS mà không
bao gồm dữ liệu văn bản.
Sự khác biệt giữa CSS và HTML:
 HTML được sử dụng để cấu trúc nội dung.
 CSS được sử dụng để định dạng nội dung đã được cấu
trúc.

7.1. GIỚI THIỆU VỀ CSS Ví dụ 2


 Mỗi câu lệnh trong CSS sẽ định dạng một thành phần nhất Có một file “catalog.xml” Khi hiển thị nó trên trình duyệt
định của tài liệu HTML, XML như màu sắc, font chữ,...
 CSS tạo ra các kiểu dáng có thể áp dụng cho nhiều trang
Web, giúp tránh phải lặp lại việc định dạng cho các trang Web
giống nhau.
 Sử dụng kết hợp CSS với tài liệu XML
 Tạo file CSS
 Tạo tài liệu XML
 Đưa file CSS vào tài liệu XML bằng thẻ:
<?xml-stylesheet type="text/css" href=“filename.CSS"?>
Ví dụ:

Ví dụ 2 ... 7.2. Các cách khai báo CSS


Chúng ta định nghĩa một Khi Kết
đó nếu
quả ta
filekhai báo file
có định dạng CSS
CSSvào Có 3 cách để khai báo CSS trong tài liệu XML là
file “xmlcss.css” trong file XML như sau: CSS inline, CSS Internal và CSS external.
7.2.1. Khai báo CSS inline
Viết mã CSS trực tiếp trong tài liệu XML, cụ thể là
trong thuộc tính style
CSS inline chỉ có tác dụng trong thẻ được khai báo.
Ví dụ:

•Kết quả hiển thị:

67
Một số ví dụ: Nhận xét:

Ví dụ1: Đoạn mã để tạo một button (nút nhấn) có màu  Trong các ví dụ ở trên, chúng ta có thể thiết lập một
nền là tím (magenta). số thuộc tính của bất kỳ phần tử nào bằng cách đưa
•<input type="button" style="background-color:magenta" vào dòng:
value="Hello world"> style="Tên thuộc tính:<Giá trị của thuộc tính>“
•Kết quả hiển thị: Trong đó, tên thuộc tính, giá trị của thuộc tính có
Ví dụ2: Tạo một nút nhấn (Button), sao cho khi rê chuột thể tra trong bảng các thuộc tính của CSS.
đến nút đó thì con trỏ chuột có hình bàn tay ()  Có thể đưa vào một hoặc nhiều thuộc tính trong
• Chú ý rằng thuộc tính qui định chuột có kiểu hình bàn biểu thức style="...." , khi đưa nhiều thuộc tính thì
tay là "cursor:hand", các thuộc tính cách nhau bởi dấu chấm phẩy ";"
Thêm thuộc tính "cursor:hand", trong định nghĩa thẻ:  Ví dụ:
<input type ="button" style="background-color:magenta;
•<Input type = button style="cursor:hand" value="Chuột hình bàn tay">
color:white" value="Nền tím - chữ trắng">

7.2. Các cách khai báo CSS 7.2. Các cách khai báo CSS
7.2.2. Khai báo CSS Internal 7.2.3. Khai báo CSS External
Viết mã CSS trực tiếp trong tài liệu XML, cụ thể là Đây là cách khai báo CSS được sử dụng nhiều nhất.
trong thuộc tính style Phạm vi ảnh hưởng của nó đến toàn bộ website
CSS Internal có tác dụng trong tài liệu XML được CSS liên kết ngoài thực chất là một file văn bản có
khai báo. phần mở rộng là .css, nó có thể được lưu trữ trên
Ví dụ: một thư mục nào đó.
Để khai báo CSS External , ta chỉ cần tạo một
file style.css chẳng hạn, sau đó chèn đoạn code sau
trong phần <head></head> của trang web.
Ví dụ:
<link href="style.css" rel="stylesheet" type="text/css" media="screen" />

7.2. Các cách khai báo CSS 7.3. Cú pháp của CSS

Thứ tự ưu tiên trong Khai báo CSS Cú pháp tạo CSS bao gồm một bộ selector và một
khối khai báo được mô tả như sau:
Nếu một thẻ của HTML cùng thừa hưởng một thuộc
tính CSS khai báo giống nhau thì mức độ ưu tiên của
CSS trên các kiểu sẽ theo thứ tự sau: Trong đó:
1. Khai báo CSS inline  Phần chọn selector: là phần cần định dạng, thường
là thẻ HTML cần định dạng
2. Khai báo CSS internal  Phần khai báo declaration, bao gồm thuộc tính
3. Khai báo CSS external (property) và giá trị (value).
 Thuộc tính và giá trị được phân chia bởi một dấu :
4. CSS mặc định của trình duyệt và nằm trong cặp ngoặc { }. Nếu có nhiều thuộc tính
thì chúng đặt cách nhau bởi dấu ;

68
7.3. Cú pháp của CSS 7.3. Cú pháp của CSS
Ví dụ: body {color: black}
 Nếu giá trị gồm nhiều từ thì phải đặt trong cặp nháy kép
p {font-family: "sans serif"}
 Chú ý: Nếu muốn định nghĩa cho nhiều thuộc tính thì
các thuộc tính phải được phân cách nhau bởi dấu “;”.
p {text-align:center;color:red}

7.3. Cú pháp của CSS 7.3. Cú pháp của CSS

7.3. Cú pháp của CSS 7.4. TẠO BỘ CHỌN CHO BẢNG ĐỊNH DẠNG
Quy tắc tạo bộ chọn
Để chỉ ra phần tử nào cần định dạng, ta dùng bộ chọn.
Bộ chọn có tên là tên của phần tử cần định dạng
Ví dụ: paragraph {display: block;margin-top:10}
dùng để định dạng cho thẻ paragraph.

Tạo lớp định dạng


Ta có thể không cần chỉ ra tên phần tử hoặc các phần
tử theo thứ tự để tạo bộ chọn mà ta dùng lớp định
kiểu như là bộ chọn.

69
title {display: block; font-size: 36pt; font-weight: bold;text-
7.4. TẠO BỘ CHỌN CHO BẢNG ĐỊNH DẠNG 7.5. TẠO LỚP ĐỊNH DẠNG
align:center}
 Tạo lớp định dạng bằng cách đặt dấu '.' trước tên lớp- Ví dụ: Paragraph#first{text-indent:40;margin-top:30}
author{display: block; font-size: 16pt; text-align: center}
title {display: block; font-size: 36pt; font-weight: bold;text- paragraph {display: block;margin-top: 10}
align:center} Paragraph#first{text-indent:40;margin-top:30}
author{display: block; font-size: 16pt; text-align: center} <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
paragraph {display: block;margin-top: 10} <?xml-stylesheet type="text/css" href="vidu7_11.css"?>
.standout{color:cyan; background-color:coral} <document>
 Áp dụng lớp cho phần tử: <Tên_Phần_tử class="tên_lớp"> <title>GHEN</title>
Ví dụ: áp dụng lớp .standout cho phần tử title <author>Nguyen Binh</author>
<paragraph id="first">
<title class="standout"> GHEN</title>
Co nhan tinh be cua toi oi
 Chọn phần tử cần định dạng bằng ID: Có thể sử dụng giá trị ID Toi muon moi co chi mim cuoi
của phần tử để chọn phần tử cần định dạng theo cú pháp: </paragraph>
eleementName#idValue </document>

7.6 TẠO ĐẶC TẢ QUY TẮC ĐỊNH DẠNG BÀI TẬP


Tạo các phần tử khối Truy cập site:
Ten_phan_tu<display:block;margin-top:10> http://www.w3schools.com/css/default.asp
Xác định dạng văn bản Khảo sát các nội dung sau:
Thiết lập màu chữ và màu nền cho tài liệu
Thiết lập kiểu đường bao
Canh lề cho phần tử khối
Thiết lập hình nền cho phần tử khối
Thiết lập vị trí của phần tử trong tài liệu
Thiết lập kiểu danh sách liệt kê
Tạo kiểu bảng

PHỤ LỤC : BẢNG TRA CỨU CÁC THUỘC TÍNH CỦA CSS PHỤ LỤC : BẢNG TRA CỨU CÁC THUỘC TÍNH CỦA CSS
1. Các thuộc tính áp dụng cho Font chữ: 2. Các thuộc tính áp dụng cho màu và nền:
THUỘC TÍNH CÁC GIÁ TRỊ HỢP LỆ VÍ DỤ THUỘC TÍNH CÁC GIÁ TRỊ HỢP LỆ VÍ DỤ
font-family [Tên font hoặc kiểu] font-family: Verdana, color Màu color: red
Arial; background- Màu hoặc transparent background-color: yellow
font-style normal hoặc italic font-style:italic; color
font-variant normal hoặc small-caps font-variant:small- background- Địa chỉ (url) hoặc Không background-image:
caps; image đặt gì url(house.jpg)
font-weight normal hoặc bold font-weight:bold; background- repeat | repeat-x | background-repeat: no-
font-size [ xx-large | x-large | large | font-size:12pt; repeat repeat-y | no-repeat repeat
medium | small | x-small | xx- background- scroll hoặc fixed background-attachment:
small ] | [ larger | smaller ] attachment fixed
font [ font-style || font-variant || font: bold 12pt Arial; background- [ position | length ] | {1,2} background-position: top
font-weight ] ? font-size [ / position | [ top | center | bottom ] center
419 420
line-height ] ? font-family || [ left | center | right ]

70
PHỤ LỤC : BẢNG TRA CỨU CÁC THUỘC TÍNH CỦA CSS PHỤ LỤC : BẢNG TRA CỨU CÁC THUỘC TÍNH CỦA CSS
3. Các thuộc tính áp dụng cho text: 4. Các thuộc tính áp dụng cho các ô trong bảng:
THUỘC TÍNH CÁC GIÁ TRỊ HỢP LỆ VÍ DỤ THUỘC TÍNH CÁC GIÁ TRỊ HỢP LỆ VÍ DỤ
letter-spacing normal | length letter-spacing:5pt margin-top length | percentage | auto margin-top:5px
text-decoration none | underline | text-decoration:underline margin-right length | percentage | auto margin-right:5px
overline | line-through margin-bottom length | percentage | auto margin-bottom:1em
vertical-align sub | super | vertical-align:sub margin-left length | percentage | auto margin-left:5pt
text-transform capitalize | uppercase | text-transform:lowercase margin length | percentage | auto margin: 10px 5px 10px 5px
lowercase | none
padding-top length | percentage padding-top:10%
text-align left | right | center | justify text-align:center
padding-right length | percentage padding-right:15px
text-indent length | percentage text-indent:25px
padding-bottom length | percentage padding-bottom:1.2em
padding-left length | percentage padding-left:10pt; }
padding length | percentage {1,4} padding: 10px 10px 10px
421 422
15px

PHỤ LỤC : BẢNG TRA CỨU CÁC THUỘC TÍNH CỦA CSS PHỤ LỤC : BẢNG TRA CỨU CÁC THUỘC TÍNH CỦA CSS
4. Các thuộc tính áp dụng cho các ô trong bảng: 4. Các thuộc tính áp dụng cho các ô trong bảng :
THUỘC TÍNH CÁC GIÁ TRỊ HỢP LỆ VÍ DỤ THUỘC TÍNH CÁC GIÁ TRỊ HỢP LỆ VÍ DỤ
border-top-width thin | medium | thick | length border-top-width:thin border-top- none | solid | double | groove | border-top-
border-right-width thin | medium | thick | length border-right-width:medium style ridge | inset | outset style:solid
border-bottom-width thin | medium | thick | length border-bottom-width:thick
border-right- none | solid | double | groove | border-right-
border-left-width thin | medium | thick | length border-left-width:15px style ridge | inset | outset style:double
border-width thin | medium | thick | length border-width: 3px 5px 3px 5px
{1,4}
border-bottom- none | solid | double | groove | border-bottom-
style ridge | inset | outset style:groove
border-top-color color border-top-color:navajowhite
border-right-color color border-right-color:whitesmoke border-left- none | solid | double | groove | border-left-
border-bottom-color color border-bottom-color:black
style ridge | inset | outset style:none
border-left-color color border-left-color:#C0C0C0 border-style none | solid | double | groove | border-style:ridge; }
border-color color {1,4} border-color: green red white ridge | inset | outset
blue; } border-top border-width | border-style | border-top: medium
423 424
border-color outset red

PHỤ LỤC : BẢNG TRA CỨU CÁC THUỘC TÍNH CỦA CSS PHỤ LỤC : BẢNG TRA CỨU CÁC THUỘC TÍNH CỦA CSS
5. Các thuộc tính phân loại - classification Properties: 5. Các thuộc tính định vị trí cho các phần tử:
THUỘC CÁC GIÁ TRỊ HỢP VÍ DỤ
THUỘC LỆ
Có thể áp dụng cho
CÁC GIÁ TRỊ HỢP LỆ VÍ DỤ TÍNH
TÍNH
clip Toạ độ của một hình chữ clip:rect(0px 200px
display none | block | inline | list-item display:none nhật| auto 200px 0px)
list-style- disk | circle | square | decimal | list-style-type:upper- height length | auto height:200px
type lower-roman | upper-roman | alpha left length | percentage | auto left:0px
lower-alpha | upper-alpha | none overflow visible | hidden | scroll | auto overflow:scroll
list-style- url | none list-style- position absolute| relative | static position:absolute
image image:url(icFile.gif) top length | percentage | auto top:0px
list-style- inside | outside list-style- visibility visible | hidden | visibility:visible tất cả các phần tử
inherit
position position:inside
width length | percentage | width:80% DIV, SPAN and
list-style keyword || position || url list-style: square auto replaced elements
outside url z-index auto | integer z-index:-1 Các phần tử được định
425 426
display none | block | inline | list-item display:none vị tuyệt đối và tương
đối

71
PHỤ LỤC : BẢNG TRA CỨU CÁC THUỘC TÍNH CỦA CSS
6. Các thuộc tính liên quan đến in ấn - Printing Properties
THUỘC TÍNH CÁC GIÁ TRỊ HỢP LỆ VÍ DỤ CHƢƠNG 9
page-break-before auto | always || left | right page-break-

page-break-after auto | always || left | right


before:always
page-break-
TRUY XUẤT TÀI LIỆU XML
before:auto VỚI DOM
ACCESS A XML DOCUMENT BY DOM
(DOCUMENT OBJECT MODEL)

PGS.TS. Nguyễn Mậu Hân


Khoa CNTT-ĐHKH HUẾ
nmhan@husc.edu.vn
427
428

The XML DOM defines the objects and properties of all


XML elements, and the methods (interface) to access them.

In other words: The XML DOM is a standard for how to get,
change, add, or delete XML elements.

9.1. GIỚI THIỆU VỀ DOM


What is the DOM? DOM - Document Object Model ("Mô hình Đối
The DOM is a W3C standard. tượng Tài liệu")
The DOM defines a standard for accessing DOM là mô hình đối tượng cho phép thao tác trên
documents like XML and HTML: tài liệu XML từ các ngôn ngữ lập trình.
The DOM is separated into 3 different parts / levels: DOM được dùng để truy xuất các tài liệu dạng
HTML và XML.
Core DOM - standard model for any structured
document Mô hình DOM độc lập với hệ điều hành và dựa
theo kỹ thuật lập trình hướng đối tượng để mô tả
XML DOM - standard model for XML documents tài liệu
HTML DOM - standard model for HTML documents DOM có cấu trúc dữ liệu động biểu diễn thông tin
của văn bản có cấu trúc nói chung và tài liệu XML
nói riêng.

72
9.1. GIỚI THIỆU VỀ DOM

DOM bao gồm hệ thống các đối tượng thư viện cho
phép truy xuất nội dung của tài liệu XML, toàn bộ
tập tin XML trên bộ nhớ phụ.
DOM xem một tài liệu xml như là một cây, với thẻ
gốc là nút gốc.
 Mỗi thẻ bên trong tập tin XML:
 Đối tượng XmlElement của DOM
 Mỗi thuộc tính của thẻ:
 Đối tượng XmlAttribute của DOM

VÍ DỤ

Ví dụ1:
Tập tin Duong_tron.XML biểu diễn thông tin về đường
tròn C có tâm O(2,1) và bán kính R=4.
<?XML version="1.0" encoding="utf-8" ?>
<DUONG_TRON Ban_kinh="4">
<DIEM x="2“ y="1" />
</DUONG_TRON>

Tài liệu XML trên có:


1 đối tượng XmlDocument
2 đối tượng XmlElement
3 đối tượng XmlAttribute

VÍ DỤ TRÌNH PHÂN TÍCH XML DOM -


Ví dụ2: Tập tin Bang_don_gia.XML biểu diễn thông tin XML DOM có thể di chuyển trên XML Tree để truy
về bảng đơn giá thuê phòng của khách sạn. cập, chèn, xóa các nút.
<?XML version="1.0" encoding="utf-8" ?>  Trước khi muốn truy cập hoặc thao tác trên một tài
<KHACH_SAN Ten="X" Dia_chi="123 ABC"> liệu XML thì nó phải được tải vào một XML DOM
<LOAI_PHONG Ten="Loại A" Don_gia="280000" /> object.
<LOAI_PHONG Ten="Loại B" Don_gia="240000" />
<LOAI_PHONG Ten="Loại C" Don_gia="180000" /> Khi ta Load một XML file vào XML DOM, nó tự
<LOAI_PHONG Ten="Loại đặc biệt" Don_gia="320000" /> động parse XML data để tạo một Tree gồm nhiều
</KHACH_SAN> nodes với thứ bậc cha, con bên trong
Tài liệu XML trên có:  XML parser sẽ đọc XML và chuyển nó thành một
 1 đối tượng XmlDocument XML DOM object để có thể được truy cập bởi
 5 đối tượng XmlElement JavaScript,...
10 đối tượng XmlAttribute  Hầu hết trình duyệt web đều có XML parser.

73
9.2. XỬ LÝ TÀI LIỆU XML TRONG CÁC NNLT 9.3 Xử lý tài liệu XML với NNLT C#
9.2.1 Giới thiệu: 9.3.1 Giới thiệu:
 XML là một ngôn ngữ đánh dấu dùng để lưu trữ và NNLT C# cung cấp nhiều lớp đối tượng để có thể
truyền tải dữ liệu độc lập với hệ điều hành và NNLT tương tác với tài liệu XML. Trong đó, lớp
 Có hai phương pháp chính mà các NNLT sử dụng XmlDocument đại diện cho phương pháp 1 còn lớp
để xử lý tài liệu XML: XmlReader đại diện cho phương pháp 2.
 Phương pháp 1: Đọc toàn bộ tài liệu XML vào trong bộ
nhớ, sau đó nhờ bộ phân tích cú pháp biến tài liệu XML 9.3.2 Lớp XmlDocument
thành một cây theo mô hình DOM
Để nạp tài liệu XML vào trong cấu trúc DOM, chúng ta
 Phương pháp 2: Tại mỗi thời điểm bộ phân tích chỉ đọc
một hoặc một số nút liên quan đến truy vấn tạo thể hiện của lớp XmlDocument và sử dụng
 Nhận xét: Phương pháp 1 hữu ích đối với các tài liệu XML có phương thức Load hoặc LoadXml() như sau:
dung lượng nhỏ; và sẽ gây tốn bộ nhớ và hiệu năng thấp đối XmlDocument doc = new XmlDocument();
với các tài liệu XML có dung lượng lớn. Do đó, đối với tài liệu
XML có dung lượng lớn thì chúng ta nên sử dụng theo doc.Load("bookstore.xml");
phương pháp 2.

9.3 Xử lý tài liệu XML với NNLT C# Bảng các kiểu nút:
9.3.3 Một số thuộc tính trong lớp XmlDocument:
Kiểu Giá trị Mô tả
Thuộc tính Mô tả Element 1 Nút thẻ (Thẻ mở)
Name Tên của nút Attribute 2 Nút thuộc tính
Nút giá trị hay nút văn bản
InnerXml Nội dung của các thẻ con Text 3
CDATA 4 Phần CDATA
InnerText Giá trị của nút và nội dung Entity 6 Thẻ khai báo một thực thể
của các thẻ con Comment 8 Nút chú thích
Document 9 Toàn bộ tài liệu XML
NodeType Kiểu của nút DocumentType 10 Nút mô tả kiểu tài liệu
ParentNode Nút cha của nút hiện tại Whitespace 13 Thẻ chứa khoảng trắng
EndElement 15 Nút đóng (Thẻ đóng)
Kiểu của nút trong XmlDocument được quy định trong enum XmlDeclaration 17 Nút mô tả tài liệu XML
XmlNodeType. Sau đây là bảng các kiểu nút được sử dụng:

Một số phƣơng thức trong lớp XmlDocument: Một số đối tƣợng của lớp XmlNode:

Phƣơng thức Mô tả Thuộc tính Mô tả


Load(str) Nạp XML từ file Attributes Danh sách các thuộc tính của nút hiện tại
ChildNodes Danh sách các nút con của nút hiện tại
LoadXml(str) Nạp XML từ biến chứa nội dung XML
FirstChild Nút con đầu tiên của nút hiện tại
Sau khi đã nạp dữ liệu xong, chúng ta cần duyệt qua các nút InnerText Chuối chứa giá trị của nút và toàn bộ các nút con
dữ liệu để xử lý. Mỗi nút trong tài liệu có kiểu là XmlNode: của nút hiện tại
InnerXml Chuỗi chứa toàn bộ các nút con của nút hiện tại
XmlNodeList nodes = LastChild Nút con cuối cùng
doc.DocumentElement.SelectNodes("/BookStore/Book"); Name Tên nút
string title = "", price=""; NextSibling Nút anh em tiếp theo của nút hiện tại
foreach (XmlNode node in nodes){ NodeType Kiểu nút. Được quy định như bảng kiểu nút ở trên
title = node.SelectSingleNode("title").InnerText; Value Giá trị của nút. Tùy theo kiểu của nút mà giá trị
price = node.SelectSingleNode("price").InnerText; của nó cũng sẽ khác nhau
} ParentNode Nút cha của nút hiện tại

74
9.3 Xử lý tài liệu XML với NNLT C# Một số phƣơng thức của lớp XmlNode:
9.3.3 Một số thuộc tính trong lớp XmlDocument: Phƣơng thức Mô tả
Thuộc tính Mô tả SelectNodes(xPath) Lấy danh sách các nút theo biểu
thức XPath trong tham số
Name Tên của nút
SelectSingleNode(xPath) Lấy nút đầu tiên trong danh sách
InnerXml Nội dung của các thẻ con kết quả theo biểu thức XPath
InnerText Giá trị của nút và nội dung trong tham số
của các thẻ con
NodeType Kiểu của nút
ParentNode Nút cha của nút hiện tại
Kiểu của nút trong XmlDocument được quy định trong enum
XmlNodeType. Sau đây là bảng các kiểu nút được sử dụng:

9.3.4 Lớp XmlReader Một số thuộc tính trong lớp XmlReader:


Khởi tạo đối tượng XmlReader, sử dụng hàm tĩnh Create() của Thuộc tính Mô tả
lớp XmlReader: Name Tên của nút
NodeType Kiểu của nút. Bảng mô tả kiểu của nút đã trình bày ở
XmlReader xmlReader = XmlReader.Create("bookstore.xml"); phần trên
Value Giá trị của nút. Giá trị này phụ thuộc vào kiểu của nút
Khi đó, đối tượng XmlReader được chỉ định sẽ xử lý tài liệu ValueType Kiểu giá trị của nút. Mặc định là String
XML được khai báo trong tham số của hàm Create(). HasAttributes Trả về true nếu nút hiện tại có thuộc tính
Lưu ý rằng tài liệu XML sẽ không được nạp hoàn toàn vào đối HasValue Trả về true nếu nút hiện tại có chứa giá trị
tượng lúc này, mà tùy thuộc vào truy vấn, đối tượng sẽ nạp lên IsEmptyElement Trả về true nếu nút hiện tại là thẻ rỗng
kết quả tương ứng. Do đó chúng ta có thể duyệt qua các nút XmlLang Lấy giá trị của thuộc tính xmllang của nút hiện tại
bằng đoạn mã sau:
while(xmlReader.Read()){
// Duyệt các nút tại đây Kiểu của nút trong XmlDocument được quy định trong enum
} XmlNodeType. Sau đây là bảng các kiểu nút được sử dụng:
Hàm Read() ở trên sẽ tiến hành đọc một nút và trỏ đến nút tiếp
theo trong danh sách.

Một số phƣơng thức của lớp XmlReader: Bài tập

Phƣơng thức Mô tả  Cách tạo ra file XML theo mô hình DOM


Create(fileLocation) Tạo thể hiện của lớp XmlReader
Hãy viết một đoạn chương trình bằng C# để cập nhật dữ
Close() Giải phóng tài nguyên
Read() Trả về true nếu đọc một nút tiếp theo liệu cho một tài liệu xml.
thành công

75
... any questions?
HẾT CHƢƠNG 9
TRUY XUẤT TÀI LIỆU XML VỚI DOM

451

76

You might also like