Download as pdf or txt
Download as pdf or txt
You are on page 1of 175

XML VÀ ỨNG DỤNG

Tài liệu Lưu hành Nội bộ - FIT


ĐẠI HỌC PHAN THIẾT - 2019
Nội dung
1. Chương 1: Tổng quan về XML
2. Chương 2: Tạo một tài liệu XML hợp khuôn dạng
3. Chương 3: Định nghĩa kiểu tài liệu bằng DTD
4. Chương 4: Định nghĩa kiểu tài liệu bằng lược đồ XSD
5. Chương 5: Xpath
6. Chương 6: Truy vấn tài liệu XML với DOM
7. Chương 7: Định dạng tài liệu XML bằng CSS
8. Chương 8: Biến đổi tài liệu XML bằng XLST
Chương 1:

Tổng quan về XML


XML là gì?
XML là viết tắt cho chữ eXtensible Markup Language (ngôn ngữ đánh dấu)
XML là một ngôn ngữ đánh dấu tương đối mới vì nó là một phần nhỏ và đến
từ một ngôn ngữ đánh dấu già dặn tên là Standard Generalized Markup
Language (SGML). Ngôn ngữ HTML cũng dựa vào SGML.
SGML được phát minh bởi Ed Mosher, Ray Lorie và Charles F. Goldfarb của
nhóm IBM research vào năm 1969. lúc đầu nó có tên là Generalized Markup
Language (GML), và được thiết kế để dùng làm meta-language, một ngôn
ngữ được dùng để diễn tả các ngôn ngữ khác - văn phạm, ngữ vựng của
chúng ,.v.v.. năm 1986, SGML được cơ quan ISO (international standard
organisation) thu nhận làm tiêu chuẩn để lưu trữ và trao đổi dữ liệu.
Vì SGML rất rắc rối, và HTML có nhiều giới hạn nên năm 1996 tổ chức w3c
thiết kế XML. XML version 1.0 được định nghĩa trong hồ sơ February 1998
w3c recommendation, giống như một internet request for comments (rfc), là
một "tiêu chuẩn".
Một số trình soạn thảo XML
Để tạo tài liệu XML chúng ta có thể sử dụng một trình soạn thảo văn bản bất
kỳ như Notepad, WordPad (Windows) hay vi, emacs (Linux). Tập tin XML có
phần mở rộng là .xml, do đó khi lưu tập tin XML ngoài việc chỉ rõ tên tập tin
chúng ta cần nhập thêm phần mở rộng .xml.
Có rất nhiều trình soạn thảo văn phục vụ cho chức năng hiệu chỉnh nội dung
dữ liệu XML. Với những trình soạn thảo chuyên dụng này, chúng ta có thể
thực hiện được nhiều điều như hiển thị bằng màu sắc phân biệt, cho phép tìm
kiếm, tổ chức, sắp xếp dữ liệu trong file XML…
Một vài trình soạn thảo còn cho phép kiểm tra tính hợp lệ và hợp khuôn dạng
của tài liệu.
Đây là một số trình soạn thảo XML nổi tiếng có thể sử dụng:
XML Pro, XML Writer, XML Notepad, Visual Studio……
Ví dụ 1

<?xml version="1.0" encoding="UTF-8"?>


<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
Ví dụ 2
<?xml version="1.0" encoding="UTF-8"?>
<breakfast_menu>
<food>
<name>Strawberry Belgian Waffles</name>
<price>$7.95</price>
<description>
Light Belgian waffles covered with strawberries and whipped cream
</description>
<calories>900</calories>
</food>
<food>
<name>French Toast</name>
<price>$4.50</price>
<description>
Thick slices made from our homemade sourdough bread
</description>
<calories>600</calories>
</food>
</breakfast_menu>
Sự khác biệt giữa XML và HTML
XML và HTML được thiết kế với các mục tiêu khác nhau:
• XML được thiết kế để mang dữ liệu - tập trung vào dữ liệu là gì
• HTML được thiết kế để hiển thị dữ liệu
• Các thẻ XML không được xác định trước giống như các thẻ HTML
XML không sử dụng các thẻ được xác định trước
Ngôn ngữ XML không có thẻ được xác định trước.
Các thẻ trong ví dụ trên (như <to> và <from>) không được định nghĩa trong
bất kỳ tiêu chuẩn XML nào. Các thẻ này được "phát minh" bởi tác giả của tài
liệu XML.
HTML hoạt động với các thẻ được xác định trước như <p>, <h1>, <table>,
v.v.
Với XML, tác giả phải xác định cả thẻ và cấu trúc tài liệu.
XML Tree (Cây XML)
Ví dụ
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="cooking">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="children">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
XML Tree (Cây XML)
<book category="web">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
XML Tree (Cây XML)
Các tài liệu XML được hình thành dưới dạng cây phần tử .
Một cây XML bắt đầu từ phần tử gốc và phân nhánh từ phần tử gốc
đến phần tử con .
Tất cả các phần tử có thể có phần tử con (phần tử con):
Các thuật ngữ cha mẹ, con và anh chị em ruột được sử dụng để mô tả mối
quan hệ giữa các phần tử.
Cha mẹ có con. Con cái có cha mẹ. Anh, chị, em ruột là những người con
cùng cấp (anh, chị, em).
Tất cả các yếu tố có thể có nội dung văn bản (Harry Potter) và thuộc tính
(thể loại = “cooking").
Cú pháp tự mô tả
XML sử dụng nhiều cú pháp tự mô tả.
Prolog xác định phiên bản XML và mã hóa ký tự:
<?xml version="1.0" encoding="UTF-8"?>
Dòng tiếp theo là phần tử gốc của tài liệu:
<bookstore>
Dòng tiếp theo bắt đầu một phần tử <book>:
<book category="cooking">
Các phần tử <book> có 4 phần tử con : <title>, <author>, <year>,
<price>.
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
Dòng tiếp theo kết thúc phần tử sách:
</book>
Cú pháp XML
Ví dụ dưới đây là một tài liệu XML đầy đủ:
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
Tài liệu XML phải có phần tử gốc
Tài liệu XML phải có một gốc yếu tố đó là mẹ của tất cả các yếu tố khác.
Trong ví dụ này <note> là phần tử gốc:
Cú pháp XML
Prolog XML
Dòng này được gọi là XML prolog :
<?xml version="1.0" encoding="UTF-8"?>
Phần mở đầu XML là tùy chọn. Nếu nó tồn tại, nó phải xuất hiện đầu tiên
trong tài liệu.
Để tránh lỗi, bạn nên chỉ định mã hóa được sử dụng hoặc lưu các tệp XML
của bạn dưới dạng UTF-8.
UTF-8 là mã hóa ký tự mặc định cho các tài liệu XML.
Tất cả các phần tử XML phải có một thẻ đóng.
Trong XML, việc bỏ qua thẻ đóng là không hợp lệ. Tất cả các phần tử phải có
thẻ đóng:
<p>This is a paragraph.</p>
Cú pháp XML
Thẻ XML phân biệt chữ hoa chữ thường
Các thẻ XML phân biệt chữ hoa chữ thường. Thẻ <Letter> khác với thẻ
<letter>.
Thẻ mở và thẻ đóng phải được viết giống nhau:
<message>This is correct</message>
Các phần tử XML phải được lồng nhau đúng cách
Trong HTML, bạn có thể thấy các phần tử lồng nhau không đúng cách:
<b><i>This text is bold and italic</b></i>
Trong XML, tất cả các phần tử phải được lồng vào nhau đúng cách:
<b><i>This text is bold and italic</i></b>
Trong ví dụ trên, "Lồng đúng cách" chỉ đơn giản có nghĩa là vì phần tử <i>
được mở bên trong phần tử <b> nên nó phải được đóng bên trong phần tử
<b>.
Cú pháp XML
Các phần tử XML có thể có các thuộc tính trong các cặp tên / giá trị giống
như trong HTML.
Trong XML, các giá trị thuộc tính phải luôn được trích dẫn:
<note date="12/11/2007">
<to>Tove</to>
<from>Jani</from>
</note>
Cú pháp XML
Tham chiếu thực thể
Một số ký tự có ý nghĩa đặc biệt trong XML.
Nếu bạn đặt một ký tự như "<" bên trong một phần tử XML, nó sẽ tạo ra lỗi
vì trình phân tích cú pháp diễn giải nó là phần bắt đầu của một phần tử mới.
Điều này sẽ tạo ra một lỗi XML:
<message>salary < 1000</message>
Để tránh lỗi này, hãy thay thế ký tự "<" bằng một tham chiếu thực thể:
<message>salary &lt; 1000</message>
Cú pháp XML
Có 5 tham chiếu thực thể được xác định trước trong XML:
Cú pháp XML
Ghi chú trong XML:
Cú pháp để viết ghi chú trong XML tương tự như cú pháp của HTML:
<!-- This is a comment -->
Phần tử XML
Khái niệm
Phần tử XML là mọi thứ từ thẻ bắt đầu của phần tử đến thẻ kết thúc của phần
tử.
<price>29.99</price>
Một phần tử có thể chứa:
• Văn bản
• Thuộc tính
• Các yếu tố khác
• Hoặc kết hợp của những điều trên
Phần tử XML
<bookstore>
<book category="children">
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="web">
<title>Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
Phần tử XML
Trong ví dụ trên:
<title>, <author>, <year> và <price> có nội dung văn bản vì chúng chứa
văn bản (như 29,99).
<bookstore> và <book> có nội dung phần tử , vì chúng chứa các phần tử.
<book> có một thuộc tính (category = "children").
Phần tử XML trống
Một phần tử không có nội dung được cho là phần tử rỗng.
Trong XML, bạn có thể chỉ ra một phần tử rỗng như sau:
<element></element>
Bạn cũng có thể sử dụng cái gọi là thẻ tự đóng:
<element />
Phần tử XML
Quy tắc đặt tên XML
Các phần tử XML phải tuân theo các quy tắc đặt tên sau:
• Tên phần tử phân biệt chữ hoa chữ thường
• Tên phần tử phải bắt đầu bằng chữ cái hoặc dấu gạch dưới
• Tên phần tử không được bắt đầu bằng các chữ cái xml (hoặc XML, hoặc
Xml, v.v.)
• Tên phần tử có thể chứa các chữ cái, chữ số, dấu gạch ngang, dấu gạch
dưới và dấu chấm câu
• Tên phần tử không được chứa khoảng trắng
Bất kỳ tên nào cũng có thể được sử dụng, không có từ nào được đặt trước
(trừ xml).
Phần tử XML
Một số ví dụ về tên phần tử XML
Tạo tên mô tả, như sau: <person>, <firstname>, <lastname>.
Tạo tên ngắn và đơn giản, như sau: <book_title> chứ không phải như thế
này: <the_title_of_the_book>.
Tránh "-". Nếu bạn đặt tên cho một thứ gì đó là "first-name", một số phần
mềm có thể nghĩ rằng bạn muốn trừ "name" khỏi "first".
Tránh ".".
Nếu bạn đặt tên cho một thứ gì đó là "first.name", một số phần mềm có thể
nghĩ rằng "name" là thuộc tính của đối tượng "first".
Tránh ":". Dấu hai chấm được dành riêng cho không gian tên.
Các chữ cái không phải tiếng Anh như éòá hoàn toàn hợp pháp trong XML,
nhưng hãy cẩn thận nếu phần mềm của bạn không hỗ trợ chúng.
Thuộc tính XML
Các phần tử XML có thể có các thuộc tính, giống như HTML.
Các thuộc tính được thiết kế để chứa dữ liệu liên quan đến một phần tử cụ
thể.
Các thuộc tính XML phải được trích dẫn
Các giá trị thuộc tính phải luôn được trích dẫn. Có thể sử dụng dấu ngoặc đơn
hoặc dấu ngoặc kép.
Đối với giới tính của một người, phần tử <person> có thể được viết như sau:
<person gender="female">
Hoặc
<person gender='female'>
Thuộc tính XML
Nếu bản thân giá trị thuộc tính chứa dấu ngoặc kép, bạn có thể sử dụng dấu
ngoặc kép, như trong ví dụ sau:
<gangster name='George "Shotgun" Ziegler’>
Hoặc
<gangster name="George &quot;Shotgun&quot; Ziegler">
Phần tử XML so với các thuộc tính
Hãy xem các ví dụ sau:
<person gender="female">
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
Thuộc tính XML
<person>
<gender>female</gender>
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
Trong ví dụ đầu tiên, giới tính là một thuộc tính. Cuối cùng, giới tính là một
yếu tố. Cả hai ví dụ đều cung cấp thông tin giống nhau.
Không có quy tắc nào về thời điểm sử dụng các thuộc tính hoặc khi nào sử
dụng các phần tử trong XML.
Một số ví dụ: Ba tài liệu XML sau chứa thông tin giống hệt nhau:
<note date="2008-01-10"> <note>
<to>Tove</to> <date>2008-01-10</date>
<from>Jani</from> <to>Tove</to>
</note> <from>Jani</from>
</note>
Thuộc tính XML
Phần tử <date> mở rộng được sử dụng trong ví dụ thứ ba:
<note>
<date>
<year>2008</year>
<month>01</month>
<day>10</day>
</date>
<to>Tove</to>
<from>Jani</from>
</note>
Thuộc tính XML
Lưu ý
Một số điều cần xem xét khi sử dụng thuộc tính là:
• Thuộc tính không được chứa nhiều giá trị (các phần tử có thể)
• Thuộc tính không thể chứa cấu trúc cây (các phần tử có thể)
• Các thuộc tính không thể mở rộng dễ dàng (đối với các thay đổi trong
tương lai)
Không nên sử dụng cách này:
<note day="10" month="01" year="2008"
to="Tove" from="Jani" heading="Reminder"
body="Don't forget me this weekend!">
</note>
Namespace trong XML
Namespace XML cung cấp một phương pháp để tránh xung đột tên phần tử.
Xung đột tên
Trong XML, tên phần tử được xác định bởi nhà phát triển. Điều này thường
dẫn đến xung đột khi cố gắng trộn các tài liệu XML từ các ứng dụng XML
khác nhau.
Ví dụ 1:
Tài liệu XML này mang thông tin bảng HTML:
<table>
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>
Namespace trong XML
Ví dụ 2: Tài liệu XML này mang thông tin về một cái bàn (một món đồ nội
thất):
<table>
<name>African Coffee Table</name>
<width>80</width>
<length>120</length>
</table>
Nếu các đoạn XML này được thêm vào với nhau, sẽ có xung đột về tên. Cả
hai đều chứa phần tử <table>, nhưng các phần tử có nội dung và ý nghĩa
khác nhau.
Người dùng hoặc một ứng dụng XML sẽ không biết cách xử lý những khác
biệt này.
Namespace trong XML
Giải quyết xung đột tên bằng tiền tố
Có thể dễ dàng tránh xung đột tên trong XML bằng cách sử dụng tiền tố tên.
XML này mang thông tin về một bảng HTML và một phần nội thất:
<h:table> <f:table>
<h:tr> <f:name>African Coffee Table</f:name>
<h:td>Apples</h:td> <f:width>80</f:width>
<h:td>Bananas</h:td> <f:length>120</f:length>
</h:tr> </f:table>
</h:table>
Trong ví dụ trên, sẽ không có xung đột vì hai phần tử <table> có tên khác
nhau.
Namespace trong XML
Không gian tên XML - Thuộc tính xmlns
Khi sử dụng tiền tố trong XML, một không gian tên cho tiền tố phải được
xác định.
Không gian tên có thể được xác định bởi thuộc tính xmlns trong thẻ bắt đầu
của một phần tử.
Khai báo không gian tên có cú pháp sau. xmlns: prefix = " URI ".
Namespace trong XML
<root>
<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>

<f:table xmlns:f="https://www.w3schools.com/furniture">
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
Namespace trong XML
Trong ví dụ trên:
Thuộc tính xmlns trong phần tử <table> đầu tiên cung cấp cho tiền tố h: một
không gian tên đủ điều kiện.
Thuộc tính xmlns trong phần tử <table> thứ hai cung cấp cho tiền tố f: một
không gian tên đủ điều kiện.
Khi một không gian tên được xác định cho một phần tử, tất cả các phần tử
con có cùng tiền tố được liên kết với cùng một không gian tên.
Không gian tên cũng có thể được khai báo trong phần tử gốc XML:
<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="https://www.w3schools.com/furniture">
Hiển thị các tập tin XML
Hầu hết các trình duyệt sẽ hiển thị một tài liệu XML với các phần tử được mã
hóa màu.
Thường có thể nhấp vào dấu cộng (+) hoặc dấu trừ (-) ở bên trái của các
phần tử để mở rộng hoặc thu gọn cấu trúc phần tử.
Để xem nguồn XML thô, hãy thử chọn "Xem Nguồn Trang" hoặc "Xem Nguồn"
từ trình đơn trình duyệt.
Lưu ý: Trong Safari 5 (trở về trước), chỉ văn bản phần tử mới được hiển
thị. Để xem XML thô, bạn phải nhấp chuột phải vào trang và chọn "Xem
Nguồn".
Bài tập chương 1
1. Phát hiện lỗi và sửa lại sao cho đúng các file XML sau
<Product ProductID="1">Chair</Product>
<Product ProductID="2">Desk</Product>
2.
<Order>
<OrderDate>2002-6-14</OrderDate>
<Customer>Helen Mooney</Customer>
<Item>
<ProductID>2</ProductID>
<Quantity>1</Quantity>
<Item>
<ProductID>4</ProductID>
<Quantity>3</Quantity>
</Item>
</Order>
Bài tập chương 1
3.
<Order>
<OrderDate>2001-01-01</Orderdate>
<Customer>Graeme Malcolm</Customer>
</Order>
4.
<Catalog>
<Category CategoryName="Beverages">
<Product ProductID="1">
Coca-Cola
</Category>
</Product>
</Catalog>
Chương 2:

Tạo một tài liệu XML hợp khuôn dạng


Ý nghĩa của việc tạo một tài liệu XML hợp khuôn dạng
Việc tạo một tài liệu XML hợp khuôn dạng là rất quan trọng bởi các lý do sau:
- Tổ chức W3C không xem một tài liệu thuộc dạng XML trừ khi nó hợp
khuôn dạng quy định.
- Trình xử lý XML không đọc được tài liệu XML trừ khi những tài liệu này hợp
khuôn dạng.
Một tài liệu XML được gọi là hợp khuôn dạng khi nó tuân theo các quy tắc và
cú pháp của tài liệu XML. Theo W3C, tính hợp khuôn dạng được xem xét như
sau:
- Tổng thể phải phù hợp với các gọi là sản phẩm tài liệu.
- Thỏa mãn tất cả ràng buộc nêu trong đặc tả về XML.
• Phù hợp với một sản phẩm tài liệu:
Một tài liệu XML gồm 3 phần:
- Phần mở đầu (có thể rỗng).
- Phần tử gốc (có thể chứa phần tử khác).
- Phần tử còn lại (đây là phần tử tùy chọn).
• Thỏa mãn các ràng buộc: Tài liệu XML phải thoải mãn các ràng buộc hợp
khuôn dạng trong đặc tả XML.
Tạo một tài liệu XML mẫu
Trước hết, cần tạo phần khai báo XML, đây là khai báo đơn giản nhất
<?xml version=“1.0”?>
Bởi vì tất cả các tài liệu chúng ta thấy là tự chứa (không tham khảo hoặc bao
gồm các thực thể bên ngoài) nên ta tạo thuộc tính standalone là “yes” và để
biểu diễn được mọi ngôn ngữ ta dùng bộ mã UTF-8.
<?xml version=“1.0” encoding=“UTF-8” standalone=“yes”?>
Tiếp theo, them phần tử gốc vào tài liệu, ví dụ phần tử gốc là <document>
<?xml version=“1.0” encoding=“UTF-8” standalone=“yes”?>
<document>
…..
</document>
Phần tử gốc chứa các phần tử khác, ví dụ có phần tử <employee>
<?xml version=“1.0” encoding=“UTF-8” standalone=“yes”?>
<document>
<employee>

</employee>
</document>
Mỗi phần tử <employee> chứa phần tử <name>, phần tử <name> chứa hai
phần tử <firstname> và <lastname>:
<?xml version=“1.0” encoding=“UTF-8” standalone=“yes”?>
<document>
<employee>
<name>
<firstname>Tieu</firstname>
<lastname>Phong</lastname>
</name>
</employee>
</document>
Các ràng buộc hợp khuôn dạng
Các ràng buộc hợp khuôn dạng được đề cập rất ít trong đặc tả XML 1.0, vì
vậy một số ràng buộc phải thực hiện với DTD và tham khảo các thực thể.
- Bắt đầu tài liệu là khai báo XML: Ràng buộc cấu trúc hợp khuôn dạng đầu
tiên là phần khai báo XML.
- Chỉ sử dụng các tham khảo ký tự hợp lệ: Ràng buộc thứ hai là chỉ sử dụng
các tham khảo ký tự được hỗ trợ trong đặc tả XML.
- Có ít nhất một phần tử: Để được xem là một tài liệu hợp lệ thì tài liệu XML
phải bao gồm một hoặc nhiều phần tử. Đầu tiên phải là phần tử gốc.
- Các phần tử phải có cấu trúc đúng: Phải tạo thẻ mở và thẻ đóng, Ngoài ra
cặp thẻ phải có vị trí phù hợp (đúng cấp) và cùng tên.
- Sử dụng phần tử gốc chứa các phần tử khác: Một ràng buộc khác là phần
tử gốc phải chứa tất cả các phần tử khác trong tài liệu XML.
- Các phần tử phải lồng nhau đúng cấp.
- Tên thuộc tính phải là duy nhất: Không thể sử dụng cùng tên thuộc tính
nhiều
Các ràng buộc hợp khuôn dạng
- Tên thuộc tính phải là duy nhất: Không thể sử dụng cùng tên thuộc tính
nhiều hơn một lần trong cùng thẻ mở hoặc thẻ phần tử rỗng.
- Giá trị thuộc tính: Một ràng buộc khác là giá trị thuộc tính phải được đặt
trong dấu nháy kép hoặc nháy đơn. Nếu giá trị có dấu nháy kép (“) hoặc
dấu nháy đơn thì ta thay thế ký tự (“) bằng &quot; và (‘) bằng &apos; Ví
dụ, với giá trị là 50’11” thì ta viết <date time=“50&apos;11&quot;”/>
- Không sử dụng tham khảo thực thể và dấu < trong giá trị thuộc tính:
Chúng ta không được đặt tham khảo thực thể ngoại hoặc dấu < trong giá
trị thuộc tính vì trình xử lý XML không thay giá trị thuộc tính với nội dung
thực thể bên ngoài. Ví dụ, thay vì viết <project note=“This is a
<project>”/> thì ta viết <project note=“This is a &lt;project&gt;”>
- Tránh làm dụng dấu < và &: Các trình xử lý XML xem dấu < là dấu bắt
đầu thẻ và dấu & là dấu bắt đầu tham khảo thực thể vì thế chúng ta nên
tránh sử dụng các dấu này trong tài liệu.
Bài tập chương 2
1. Tạo một file XML mô tả cấu trúc thư mục windows.
2. Lỗi gì làm cho tập tin XML dưới đây không được Well-formed?
<xmlLibrary>
<play publicationYear=1898>
<title>Arms & The Man</title>
<author>Geogre Bernard Shaw</title>
<play decription> Comedy dealing the futility of war</play decription>
<play>
<play publicationYear=1950>
<title>The Mousetrap </title>
<author> Agatha Christic </author>
<play decription> A traditional whodunnit</play decription>
<play>
</xmlLibrary>
5. Bài tập chương 2
3. Tạo tập tin OrderDetail.xml 4. Tạo tập tin Customer.xml
OrderDetail 1
- OrderDate: 2006-6-6 - FirstName: Bruce
- Customer: Peter Collingwood - MiddleName:
- Item1
- LastName: Lee
- ProductID: 3
-Quantity: 3
2
-Item2 - FirstName: Long
-ProductID: 1 - MiddleName: Tieu
-Quantity: 5 - LastName: Ly
Chương 3 :

Định nghĩa kiểu tài liệu (DTD) và Kiểm tra tính


hợp lệ (valid) của XML
DTD
Khái niệm
DTD là viết tắt của cụm từ Document Type Definition
DTD xác định cấu trúc, các phần tử và thuộc tính hợp lệ của một tài liệu XML.
Tại sao sử dụng DTD?
Với một DTD, các nhóm người độc lập có thể đồng ý về một DTD chuẩn để
trao đổi dữ liệu.
Ứng dụng có thể sử dụng DTD để xác minh rằng dữ liệu XML là hợp lệ.
DTD
DTD nội
Nếu DTD được khai báo bên trong tệp XML, nó phải được bao bọc bên trong
định nghĩa <!DOCTYPE>:
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>
DTD
DTD nội
DTD ở trên được hiểu như sau:
• !DOCTYPE note xác định rằng phần tử gốc của tài liệu này là note
• !ELEMENT note xác định rằng thành phần ghi chú phải chứa bốn phần
tử: "to, from, header, body"
• !ELEMENT to xác định phần tử to thuộc loại "#PCDATA"
• !ELEMENT from xác định phần tử from thuộc loại "#PCDATA"
• !ELEMENT heading xác định phần tử tiêu đề thuộc loại "#PCDATA"
• !ELEMENT body xác định phần tử nội dung thuộc loại "#PCDATA"
DTD
DTD ngoại
Nếu DTD được khai báo trong tệp bên ngoài, định nghĩa <!DOCTYPE> phải
chứa tham chiếu đến tệp DTD:
Tài liệu XML có tham chiếu đến DTD bên ngoài
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
Và đây là tệp "note.dtd", chứa DTD:
DTD
DTD ngoại
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
DTD
DTD - Khối xây dựng XML
Các khối xây dựng của tài liệu XML
Nhìn từ quan điểm DTD, tất cả các tài liệu XML được tạo thành bởi các khối
sau:
• Thành phần
• Thuộc tính
• Thực thể
• PCDATA
• CDATA
Phần tử
Các phần tử là các khối xây dựng chính của cả tài liệu XML và HTML.
Ví dụ về các phần tử HTML là "body" và "table". Ví dụ về các phần tử XML có
thể là “note" và “message". Các phần tử có thể chứa văn bản, các phần tử
khác hoặc để trống. Ví dụ về các phần tử HTML trống là "hr", "br" và "img".
Ví dụ: <body>some text</body>
<message>some text</message>
DTD
Thuộc tính
Các thuộc tính cung cấp thêm thông tin về các phần tử.
Các thuộc tính luôn được đặt bên trong thẻ mở của một phần tử. Các thuộc
tính luôn đi kèm với các cặp tên / giá trị. Phần tử "img" sau có thông tin bổ
sung về tệp nguồn:
<img src="computer.gif" />
Tên của phần tử là "img". Tên của thuộc tính là "src". Giá trị của thuộc tính là
"computer.gif". Vì bản thân phần tử trống nên nó được đóng bởi dấu "/".
Thực thể
Một số ký tự có ý nghĩa đặc biệt trong XML, chẳng hạn như dấu bé hơn (<)
xác định phần bắt đầu của thẻ XML.
Hầu hết các bạn đều biết thực thể HTML: "&nbsp;". Thực thể "không ngắt
khoảng cách" này được sử dụng trong HTML để chèn thêm một khoảng trống
vào tài liệu. Các thực thể được mở rộng khi tài liệu được phân tích cú pháp
bởi trình phân tích cú pháp XML.
Các thực thể sau được xác định trước trong XML:
DTD
Thực thể

Thực thể Ký tự
&lt; <
&gt; >
&amp; &
&quot; “
&apos; ‘
DTD
PCDATA
PCDATA có nghĩa là dữ liệu ký tự được phân tích cú pháp.
Hãy coi dữ liệu ký tự là văn bản được tìm thấy giữa thẻ bắt đầu và thẻ kết
thúc của một phần tử XML.
PCDATA là văn bản SẼ được phân tích bởi trình phân tích cú pháp . Văn bản
sẽ được trình phân tích cú pháp kiểm tra các thực thể và đánh dấu.
Các thẻ bên trong văn bản sẽ được coi là đánh dấu và các thực thể sẽ được
mở rộng.
Tuy nhiên, dữ liệu ký tự được phân tích cú pháp không được chứa bất kỳ ký
tự &, <, hoặc> nào; những thứ này cần được biểu thị bằng & amp; & lt; và &
gt; các thực thể, tương ứng.
CDATA
CDATA có nghĩa là dữ liệu ký tự.
CDATA là văn bản sẽ KHÔNG được phân tích bởi trình phân tích cú pháp. Các
thẻ bên trong văn bản sẽ KHÔNG được coi là đánh dấu và các thực thể sẽ
không được mở rộng.
DTD
DTD – Phần tử
Trong một DTD, các phần tử được khai báo với một khai báo ELEMENT.
Khai báo các phần tử
Trong một DTD, các phần tử XML được khai báo theo cú pháp sau:
<!ELEMENT element-name category>
hoặc
<!ELEMENT element-name (element-content)>
Phần tử trống
Các phần tử trống được khai báo với từ khóa danh mục EMPTY:
<!ELEMENT element-name EMPTY>
Ví dụ:
<!ELEMENT br EMPTY>
Ví dụ XML:
<br />
DTD
Phần tử có dữ liệu ký tự được phân tích cú pháp
Các phần tử chỉ có dữ liệu ký tự được phân tích cú pháp được khai báo với
#PCDATA bên trong dấu ngoặc đơn:
<!ELEMENT element-name (#PCDATA)>
Ví dụ:
<!ELEMENT from (#PCDATA)>
Các phần tử có bất kỳ Nội dung nào
Các phần tử được khai báo với từ khóa danh mục BẤT CỨ, có thể chứa bất kỳ
kết hợp dữ liệu có thể phân tích cú pháp nào:
<!ELEMENT element-name ANY>
Ví dụ:
<!ELEMENT note ANY>
DTD
Phần tử có phần tử con (sắp xếp theo thứ tự)
Các phần tử có một hoặc nhiều phần tử con được khai báo với tên của các
phần tử con bên trong dấu ngoặc đơn:
<!ELEMENT element-name (child1)>
hoặc
<!ELEMENT element-name (child1,child2,...)>
Ví dụ:
<!ELEMENT note (to,from,heading,body)>
Khi các phần tử con được khai báo trong một chuỗi được phân tách bằng dấu
phẩy, các phần tử con phải xuất hiện theo trình tự trong tài liệu. Khai báo
đầy đủ của phần tử "note" là:
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
DTD
Khai báo phần tử chỉ xuất hiện một lần
<!ELEMENT element-name (child-name)>
Ví dụ: Khai báo phần tử con “message” phải xuất hiện một lần và chỉ một lần
bên trong phần tử “note”
<!ELEMENT note (message)>
Khai báo một lần xuất hiện tối thiểu một phần tử
<!ELEMENT element-name (child-name+)>
Ví dụ:
<!ELEMENT note (message+)>
Dấu + trong ví dụ trên cho biết rằng phần tử con "message" phải xuất hiện
một hoặc nhiều lần bên trong phần tử "note".
Khai báo Không hoặc Nhiều lần xuất hiện của một phần tử
<!ELEMENT element-name (child-name*)>
Ví dụ:
<!ELEMENT note (message*)>
Dấu * trong ví dụ trên khai báo rằng phần tử con "message" có thể xuất hiện
không hoặc nhiều lần bên trong phần tử "note".
DTD
Khai báo một phần tử không xuất hiện hoặc xuất hiện một lần
<!ELEMENT element-name (child-name?)>
Ví dụ:
<!ELEMENT note (message?)>
Dấu “?” trong ví dụ trên cho biết rằng phần tử con "message" có thể không
xuất hiện hoặc xuất hiện một lần bên trong phần tử "note".
Khai báo phần tử này xuất hiện hoặc phần tử khác xuất hiện
<!ELEMENT note (to,from,header,(message|body))>
Ví dụ trên khai báo rằng phần tử "note" phải chứa phần tử "to", phần tử
"from", phần tử "header" và phần tử "message" hoặc "body".
Khai báo nội dung hỗn hợp
<!ELEMENT note (#PCDATA|to|from|header|message)*>
Ví dụ trên cho biết rằng phần tử "note" có thể chứa không hoặc nhiều lần
xuất hiện dữ liệu ký tự được phân tích cú pháp, các phần tử "to", "from",
"header" hoặc "message".
DTD
DTD - Thuộc tính
Trong một DTD, các thuộc tính được khai báo với một khai báo ATTLIST.
Khai báo các thuộc tính
Một khai báo thuộc tính có cú pháp sau:
<!ATTLIST element-name attribute-name attribute-type attribute-
value>
Ví dụ DTD:
<!ATTLIST payment type CDATA "check">
Ví dụ XML:
<payment type="check" />

Loại thuộc tính có thể là một trong những loại sau:


DTD
Thuộc tính có thể mang các giá trị TYPE như sau:

Các giá trị DEFAULT_VALUE:


DTD
Giá trị thuộc tính mặc định
<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA "0">
Ví dụ:
<square width="100" />
Trong ví dụ trên, phần tử "square" được định nghĩa là một phần tử rỗng có
thuộc tính "width" của kiểu CDATA. Nếu không có chiều rộng nào được chỉ
định, nó có giá trị mặc định là 0.
#REQUIRED
<!ATTLIST element-name attribute-name attribute-type #REQUIRED>
Ví dụ:
<!ATTLIST person number CDATA #REQUIRED>
Ví dụ XML hợp lệ: Ví dụ XML không hợp lệ :
<person number="5677" /> <person />
Sử dụng từ khóa #REQUIRED nếu bạn không có tùy chọn cho giá trị mặc
định, nhưng vẫn muốn buộc thuộc tính có mặt.
DTD
#IMPLIED
<!ATTLIST element-name attribute-name attribute-type #IMPLIED>
Ví dụ:
DTD:
<!ATTLIST contact fax CDATA #IMPLIED>
Ví dụ XML hợp lệ:
<contact fax="555-667788" />
Ví dụ XML hợp lệ :
<contact />
Sử dụng từ khóa #IMPLIED nếu bạn không muốn buộc người tạo XML khai
báo thuộc tính mà không có tùy chọn bắt buộc cho thuộc tính đó.
DTD
#FIXED
<!ATTLIST element-name attribute-name attribute-type #FIXED
"value">
Ví dụ:
<!ATTLIST sender company CDATA #FIXED "Microsoft">
Ví dụ XML hợp lệ:
<sender company="Microsoft" />
Ví dụ XML không hợp lệ:
<sender company="W3Schools" />
Sử dụng từ khóa #FIXED khi bạn muốn một thuộc tính có giá trị cố định mà
không cho phép người tạo XML thay đổi nó. Nếu người tạo XML khai báo một
giá trị khác, trình phân tích cú pháp XML sẽ trả về một lỗi.
DTD
Giá trị thuộc tính được liệt kê
<!ATTLIST element-name attribute-name (en1|en2|..) default-value>
Ví dụ:
<!ATTLIST payment type (check|cash) "cash">
Ví dụ XML:
<payment type="check" />
hoặc
<payment type="cash" />
Sử dụng các giá trị thuộc tính được liệt kê khi bạn muốn giá trị thuộc tính là
một trong những tập hợp giá trị cố định.
DTD
DTD - Thực thể
Các thực thể được sử dụng để xác định phím tắt cho các ký tự đặc biệt.
Các thực thể có thể được khai báo bên trong hoặc bên ngoài.
Khai báo thực thể nội bộ
<!ENTITY entity-name "entity-value">
Ví dụ:
<!ENTITY writer "Donald Duck.">
<!ENTITY copyright "Copyright W3Schools.">
Ví dụ XML:
<author>&writer;&copyright;</author>
Lưu ý: Một thực thể có ba phần: dấu và (&), tên thực thể và dấu chấm phẩy
(;).
DTD
Khai báo thực thể ngoại
<!ENTITY entity-name SYSTEM "URL">
Ví dụ: Ta tạo ra một file “entityngoai.xml” với nội dung như sau:
<?xml version="1.0" encoding="utf-8"?>
"(c) EnovationSoft Corp. 2005”
Sau đó tạo file “employee.dtd” với nội dung:
<!ELEMENT document (employee)>
<!ELEMENT employee (copy)>
<!ELEMENT copy (#PCDATA)>
<!ENTITY copyright SYSTEM “entityngoai.xml ">
Cuối cùng ta tạo file “employee.xml” với nội dung:
DTD
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE document SYSTEM “employee.dtd">
<document>
<employee>
<copy>&copyright;</copy>
</employee>
</document>
Sau khi xem file “employee.xml”, trình duyệt sẽ hiển thị
DTD
Một số ví dụ về DTD
TV Schedule DTD
<!DOCTYPE TVSCHEDULE [
<!ELEMENT TVSCHEDULE (CHANNEL+)>
<!ELEMENT CHANNEL (BANNER,DAY+)>
<!ELEMENT BANNER (#PCDATA)>
<!ELEMENT DAY (DATE,(HOLIDAY|PROGRAMSLOT+)+)>
<!ELEMENT HOLIDAY (#PCDATA)>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT PROGRAMSLOT (TIME,TITLE,DESCRIPTION?)>
<!ELEMENT TIME (#PCDATA)>
<!ELEMENT TITLE (#PCDATA)>
<!ELEMENT DESCRIPTION (#PCDATA)>
<!ATTLIST TVSCHEDULE NAME CDATA #REQUIRED>
<!ATTLIST CHANNEL CHAN CDATA #REQUIRED>
<!ATTLIST PROGRAMSLOT VTR CDATA #IMPLIED>
<!ATTLIST TITLE RATING CDATA #IMPLIED>
<!ATTLIST TITLE LANGUAGE CDATA #IMPLIED>
]>
DTD
Newspaper Article DTD
<!DOCTYPE NEWSPAPER [
<!ELEMENT NEWSPAPER (ARTICLE+)>
<!ELEMENT ARTICLE (HEADLINE,BYLINE,LEAD,BODY,NOTES)>
<!ELEMENT HEADLINE (#PCDATA)>
<!ELEMENT BYLINE (#PCDATA)>
<!ELEMENT LEAD (#PCDATA)>
<!ELEMENT BODY (#PCDATA)>
<!ELEMENT NOTES (#PCDATA)>
<!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED>
<!ATTLIST ARTICLE EDITOR CDATA #IMPLIED>
<!ATTLIST ARTICLE DATE CDATA #IMPLIED>
<!ATTLIST ARTICLE EDITION CDATA #IMPLIED>
<!ENTITY NEWSPAPER "Vervet Logic Times">
<!ENTITY PUBLISHER "Vervet Logic Press">
<!ENTITY COPYRIGHT "Copyright 1998 Vervet Logic Press">
]>
Bài tập chương 3
Bài 1:
• Một chương trình quản lý thông tin sinh viên, và điểm các môn học mà họ
đăng kí lưu các thông tin sau: sinh viên gồm mã số sinh viên, họ tên sinh
viên, lớp. Một môn học mà sinh viên đăng kí học gồm có thông tin mã môn
học, tên môn học, số tín chỉ, với mỗi môn học mà sinh viên đăng kí học thì
sẽ có kết quả cuối kì chính là điểm thi mà sinh viên đạt được trong môn đó.
• Yêu cầu: Định nghĩa DTD
Bài 2
• Để quản lý điểm thi cuối kì của sinh viên, ta cần phải lưu trữ các thông tin
sau: mã số sinh viên (MSSV), tên sinh viên (TenSV), mã môn học (MaMH),
tên môn học (TenMH), và điểm thi của sinh viên (Diem).
• Yêu cầu: Định nghĩa DTD
Bài 3
• Để quản lý môn học, ta cần phải lưu trữ các thông tin sau:Mã số môn học
(MaMon), Tên môn học (TenMon), và số tín chỉ (SoTC).
• Yêu cầu: Định nghĩa DTD
Bài 4
• Mỗi đơn hàng, người ta cần lưu các thông tin sau: Mã khách hàng, tên
khách hàng, địa chỉ liên lạc và một danh sách những mặt hàng người đó
mua. Danh sách mặt hàng gồm có nhiều mặt hàng khác nhau, mỗi mặt
hàng gồm những thông tin sau: Mã mặt hàng, tên mặt hàng, số lượng,
đơn giá.
• Yêu cầu: Định nghĩa DTD
Bài 5:
• Cho cấu trúc XML lưu trữ thông tin những cuốn sách đã được xuất bản
theo từng lĩnh vực. Mỗi lĩnh vực có tên và có thể chưa có sách xuất bản
hoặc cũng có thể đã có nhiều cuốn. Mỗi cuốn sách có thông tin một tựa đề
duy nhất, một hay nhiều tác giả, mỗi tác giả lại có thông tin mã tác giả, tên
tác giả, địa chỉ, số điện thoại với mã tác giả, tên tác giả là duy nhất cho
mỗi người, địa chỉ, số điện thoại có thể không có hoặc chỉ có một thông tin
độc nhất cho mỗi người.
• Yêu cầu: Định nghĩa DTD
Chương 4:

Lược đồ XML (XML Schema)


Giới thiệu
• Vì sự phức tạp của khai báo DTD, tổ chức W3C đưa ra một giải pháp tổng
quát hơn DTD đó là khai báo và định nghĩa các phần tử trong tài liệu XML
theo lược đồ XML (XML Schema).
• Để kiểm tra tính hợp lệ của tài liệu XML bằng lược đồ XML Schema, ta
dùng các bộ kiểm tra cú pháp lược đồ (Schema Checker).
• Định nghĩa những phần tử xuất hiện trong tài liệu XML.
• Định nghĩa những thuộc tính xuất hiện trong tài liệu.
• Định nghĩa quan hệ phần tử cha con
• Định nghĩa thứ tự các phần tử con
• Định nghĩa số phần tử con
• Định nghĩa phần tử rỗng hay chứa dữ liệu text
• Định nghĩa kiểu dữ liệu của phần tử và thuộc tính
• Định nghĩa giá trị mặc định của thuộc tính và phần tử
Tại sao phải sử dụng XML Schema
• Dễ dàng để mô tả nội dung tài liệu vì dùng chính cú pháp XML để định
nghĩa.
• Dễ kiểm tra tính hợp lệ của tài liệu .
• Dễ định nghĩa về mặt dữ liệu (data facet).
• Dễ dàng định nghĩa dữ liệu mẫu (data patterns).
• Dễ chuyển đổi kiểu dữ liệu này sang kiểu dữ liệu khác.
Ví dụ: Note.xml
<?xml version="1.0"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
Đặc tả DTD
<!ELEMENT note (to, from, heading, body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
Đặc tả XSD
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com" elementFormDefault="qualified">
<xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element name="heading" type="xs:string"/>
<xs:element name="body" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
• <schema> là phần tử gốc của mọi lược đồ XML Schema.
<?xml version="1.0"?>
<xs:schema>
...
...
</xs:schema>
• Trong lược đồ XML Schema chứa một vài thuộc tính như sau:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com" elementFormDefault="qualified">
...
...
</xs:schema>
• xmlns:xs="http://www.w3.org/2001/XMLSchema“ chỉ ra các phần tử và
kiểu dữ liệu dùng trong lược đồ từ http://www.w3.org/2001/XML. Chỉ định
này bảo cho bộ kiểm tra cú pháp lược đồ rằng tất cả các phần tử dùng
trong tài liệu XML đều được khai báo trong namespace
"http://www.w3schools.com”.
Định nghĩa phần tử đơn giản (SimpleType)
• Phần tử đơn là phần tử chỉ chứa dữ liệu text, không chứa các phần tử khác
hay thuộc tính.
• Kiểu text trong XML Schema có thể là kiểu boolean, string, date…
• Cú pháp để định nghĩa một phần tử đơn:
<xs:element name="xxx" type="yyy"/>
• Trong đó xxx là tên của phần tử và yyy là kiểu dữ liệu của phần tử.
• XML schema đã xây dựng sẵn nhiều kiểu dữ liệu. Một vài kiểu dữ liệu phổ
biến:
o xs:string
o xs:decimal
o xs:integer
o xs:boolean
o xs:date
o xs:time
Ví dụ:
Trong tài liệu XML có các phần tử sau:
<lastname>Refsnes</lastname>
<age>36</age>
<dateborn>1970-03-27</dateborn>
Định nghĩa trong XML Schema như sau:
<xs:element name="lastname" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="dateborn" type="xs:date"/>
• Giá trị mặc định:
o Dùng Default: phần tử sẽ được tự động gán giá trị mặc định nếu nó
không được gán bởi giá trị khác được.
o Dùng Fixed: giá trị của phần tử sẽ được gán bằng giá trị mặc định và
không thay đổi.
Ví dụ:
<xs:element name="color" type="xs:string" default="red"/>
<xs:element name="color" type="xs:string" fixed="red"/>
Tạo các kiểu dữ liệu đơn giản
• Restriction: dùng để định nghĩa các giá trị cho phần tử hay thuộc tính
trong tài liệu XML.
• Restriction trên giá trị: Ví dụ: muốn định nghĩa một phần tử tên là AGE
và giá trị của nó chỉ nằm từ 0 đến 120.
<xs:element name="age">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="120"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
• Restriction trên một tập các giá trị: Ví dụ: định nghĩa một phần tử CAR
mà giá trị của nó nằm trong tập các giá trị sau: BMW, TOYOTA, FORD
<xs:element name=“CAR">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value=“BMW"/>
<xs:enumeration value=“TOYOTA"/>
<xs:enumeration value=“FORD”/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Với ví dụ trên có cách viết tương tự:
<xs:element name=“CAR" type="carType"/>
<xs:simpleType name="carType">
<xs:restriction base="xs:string">
<xs:enumeration value=“BMW"/>
<xs:enumeration value=“TOYOTA"/>
<xs:enumeration value=“FORD"/>
</xs:restriction>
</xs:simpleType>
Ví dụ: định nghĩa một phần tử “LETTER” mà giá trị của nó chỉ là một trong
các kí tự thường từ a đến z:
<xs:element name=“LETTER">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-z]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Ví dụ: định nghĩa một phần tử “initials” mà giá trị của nó là 3 kí tự chữ hoa a
đến z:
<xs:element name=“initials">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[A-Z][A-Z][A-Z]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Ví dụ: định nghĩa một phần tử “initials” mà giá trị của nó là 3 kí tự chữ hoa a
đến z hoặc chữ thường từ a đến z:
<xs:element name=“initials">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-zA-Z][a-zA-Z][a-zA-Z]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Ví dụ: định nghĩa một phần tử “choice” mà giá trị của nó là 3 kí tự chữ thường
từ x, y hoặc z:
<xs:element name=“choice">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[xyz]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Ví dụ: định nghĩa một phần tử “prodid” mà giá trị của nó là một số 5 chữ
số từ 0 đến 9:
<xs:element name=“prodid">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:pattern value="[0-9][0-9][0-9][0-9][0-9]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Ví dụ: định nghĩa một phần tử “letter” mà giá trị của nó là không có hoặc
là một chuỗi gồm nhiều kí tự thường từ a-z:
<xs:element name=“LETTER">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value=“([a-z])*"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Ví dụ: định nghĩa một phần tử “letter” mà giá trị của nó là một hoặc
nhiều cặp kí tự mà mỗi cặp là một kí tự thường kềm theo một kítự hoa
sau nó: (sToP, không được là STOP hay StOp):
<xs:element name=“LETTER">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value=“([a-z][A-Z])+"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Ví dụ: định nghĩa một phần tử “gender” mà giá trị của nó là một trong
hai giá trị male hoặc female:
<xs:element name=“gender">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value=“male|female"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Ví dụ: định nghĩa một phần tử “password” mà giá trị của nó bắt buộc phải
là 8 kí tự, các kí tự có thể là hoa hoặc thường từ a đến z và chữ số từ 0
đến 9:
<xs:element name=“password">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value=“[a-zA-Z0-9] {8}"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
• Restriction trên chiều dài:
Ví dụ: định nghĩa một phần tử “password” mà giá trị của nó là một chuỗi
8 kí tự
<xs:element name=“password">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:lenght value=“8“ />
</xs:restriction>
</xs:simpleType>
</xs:element>
Ví dụ: định nghĩa một phần tử “password” mà giá trị của nó là một chuỗi
>= 5 và <= 8 kí tự:
<xs:element name=“password">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="5"/>
<xs:maxLength value="8"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Định nghĩa thuộc tính
• Một phần tử đơn giản thì không có thuộc tính.
• Cú pháp định nghĩa thuộc tính:
<xs:attribute name="xxx" type="yyy"/>
• Trong đó:
o xxx là tên thuộc tính
o yyy là kiểu dữ liệu của thuộc tính
• Ví dụ: với phần tử có thuộc tính như sau:
<lastname lang="EN">Smith</lastname> thì định nghĩa thuộc tính
như sau:
<xs:attribute name="lang" type="xs:string"/>
• Chỉ định ràng buộc và trị mặc định cho thuộc tính:
o Required: yêu cầu thuộc tính phải có và được gán giá trị trong thẻ
o Optional: thuộc tính có thể có hoặc không
o Fixed: giá trị thuộc tính phải đuợc gán cố định và không thay đổi.
o Default: nếu thuộc tính không được gán giá trị thì giá trị mặc định
trong lược đồ sẽ là giá trị của thuộc tính.
• Sử dụng từ khóa use để chỉ định ràng buộc cho thuộc tính.
Ví dụ:
<xs:element name="DOCUMENT">
<xs:complexType>
<xs:sequence>
<xs:element name="Address" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string"
minOccurs="0" />
<xs:element name="Street" type="xs:string"
minOccurs="0" />
<xs:element name="City" type="xs:string"
minOccurs="0" />
</xs:sequence>
<xs:attribute name="Phone" type="xs:string"
use="optional" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
Định nghĩa phần tử phức hợp (ComplexType)
• Phần tử phức tạp là phần tử chứa các phần tử khác hay các thuộc tính.
• Có 4 loại phần tử phức tạp:
o Những phần tử rỗng
o Phần tử chứa các phần tử khác
o Phần tử chứa dữ liệu text
o Phần tử chứa cả dữ liệu text và cả các phần tử
• Ví dụ:
o Ví dụ phần tử rỗng:
<Product pid=“1234”>
o Phần tử Employee chứa các phần tử khác
<employee>
<firstname>John</firstname>
<lastname>Smith</lastname>
</employee>
o Phần tử Food chỉ chứa kiểu dữ liệu text
<food type="dessert">Ice cream</food>
o Phần tử description chứa cả text và phần tử khác
<description>It happened on <date
lang="norwegian">03.03.99</date> ....
</description>
Ví dụ:
Với phần tử employee
<employee>
<firstname>John</firstname>
<lastname>Smith</lastname>
</employee>
Ta có định nghĩa như sau:
<xs:element name="employee">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
• Phần tử rỗng:
Ví dụ 1: <product prodid="1345" />
ta định nghĩa như sau:
<xs:element name="product">
<xs:complexType>
<xs:attribute name="prodid"
type="xs:positiveInteger"/>
</xs:complexType>
</xs:element>
tương tự
<xs:element name="product" type="prodtype"/>
<xs:complexType name="prodtype">
<xs:attribute name="prodid"
type="xs:positiveInteger"/>
</xs:complexType>
• Phần tử chứa các phần tử khác:
Ví dụ: để định nghĩa phần tử person như sau:
<person>
<firstname>John</firstname>
<lastname>Smith</lastname>
</person>
ta định nghĩa như sau:
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Chú ý: thẻ <xs:sequence> để đặt thứ tự xuất hiện của các phần tử trong
tài liệu.
• Định nghĩa phần tử chứa dữ liệu text
Ví dụ:
<xs:element name="somename">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="basetype">
.... ....
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element> hoặc
<xs:element name="somename">
<xs:complexType>
<xs:simpleContent>
<xs:restriction base="basetype">
• Định nghĩa phần tử chứa dữ liệu hỗn hợp
Ví dụ: ta định nghĩa phần tử như sau:
<letter>
Dear Mr.<name>John Smith</name>.Your order
<orderid>1032</orderid>will be shipped on <shipdate>2001-07-
13</shipdate>.
</letter>
Khi đó ta định nghĩa như sau:
<xs:element name="letter">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="orderid" type="xs:positiveInteger"/>
<xs:element name="shipdate" type="xs:date"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Một số chỉ định
• Thứ tự:
o All: các phần tử con có thể xuất hiện theo thứ tự bất kì
<xs:element name="person">
<xs:complexType>
<xs:all>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:all>
</xs:complexType>
</xs:element>
o Choice: chỉ định hoặc điều này xảy ra hoặc điều khác xảy ra
<xs:element name="person">
<xs:complexType>
<xs:choice>
<xs:element name="employee" type="employee"/>
<xs:element name="member" type="member"/>
</xs:choice>
</xs:complexType>
</xs:element>
o Sequence: yêu cầu các phần tử con xuất hiện theo đúng thứ tự
• Chỉ định số lần:
o Maxoccur: Chỉ định số lần xuất hiện nhiều nhất của phần tử con.
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="full_name" type="xs:string"/>
<xs:element name="child_name" type="xs:string"
maxOccurs="10"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Ví dụ trên chỉ định rằng child_name xuất hiện ít nhất 1 lần và nhiều
nhất 10 lần
o Minoccur: Chỉ định số lần xuất hiện ít nhất của phần tử con.
• Chỉ định nhóm: có thể định nghĩa và gom các phần tử lại thành một nhóm.
Nhóm giống như biểu thức () trong DTD
• Để định nghĩa một nhóm ta dùng cú pháp sau:
<xs:group name="groupname">
...
</xs:group>
• Ví dụ muốn độc giả có thể vừa mượn sách vừa mượn tạp chí, ta gom phần tử
books và magazines vào thành một nhóm
<xs:group name=“booksandmagazines”>
<xs:element ref=“books”>
<xs:element ref=“magazines”>
</xs:group>
Bài tập chương 4
Bài 1:
Một chương trình quản lý thông tin sinh viên, và điểm các môn học mà họ
đăng kí lưu các thông tin sau: sinh viên gồm mã số sinh viên, họ tên sinh viên,
lớp. Một môn học mà sinh viên đăng kí học gồm có thông tin mã môn học, tên
môn học, số tín chỉ, với mỗi môn học mà sinh viên đăng kí học thì sẽ có kết
quả cuối kì chính là điểm thi mà sinh viên đạt được trong môn đó.
Yêu cầu: định nghĩa lược đồ XML Schema với yêu cầu như sau:
o MSSV: là một chuỗi các kí tự số có chiều dài 7 kí tự.
o Lớp của sinh viên là một trong những giá trị của tập hợp gồm các lớp
{CTK28, CTK28CD, CTK29, CTK29CD, CTK30, CTK30CD, CTK31,
CTK31CD}.
o Mã môn học là một chuỗi 4 kí tự, hai kí tự đầu là chữ cái, hai kí tự sau là
số.
o Số tín chỉ của môn học >= 1 và <=5.
o Điểm của sinh viên >=0 và <=10
Bài 2:
Mỗi đơn hàng, người ta cần lưu các thông tin sau: Mã khách hàng, tên
khách hàng, địa chỉ liên lạc và một danh sách những mặt hàng người đó
mua. Danh sách mặt hàng gồm có nhiều mặt hàng khác nhau, mỗi mặt
hàng gồm những thông tin sau: Mã mặt hàng, tên mặt hàng, số lượng, đơn
giá.
Định nghĩa XMl Schema với yêu cầu như sau:
▪ MaKH và MaMH: là một chuỗi 4 kí tự trong đó hai kí tự đầu là chữ cái,
hai kí tự sau là kí số.
▪ DiaChi: là một chuỗi nhỏ hơn 200 ký tự.
▪ Số lượng và đơn giá là kiểu số và phải là số dương.
Bài 3:
Cho cấu trúc XML lưu trữ thông tin những cuốn sách đã được xuất bản theo
từng lĩnh vực. Mỗi lĩnh vực có tên và có thể có sách xuất bản hoặc cũng có thể
đã có nhiều cuốn. Mỗi cuốn sách có thông tin một tựa đề duy nhất, một hay
nhiều tác giả, mỗi tác giả lại có thông tin mã tác giả, tên tác giả, địa chỉ, số điện
thoại với mã tác giả, tên tác giả là duy nhất cho mỗi người, địa chỉ email, số
điện thoại có thể không có hoặc chỉ có một thông tin độc nhất cho mỗi người
Hãy định nghĩa XML Schema.
▪ Mã sách và mã tác giả là một chuỗi gồm 4 kí tự trong đó hai kí tự đầu là
chữ và hai kí tự sau là số.
▪ Địa chỉ email là một chuỗi với định dạng ##@##.##.
▪ Số điện thoại là một chuỗi các kí số với định dạng sau: MaVung.SoDT
Chương 5:

XPath
Ví dụ: tập tin XML thể hiện cấu trúc ổ đĩa C
<?xml version="1.0" encoding="utf-8" ?>
<C>
<Windows>
<System>
<Driver/>
</System>
<Intenet>
Webpage.html
data.xml
</Intenet>
</Windows>
<MyDocument/>
<ProgramFiles>
<WinZip/>
<Photoshop/>
</ProgramFiles>
</C>
Định nghĩa XPath
• Ở ví dụ trên biểu diễn nội dung cấu trúc thư mục trên ổ đĩa cứng C. Trên đĩa
cứng muốn truy xuất đến một tập tin hay một thư mục nào đó trên ổ đĩa cứng
C ta dùng đường dẫn.
• Ví dụ: C:\Windows\Internet\data.xml là một đường dẫn tuyệt đối tử ổ đĩa gốc
đến file data.xml.
• Nếu bạn đang ở thư mục Windows, thì đường dẫn tương đối tham chiếu đến
file dữ liệu data.xml là \Internet\data.xml
• Nếu muốn lấy tất cả các file trong thư mục Internet ta có thể dùng kí tự đại
diện /internet/*.xml.
• Trong tài liệu XML, có thể dùng khái niệm tương tự như trong hệ thống file
của hệ điều hành thông qua Xpath.
• Tài liệu XML luôn có phần tử gốc (root). Ví dụ <C> </C> là phần tử gốc. Mọi
phần tử con đều nằm trong phần tử gốc.
• Xpath định nghĩa phần tử gốc là kí tự /.
• Tham chiếu đến một nút dữ liệu trong tài liệu XML, bạn có thể chỉ đường dẫn
tương tự như đường dẫn thư mục.
Xpath và tham chiếu đường dẫn
• Đường dẫn tuyệt đối: nếu đường dẫn bắt đầu bằng / thì có nghĩa đây là
đường dẫn tuyệt đối bắt đầu từ phần tử gốc.
Ví dụ: ta có tài liệu như sau:
<AAA>
<BBB/>
<CCC/>
<BBB/>
<BBB/>
<DDD>
<BBB/>
</DDD>
<CCC/>
</AAA>
Xpath: /AAA kết quả phần tử AAA được chọn.
Xpath: /AAA/CCC kết quả tất cả những phần tử CCC là con của phần tử
AAA được chọn.
Xpath: /AAA/DDD/BBB kết quả chọn tất cả những phần tử BBB là con của
/AAA/DDD
• Đường dẫn tổng thể: bạn sử dụng chuỗi kí tự // để tham chiếu đến tất cả
các phần tử trong tài liệu
o Ví dụ:
Xpath: //BBB kết quả chọn tất cả các phần tử BBB trong tài liệu.
Xpath: //DDD/BBB kết quả chọn tất cả những phần tử BBB là con của
phần tử DDD.
• Chọn phần tử bằng kí tự đại diện: kí tự đại diện * dùng chọn tất cả các
phần tử cùng thỏa mãn đường dẫn chỉ định.
o Ví dụ:
Xpath: /AAA/CCC/DDD/* kết quả chọn tất cả các phần tử có đường dẫn
/AAA/CCC/DDD
Xpath /*/*/*/BBB kết quả là chọn những phần tử BBB nằm ở cấp thứ 3.
Xpath: //* chọn tất cả phần tử trong tài liệu
• Chọn các phần tử theo vị trí bằng ngoặc []: bạn có thể dùng ngoặc vuông
[] để chỉ định vị trí của một phần tử XML cần chọn.
Ví dụ:
Xpath: /AAA/BBB[1]: chọn phần tử BBB đầu tiên trong nhánh AAA.
Xpath: /AAA/BBB[last()]: chỉ ra phần tử BBB cuối cùng trong nhánh
AAA.
• Chọn thuộc tính của một phần tử trong tài liệu: dùng kí tự @ để chọn hay chỉ đường
dẫn đến một thuộc tính bên trong phần tử XML.
• Ví dụ: ta có tài liệu sau:
<AAA>
<BBB id=“b1”/>
<CCC/>
<BBB id=“b2”/>
<BBB name=“bbb”/>
<DDD>
<BBB id=“b3”/>
</DDD>
<CCC/>
</AAA>
Xpath: //@id: chọn tất cả các phần tử có thuộc tính mang tên id.
Xpath: //BBB[@id]: chọn tất cả các phần tử BBBcó thuộc tính mang tên id
Xpath: //BBB[@name]: chọn tất cả thuộc tính name của phần tử BBB
Xpath: //BBB[@*]: chọn tất cả các phần tử BBB có khai báo thuộc tính.
Xpath: //BBB[not(@*)]: chọn tất cả các phần tử BBB không có khai báo thuộc
tính
• Chọn phần tử trong tài liệu dựa trên số đếm: dùng hàm count() để xác định
tiêu chuẩn lựa chọn dựa vào tổng số phần tử có mặt trong tài liệu.
Ví dụ:
Xpath: //*[count(BBB)=2]: chọn tất cả các phần tử có chứa 2 phần tử
con BBB
Xpath: //*[count(*)=2]: chọn tất cả các phần tử có 2 phần tử con.
• Chọn phần tử dựa trên tên của phần tử: có thể dựa trên tên của phần tử để
lọc ra các phần tử cần chọn.
Ví dụ:
Xpath: //*[name()=‘BBB’]: chọn các phần tử BBB trong tài liệu.
Xpath: //*[starts-with(name(), ‘B’)]: chọn tất cả các phần tử có tên bắt
đầu bằng chữ B
Xpath: //*[contains(name(), ‘C’)]: chọn các phần tử mà tên có chứa kí tự
C.
• Chọn phần tử dựa vào chiều dài thẻ: hàm string-length() trả về chiều dài
của tên thẻ, dùng hàm này để làm tiêu chuẩn chọn.
Ví dụ:
Xpath: //*[string-length(name())=3]: chọn tất cả các phần tử mà tên có
chiều dài bằng 3.
Xpath: //*[string-length(name())<3]: chọn tất cả các phần tử mà tên có
chiều dài bé hơn 3.
• Chọn nhóm các phần tử dựa trên điều kiện logic: có thể kết hợp nhiều lựa
chọn hay đường dẫn Xpath với nhau trong qua phép kết hợp bằng toán tử
|.
Ví dụ:
Xpath: //CCC | //BBB
Xpath: //AAA/EEE | //BBB
• Chỉ định phần tử con trong đường dẫn: có thể sử dụng child để chỉ định chọn
phần tử chứa phần tử con.
Ví dụ:
Xpath: /AAA tương đương //child::AAA: chọn tất cả các phần tử AAA bắt
đầu từ gốc.
Xpath: /AAA/BBB tương đương /child::AAA/child::BBB tương đương
/child::AAA/BBB
• Chọn phần tử con: toán tử descendant dùng để chọn các phần tử con.
Ví dụ:
Xpath: /descendant::* :chọn tất cả các phần tử là con của phần tử gốc.
Xpath: /AAA/BBB/descendant::* : chọn tất cả các phần tử con của
/AAA/BBB
Xpath: //CCC/descendant::* : chọn mọi phần tử là con của phần tử CCC
Xpath: //CCC/descendant::DDD : tìm phần tử DDD là con của CCC
• Chọn phần tử cha: dùng toán tử parent để chọn một phần tử là cha (một
cấp) của một phần tử chỉ định.
Ví dụ: //DDD/parent::* : chọn phần tử là cha của phần tử DDD
• Chọn các phần tử cha: dùng toán tử ancestor để chọn các phần tử trên
phần tử chỉ định 1 hay nhiều cấp.
• Chọn các phần tử cùng cấp kế tiếp: dùng toán tử following-sibling để yêu
cầu chọn chọn các phần tử cùng cấp.
Ví dụ:
Xpath: /AAA/BBB/following-sibling::*: chọn các phần tử cùng cấp tiếp
theo sau /AAA/BBB
Xpath: //CCC/following-sibling::*: chọn các mọi phần tử trong tài liệu
cùng cấp và theo sau phần tử CCC
• Dùng từ khóa preceding-sibling để chọn các phần tử cùng cấp trước phần
tử chỉ định.
• Dùng từ khóa following để chọn các phần tử theo sau phần tử chỉ.
• Dùng từ khóa preceding để chọn tất cả các phần tử đứng trước phần tử chỉ
định.
• Chọn phần tử cấp dưới và phần tử chỉ định dùng từ khóa descendant-or-
self.
• Chọn phần tử cấp trên và phần tử chỉ định dùng từ khóa ancestor-or-self.
Chương 6:

Truy xuất tài liệu XML với DOM


DOM là gì?
Khái niệm về DOM (Document Object Model):
• Mô hình đối tượng cho phép xử lý trên tài liệu XML từ các ngôn ngữ lập trình
• 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
• 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ụ
=== > Đối tượng XmlDocument của DOM
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ụ 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ương ứng 1 Đối tượng XmlDocument


2 Đối tượng XmlElement
3 Đối tượng XmlAttribute
Ví dụ 2 : Tập tin Bang_don_gia.Xml biểu diễn thông tin về bảng Đơn giá thuê
phòng của khách sạn
<?xml version="1.0" encoding="utf-8" ?>
<KHACH_SAN Ten="X" Dia_chi="123 ABC" >
<LOAI_PHONG Ten="Loại A" Don_gia="280000" />
<LOAI_PHONG Ten="Loại B" Don_gia="240000" />
<LOAI_PHONG Ten="Loại C" Don_gia="180000" />
<LOAI_PHONG Ten="Loại Đặc biệt" Don_gia="320000" />
</KHACH_SAN>
Tương ứng
1 Đối tượng XmlDocument
5 Đối tượng XmlElement
10 Đối tượng XmlAttribute
Các thao tác cơ bản
• Khai báo sử dụng thư viện DOM
Khai báo sử dụng DOM
o VB6
Sử dụng thư viện Microsoft XML, v50
Khai báo trong chức năng Project- References
o VB.NET
Sử dụng thư viện Xml
Imports System.
o Xml C#
Sử dụng thư viện Xml
using System.Xml ;
Khai báo sử dụng tài liệu Xml
Khai báo sử dụng tài liệu XML
• VB6
Khai báo Đối tượng thuộc lớp DOMDocument
Dim Tai_lieu As New DOMDocument
• VB.NET
Khai báo Đối tượng thuộc lớp XmlDocument
Dim Tai_lieu As New XmlDocument
• C#
Khai báo Đối tượng thuộc lớp XmlDocument
XmlDocument Tai_lieu = new XmlDocument ()
Đọc - Ghi tài liệu Xml
Đọc/ghi tài liệu Xml
• VB6
Đọc : Kq= Tai_lieu.Load (Ten_tap_tin)
Ghi : Tai_lieu.Save(Ten_tap_tin)
• VB.NET
Đọc : Tai_lieu.Load (Ten_tap_tin)
Ghi : Tai_lieu.Save(Ten_tap_tin)
• C#
Đọc : Tai_lieu.Load (Ten_tap_tin) ;
Ghi : Tai_lieu.Save(Ten_tap_tin) ;
Truy xuất nút gốc
Truy xuất Đến nút gốc của tài liệu XML
• VB6
Khai báo Đối tượng thuộc giao diện IXMLDOMElement và nhận Đối tượng từ
chức năng tương ứng trong Tai_lieu
Dim Goc As IXMLDOMElement
Set Goc= Tai_lieu.documentElement
• VB.NET
Khai báo Đối tượng thuộc giao diện XmlElement và nhận Đối tượng từ chức
năng tương ứng trong Tai_lieu
Dim Goc As XmlElement
Goc=Tai_lieu.DocumentElement
• C#
Khai báo Đối tượng thuộc giao diện XmlElement và nhận Đối tượng từ chức
năng tương ứng trong Tai_lieu
XmlElement Goc ;
Goc=Tai_lieu.DocumentElement;
Truy xuất đến nút con trực tiếp của một nút
• VB6
Khai báo Đối tượng Nut_con thuộc giao diện IXMLDOMElement và nhận Đối
tượng từ chức năng tương ứng của Nut_cha
Dim Nut_con As IXMLDOMElement
Set Nut_con= Nut_cha.selectSingleNode(Ten_nut_con)
• VB.NET
Khai báo Đối tượng Nut_con thuộc giao diện XmlElement và nhận Đối tượng từ
chức năng tương ứng của Nut_cha
Dim Nut_con As XmlElement
Nut_con= Nut_cha.SelectSingleNode(Ten_nut_con)
• C#
Khai báo Đối tượng Nut_con thuộc giao diện XmlElement và nhận Đối tượng từ
chức năng tương ứng của Nut_cha
XmlElement Nut_con ;
Nut_con= Nut_cha.SelectSingleNode(Ten_nut_con) ;
Truy xuất thuộc tính của nút
Truy xuất Đến thuộc tính của một nút
• VB6
Nhận giá trị :
Gia_tri=Nut.getAttribute(Ten_thuoc_tinh)
Cập nhật/bổ sung thuộc tính với giá trị
Nut.setAttribute Ten_thuoc_tinh, Gia_tri
• VB.NET
Nhận giá trị :
Gia_tri=Nut.GetAttribute(Ten_thuoc_tinh)
Cập nhật/bổ sung thuộc tính với giá trị
Nut.SetAttribute (Ten_thuoc_tinh, Gia_tri)
• C#
Nhận giá trị : // Nhận một số nguyên
Gia_tri=int.Parse(Nut.GetAttribute(Ten_thuoc_tinh)) ;
Cập nhật/bổ sung thuộc tính với giá trị
Nut.SetAttribute(Ten_thuoc_tinh, Gia_tri.ToString()) ;
Truy xuất nội dung của nút
• VB6
Nhận nội dung :
Gia_tri=Nut.nodeValue
Cập nhật nội dung
Nut.nodeValue=Gia_tri
• VB.NET
Nhận nội dung :
Gia_tri=Nut.InnerText
Cập nhật nội dung
Nut.InnerTextt=Gia_tri
• C#
Nhận nội dung : // Nhận số thực
Gia_tri=Double.Parse(Nut.InnerText);
Cập nhật nội dung
Nut.InnerTextt=Gia_tri.ToSstring();
Tạo nút mới
• VB6
Khai báo Đối tượng Nut thuộc giao diện IXMLDOMElement và nhận Đối
tượng từ chức năng tương ứng của Tai_lieu
Dim Nut As IXMLDOMElement
Set Nut= Tai_lieu.CreateElement(Ten_nut)
• VB.NET
Khai báo Đối tượng Nut thuộc giao diện XmlElement và nhận Đối tượng từ
chức năng tương ứng của Tai_lieu
Dim Nut As XmlElement
Nut= Tai_lieu.CreateElement(Ten_nut)
• C#
Khai báo Đối tượng Nut thuộc giao diện XmlElement và nhận Đối tượng từ
chức năng tương ứng của Tai_lieu
XmlElement Nut ;
Nut= Tai_lieu.CreateElement(Ten_nut) ;
Bổ sung nút con vào nút cha
• VB6
Nut_cha.appendChild Nut_con
• VB.NET
Nut_cha.AppendChild( Nut_con)
• C#
Nut_cha.appendChild (Nut_con);
Chương 7:

Định dạng tài liệu XML dùng bảng định


kiểu (CSS)
Ta có một file data.xml như sau:
<?xml version="1.0" encoding="utf-8" ?>
<document>
<title>Giáo trình XML</title>
<author>Nguyễn Thiện Bằng</author>
<paragraph>
Chào mừng các bạn đến với XML. XML là một ngôn ngữ dùng để
quản lý dữ liệu ở hình thức ngắn gọn, dễ dàng cho việc quản lý.
</paragraph>
<paragraph>
Thuật ngữ đánh dấu nói đến các mã hay các dấu hiệu bạn đưa
vào một tài liệu để chỉ ra cách hiển thị dữ liệu cho tài liệu đó.
</paragraph>
</document>
Dùng trình duyệt hiển thị tài liệu data.xml:
Giới thiệu về CSS
• CSS được chuẩn hóa bởi W3C, có 3 cấp CSS có sẵn: CSS1, CSS2, CSS3.
CSS1 có tất cả những gì cần cho hiển thị tài liệu XML.
• Các trình duyệt IE hỗ trợ rất tốt cho CSS1.
• CSS chủ yếu dùng bảng định kiểu. Bảng định kiểu là tập hợp các quy tắc về
kiểu chỉ ra các định dạng phần tử.
• Ví dụ: Để chỉ ra quy tắc cho phần tử <title> là chữ đậm, cỡ chữ 36, canh
giữa ta định nghĩa CSS như sau:
title {display:block; font-size: 36pt; font-weight: bold; text-align: center;}
Trong đó: title được gọi là bộ chọn. Dislpay, font-size, font-weight,text-
align là thuộc tính CSS
Tạo bảng định kiểu cho ví dụ trên như sau:
title
{
display:block;
font-size: 36pt;
font-weight: bold;
text-align:center;
}
author
{
display:block;
font-size:16pt;
text-align:center;
text-decoration:underline
}
paragraph
{
display:block;
margin-top:10
}
Hiển thị trên trình duyệt ví dụ trên khi kết hợp với bảng định kiểu CSS:
Kết hợp CSS vào tài liệu XML
• Có hai cách để đưa CSS vào tài liệu HTML: dùng bảng định kiểu chung với
tài liệu HTML hoặc dùng bảng định kiểu lưu thành một file riêng biệt với
HTML.
• Với XML thì chỉ có một cách đưa CSS vào tài liệu là lưu thành tập tin riêng và
đưa vào tài liệu XML chỉ thị xử lý như sau:
<?xml-stylesheet type=“text/css” href=URI?>
Ví dụ trước,chỉ thị xử lý trong tài liệu XML là:
<?xml-stylesheet type=“text/css” href=“data.css”?>
Tạo bộ chọn cho bảng định kiểu
• Quy tắc tạo bộ:
o Để chỉ ra phần tử nào muốn định dạng bạn dùng bộ chọn trong bảng
định kiểu CSS. Bộ chọn có tên là tên phần tử bạn muốn định kiểu.
Ví dụ: đặc tả title như sau:
title { display:block; font-size: 36pt; font-weight: bold; text-align:center;}
o Nếu các phần tử có cùng đặc tả giống nhau, bạn có thể nhóm chúng lại
và phân cách bằng dấu “,”.
Ví dụ: giả sử title và book có cùng đặc tả
title, book { display:block; font-size: 36pt; font-weight: bold; text-
align:center;}
• Tạo lớp định kiểu:
o 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. Thay vào đó bạn dùng định nghĩa lớp định kiểu. Tạo lớp bằng
cách có dấu “.” trước tên lớp.
Ví dụ: trong file data.css, ta định nghĩa lớp standout như sau:
.standout { color:cyan; background-color: coral}
Áp dụng lớp vào trong phần tử title của tài liệu data.xml như sau:
<title class=“standout”> Giáo trình XML</title>
Kết quả khi duyệt:
• Định dạng bằng ID:
Ngoài cách tạo lớp định kiểu ta còn có thể chọn phần tử cần định dạng
bằng định danh ID và sử dụng giá trị ID đó cho phần tử.
Cú pháp: elementName#idValue
Ví dụ: trong ví dụ trên, trong file data.css ta định nghĩa paragraph như sau:
#first{text-indent:40; margin-top: 30}
trong tài liệu data.xml ta sửa nhưsau:
<paragraph id=“first”> ..</paragraph>
Chương 8:

Biến đổi tài liệu XML bằng XLST


Giới thiệu
• XSL: là ngôn ngữ định kiểu mở rộng
• Tương tự như CSS, XSL thực hiện nhiệm vụ biến đổi dữ liệu của tài liệu
XML để hiển thị phía người dùng.
• XSL phân ra làm hai nhánh:
o Ngôn ngữ XML chuyển dịch gọi là XSLT.
o Một nhánh khác của XSL đó là chuyên về định dạng hay còn gọi là XSL
FO (Formating Object). XSL FO cung cấp các thuộc tính thiết lập font
chữ, màu sắc, hình ảnh…
• Một tài liệu XSL phải được viết theo đúng cú pháp và hợp khuôn dạng với
quy tắc XML.
Tài liệu XSLT
• Tài liệu XSLT, dữ liệu đầu vào là một tập các node. Có 7 loại node mà XSL
có thể nhận dạng chuyển dịch:
o Gốc tài liệu (Document Root)
o Thuộc tính (Attribute).
o Chú thích (Comment).
o Phần tử (Element).
o Không gian tên (Namespace).
o Chỉ thị xử lý (Processing Instruction).
o Văn bản (Text).
• Khi bộ chuyển dịch XSLT được gọi, nó sẽ thực hiện hai thao tác:
o Đọc các chỉ thị so khớp trong tài liệu XSL
o Truy tìm dữ liệu trong tài liệu XML đặt vào tương ứng.
• Quá trình truy tìm dữ liệu trong tài liệu XML sẽ được duyệt bắt đầu từ phần
tử gốc.
• Ví dụ:
<?xml version="1.0" encoding="UTF-8" ?>
<stylesheet version="1.0"
xmlns="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<HTML>
This is XML Root
</HTML>
</xsl:template>
</stylesheet>
Chỉ định mẫu so khớp
• Thuộc tính so khớp Match: dùng để yêu cầu một thẻ lệnh thực hiện theo
một điều kiện dữ liệu thỏa mãn nào đó.
Các thuộc tính so khớp:
o <xsl:apply-template>
o <xsl:value-of>
o <xsl:for-each>
o <xsl:copy-of>
o <xsl:sort>
So khớp phần tử gốc (matching root)
• Phần tử gốc của XML được so khớp bằng kí tự ‘/’.
Ví dụ:
<xsl:template match=“/”>
<HTML>
<xsl:apply-templates/>
</HTML>
</xsl:template>
So khớp phần tử (matching element)
• Ta có thể tìm và so khớp một phần tử đơn giản bằng cách chỉ định tên của
phần tử đó.
Ví dụ:
<xsl:template match=“CUTOMER”>
<HTML>
<xsl:apply-template/>
</HTML>
</xsl:template>
So khớp các phần tử con
• Ta dùng đường dẫn Xpath để biểu diễn đường dẫn đến các node con trong
tài liệu XML.
• Ví dụ: Để so khớp và chọn phần tử FISRT_NAME và LAST_NAME (trong
vidu.xml):
<xsl:template match=“DOCUMENT/CUSTOMER/NAME”>
<p> <xsl:value-of select=“FIRST_NAME”/></p>
<p> <xsl:value-of select=“LAST_NAME”/></p>
</xsl:template>
Dùng kí tự “.” trong select để yêu cầu thẻ <xsl:value-of> chọn dữ liệu của
node hiện hành.
So khớp thuộc tính
Ngoài việc lấy nội dung dữ liệu text của một phần tử, có thể lấy thuộc tính bằng
kí hiệu so khớp @.
Ví dụ:
<xsl:template match=“DOCUMENT”>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match=“CUSTOMER”>
<p> <xsl:apply-templates select=“NAME”> </p>
<p> <xsl:value-of select=“DATE”> </p>
<p> <xsl:value-of select=“@TYPE”/> </p>
</xsl:template>
<xsl:template match=“NAME”>
<xsl:value-of select=“FIRST_NAME”/>
<xsl:value-of select=“LAST_NAME”/>
</xsl:template>
So khớp định danh ID của phần tử
Mỗi phần tử trong tài liệu XML có thể mang một thuộc tính là định danh duy
nhất. Ta có thể dựa vào định danh này để xác định và chọn phần tử
Ví dụ:
<xsl:template match=“id(‘elementID’)”>
<h3> <xsl:value-of select=“.”/> </h3>
</xsl:template>
So khớp dòng chú thích
Ta cũng có thể tìm và trích nội dung dòng chú thích trong tài liệu XML bằng
biểu thức so khớp comment() trong XSL.
Ví dụ: Kết quả:
<library>
<book> Tai lieu XML
<title>Tai lieu XML </title>
<author> aaa </author> aaa
</book>
<!--Day la sach XML --> <COMMENT>
</library> Day la sach XML
Ta có thể rút trích chú thích như sau:
<xsl:template match=“library”> </COMMENT>
<html>
<xsl:apply-templates/>
</html>
</xsl:template>
<xsl:template match=“comment()”>
<COMMENT> <xsl:value-of select=“.”/> </COMMENT>
</xsl:template>
Sử dụng toán tử OR
• Dùng toán tử OR để chỉ điều kiện hợp.
• Ví dụ: Để so khớp phần tử mang tên CUSTOMER hoặc BUYER ta dùng toán
tử OR như sau:
<xsl:template match=“DOCUMENT”>
<html>
<xsl:apply-templates/>
</html>
</xsl:template>
<xsl:template match=“CUSTOMER|BUYER”>
<p>
<xsl:apply-templates/>
</p>
<xsl:/template>
Kiểm tra so khớp bằng biểu thức []
• Có thể dùng biểu thức [] để kiểm tra xem một điều kiện nào đó là true hay
false.
o Giá trị thuộc tính trong một chuỗi.
o Giá trị một phần tử.
o Kiểm tra một phần tử có chứa thuộc tính hay phần tử con khác hay
không.
o Vị trí của một nút dữ liệu.
• Ví dụ:
o So khớp phần tử book chứa phần tử con title ta dùng:
<xsl:template match=“book[title]”>
o So khớp phần tử book chứa thuộc tính state mang giá trị “yes” hay
không ta dùng:
<xsl:template match=“book[@state=‘yes’]”
Thuộc tính Select
• Phần tử <xsl:value-of > dùng để lấy ra nội dung một mục dữ liệu trong tài
liệu XML.
• Ta có thể dùng thuộc tính select để chọn chính xác một mục dữ liệu.
• Thuộc tính select yêu cầu một đường dẫn Xpath đến phần tử hay thuộc
tính được chọn.
• Ví dụ:
In ra vị trí xuất hiện của
<xsl:template match=“book”> node trong tài liệu
<p>
<xsl:value-of select=“position()”/>
<xsl:value-of select=“title”/>
</p>
</xsl:template>
Thay đổi cấu trúc tài liệu
• Tạo các mẫu thuộc tính: giả sử ta muốn lấy dữ liệu từ các node <title> và
<author> gán thành thuộc tính ta làm như sau:
<xsl:template match=“book”>
<book title=“{title}” author=“{author}”/>
</xsl:template>
Khi đó chuyển dịch sau cùng của tài liệu:
<book title=“Tài liệu XML” author=“aaa”/>
• Sắp xếp các phần tử dữ liệu: ta dùng <xsl:sort> cho phép chọn một mục
dữ liệu để sắp xếp thông qua thuộc tính select.
Ví dụ:
<table border="1" width="44%" id="table1">
<tr>
<td align="center"><b>Title</b></td>
<td align="center"><b>Author</b></td>
</tr>
<xsl:apply-template>
<xsl:sort select=“title”/>
</xsl:apply-template>
</table>
<xsl:template match=“book”>
<tr>
<td><xsl:value-of select=“title“/></td>
<td><xsl:value-of select=“author”/></td>
</tr>
</xsl:template>
• Để phát biểu một điều kiện lựa chọn ta sử dụng xsl:if. Để sử dụng xsl:if, ta
đặt thuộc tính test của nó bằng một biểu thức kiểm tra có giá trị true hoặc
false.
Ví dụ:
<book>
<title> aaa </title>
<author> bbb </author>
<price> 10 </price>
</book>
<book>
<title> ccc </title>
<author> ddd </author>
<price> 15 </price>
</book>
Ta muốn lấy những phần tử sách mà giá >10 (price>10)
<xsl:for-each select=“book">
<xsl:if test="price&gt;10">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="author"/></td>
</tr>
</xsl:if>
</xsl:for-each>
• XSL còn cung cấp cho ta phần tử điều khiển lựa chọn <xsl:choose> tương tự
như lệnh switch .. Case trong lập trình C.
Ví dụ:
<xsl:for-each select=“book">
<tr>
<td><xsl:value-of select="title"/></td>
<xsl:choose>
<xsl:when test="price &gt; 10">
<td bgcolor="#ff00ff">
<xsl:value-of select=“author"/>
</td>
</xsl:when>
<xsl:when test="price &gt; 9">
<td bgcolor="#cccccc">
<xsl:value-of select=“author"/></td>
</xsl:when>
<xsl:otherwise>
<td><xsl:value-of select=“author"/></td>
</xsl:otherwise>
</xsl:choose>
</tr>
</xsl:for-each>
Bài tập chương 8
Cho tài liệu XML có nội dung như sau
<TaiLieu>
<TenKhoa>Khoa Công nghệ thông tin</TenKhoa>
<DiaChi>225 Nguyễn Thông, Phú Hài, Thành phố Phan Thiết, Bình Thuận</DiaChi>
<DienThoai>076 253 8686 - (0252) 628 3838</DienThoai>
<DanhSachSV>
<SinhVien MaSV="0713123">
<Ten>Quách Tĩnh</Ten>
<GioiTinh>Nam</GioiTinh>
<NgaySinh>10/10/1999</NgaySinh>
</SinhVien>
<SinhVien MaSV="0713234">
<Ten>Mộ Dung Phục</Ten>
<GioiTinh>Nam</GioiTinh>
<NgaySinh>12/01/2000</NgaySinh>
</SinhVien>
<SinhVien MaSV="0713125">
<Ten>Tiểu Long Nữ</Ten>
<GioiTinh>Nữ</GioiTinh>
<NgaySinh>08/10/2001</NgaySinh>
</SinhVien>
<SinhVien MaSV="0713126">
<Ten>Trương Tam Phong</Ten>
<GioiTinh>Nam</GioiTinh>
<NgaySinh>05/05/2002</NgaySinh>
</SinhVien>
<SinhVien MaSV="0713127">
<Ten>Đoàn Dự</Ten>
<GioiTinh>Nam</GioiTinh>
<NgaySinh>02/02/2000</NgaySinh>
</SinhVien>
</DanhSachSV>
</TaiLieu>
Yêu cầu:
Hiển thị DSSV như hình dưới

You might also like