Phần 2 của bài giảng Chuyên đề công nghệ XML và ứng dụng tiếp tục cung cấp cho học viên những nội dung về: lược đồ XML; khai báo phần tử trong XML Schema; DOM và xử lý XML với JavaScript; phân tích nội dung và kiểu dữ liệu của nút; phân tích trực tiếp toàn bộ dữ liệu XML;... Mời các bạn cùng tham khảo!
Trang 1Chương 5 LƯỢC ĐỒ XML
Mục tiêu học tập: Sau khi học xong chương này người học sẽ:
- Hiểu được lược đồ XML là gì, lược đồ theo chuẩn W3C
- Định nghĩa được kiểu dữ liệu cho các phần tử trong lược đồ (kiểu đơn giản
và kiểu phức hợp)
- Ứng dụng được lược đồ vào tài liệu XML
Tóm tắt chương
Để tài liệu XML của chúng ta hợp lệ, chúng ta phải định nghĩa kiểu tư liệu cho
các phần tử Chúng ta có thể sử dụng khai báo DTD cho mục đích này, tuy nhiên DTD
không phải là cách duy nhất Định nghĩa kiểu tư liệu còn có thể dựa vào lược đồ
(schema) Chương này chúng ta sẽ tìm hiểu khái niệm và cách sử dụng lược đồ để khai
báo kiểu tư liệu cho các phần tử thay cho định nghĩa DTD
5.1 Tại sao chúng ta nên dùng XML Schema?
Xuất phát từ những hạn chế của DTD như: DTD sử dụng cú pháp khác so với
cú pháp dùng trong trang XML làm cho người dùng phải nhớ nhiều cú pháp; DTD chỉ
hỗ trợ được 10 kiểu dữ liệu Ngoài ra DTD còn hạn chế về khả năng định nghĩa các
ràng buộc dữ liệu
- XML Schema sử dụng cùng cú pháp với trang XML làm cho người dùng dễ
nhớ ngoài ra nó còn hỗ trợ được 44 kiểu dữ liệu XML schema cho phép người dùng
tự định nghĩa kiểu dữ liệu mới, định nghĩa các ràng buộc dữ liệu XML schema bảo
toàn sự giao tiếp dữ liệu, ràng buộc các khóa và tham chiếu mạnh hơn so với DTD
đồng thời nó còn tích hợp được với không gian tên (namespace)
Trang 2- Các thuộc tính có thể xuất hiện trong trang XML
- Định nghĩa các kiểu dữ liệu
5.2.1 Thành phần schema
Điểm cơ bản nhất để hiểu về lược đồ XML là hiểu khái niệm sử dụng kiểu đơn
giản và kiểu phức hợp trong khai báo kiểu cho các phần tử XML
Để chỉ định kiểu cho các phần tử, chúng ta phải bảo đảm kiểu đã được định
nghĩa trước đó Như đã nêu trên, kiểu phức hợp là kiểu chứa các phần tử con trong nó
hoặc chứa thêm thuộc tính trong khi kiểu giản đơn thì không Kiểu giản đơn là kiểu
nội tại đã được định nghĩa sẵn và chúng ta có thể dùng tự do trong lược đồ XML
Schema là phần tử gốc (element root) của mỗi trang tài liệu
- Khai báo:
<xsd:schema
xmlns:xsd=http://www.w3.org/2001/XMLSchema
targetNamespace=http://www.books.org xmlns=http://www.books.org
- Các thành phần và các kiểu dữ liệu trong schema như:
- schema, element, complexType, sequence, string nằm trong namespace:
http:// /XML schema
- targetNamespace=http://www.books.org namespace của những thành phần
định nghĩa trong schema
- Ví dụ như Book, Title, Author, date, ISBN, Publisher nằm trong
Trang 3* Chú ý:
- Thuộc tính targetNamespace là một tùy chọn có thể không cần chỉ ra
targetNamespace cho một schema
5.2.2 Tham chiếu đến schema từ trang XML
<?xml version =“1.0”?>
<BookStore xmlns=http://www.books.org
xmlns:xsl=http://www.w3.org/2001/XMLschema-instance
<book> xsl:schemaLocation=:http://www.books.org BookStore.xsd”
<title>My life and Times</title>
- Khai báo namespace mặc định, thông báo cho schema- validator biết tất cả các
thành phần khai báo trong trang XML là có trong http://www.books.org namespace
- Thông báo cho schema-validator biết rằng thuộc tính schemaLocation là nằm
trong XMLschema-instance namespce
- Với schemaLocation thông báo cho schema - validator biết rằng
http://www.books.org namespace là được định nghĩa trong BookStore.xsd
5.3 Quá trình kiểm tra tính hợp lệ của một trang XML
Đầu tiên trình duyệt sẽ kiểm tra tính hợp lệ của dữ liệu trong trang XML trước,
căn cứ vào cấu trúc dữ liệu khai báo trong trang BookStore.xsd Sau đó tiếp tục kiểm
tra tính hợp lệ của trang BookStore.xsd, căn cứ vào các luật mô tả trong
XMLSchema.xsd
Trang 4<xsd:element name="to" type="xsd:string"/>
<xsd:element name="from" type="xsd:string"/>
<xsd:element name="heading" type="xsd:string"/>
<xsd:element name="body" type="xsd:string"/>
- http://www.w3.org/2001/XMLSchema: namespace của các từ khóa dùng trong sự
xác định lược đồ XML, ví dụ: schema, targetNamespace,…
- targetNamespace: định nghĩa namespace của lược đồ được xác định trong tài
liệu <schema>…</schema> trên
5.5 Xây dựng lược đồ từ nhiều thành phần
<include>: giống như #include trong ngôn ngữ C
schemaLocation: cho biết nơi để lấy thông tin
Trang 55.6 Khai báo phần tử trong XML Schema
Phần tử <schema> là phần tử gốc trong các tài liệu XML Schema
- Kiểu giản đơn (Simple type): là một phần tử XML chỉ có kiểu dữ liệu text, mà
không có thuộc tính hoặc không thể chứa các phần tử khác Kiểu text cũng có thể có
nhiều loại:
+ Built-in data type
+ User-defined data type
Người dùng có thể thêm ràng buộc cho kiểu dữ liệu để giới hạn nội dung của
nó, hoặc yêu cầu dữ liệu thỏa mãn một mẫu nào đó
- Kiểu phức hợp (Complex type): là một phần tử XML có thuộc tính, hoặc chứa
các phần tử con khác
5.7.1 Định nghĩa một phần tử giản đơn
<xsd:element name="xxx" type="yyy"/>
xxx: tên của phần tử yyy: kiểu dữ liệu của phần tử
Trang 65.7.2 Các kiểu dữ liệu thông dụng:
Kiểu token đơn Kiểu đa token Kiểu tháng Kiểu chuỗi
Trang 7Giá trị cố định:
<xsd:element name="color" type="xsd:string" fixed="red"/>
Trong đó:
Thuộc tính trong XSD được khai báo như một kiểu giản đơn Các phần tử giản đơn
không thể có thuộc tính Nếu một phần tử có thuộc tính, thì phần tử đó được xem là
phần tử phức hợp
5.9 Khai báo thuộc tính và các ràng buộc
<xsd:attribute name="xxx" type="yyy"/>
xxx: tên của thuộc tính
yyy: kiểu dữ liệu của thuộc tính
Ví dụ:
Phần tử XML có thuộc tính:
<lastname lang="EN">Smith</lastname>
5.9.1 Định nghĩa thuộc tính trong XSD
<xsd:attribute name="lang" type="xsd:string"/>
5.9.2 Khai báo loại thuộc tính
Khai báo default:
<xsd:attribute name="lang" type="xsd:string" default="EN"/>
Khai báo fixed:
<xsd:attribute name="lang" type="xsd:string" fixed="EN"/>
Khai báo requyred:
<xsd:attribute name="lang" type="xsd:string" use="requyred"/>
5.9.3 Ràng buộc nội dung
- Khi một phần tử hay thuộc tính đã định nghĩa kiểu dữ liệu, phần tử hay thuộc tính
đó đã có ràng buộc về nội dung
- Người dùng có thể thêm các ràng buộc cho phần tử hay thuộc tính
5.9.4 Ràng buộc giá trị
Kiểu miền con:
<xsd:element name="age">
<xsd:simpleType>
Trang 10<xsd:whiteSpace value="preserve"/>: XML parser sẽ không loại bỏ bất kỳ ký
tự dấu cách nào
<xsd:whiteSpace value=“replace"/>: XML parser sẽ thay thế tất cả ký tự dấu
cách (line feed, tab, space, carriage return) bằng khoảng trắng
<xsd:whiteSpace value=“collapse"/>: XML parser sẽ loại bỏ tất cả ký tự dấu
cách dư (line feed, tab, space, carriage return) bằng khoảng trắng
Trang 11<xsd:element name="firstname" type="xsd:string"/>
<xsd:element name="lastname" type="xsd:string"/>
<xsd:element name="firstname" type="xsd:string"/>
<xsd:element name="lastname" type="xsd:string"/>
Trang 12<xsd:element name="firstname" type="xsd:string"/>
<xsd:element name="lastname" type="xsd:string"/>
Trang 15Kết chương
Chúng ta đã tìm hiểu qua về khái niệm và định nghĩa kiểu tư liệu cho các phần
tử trong tài liệu XML thông qua lược đồ Lược đồ XML là một sự cố gắng nhằm
chuẩn hóa và đem lại sự linh động thay thế cho DTD Mặc dù lược đồ XML chưa
được phổ biến rộng rãi và đang trong giai đoạn phát triển đặc tả nhưng chắc chắn nó sẽ
trở thành một định nghĩa chuẩn trong tương lai
Trang 16Chương 6 DOM VÀ XỬ LÝ XML VỚI JAVASCRIPT
Mục tiêu học tập: Sau khi học xong chương này người học sẽ:
- Hiểu được mô hình DOM, cách nạp và xử lý dữ liệu
- Biết cách truy xuất nội dung và thuộc tính của các nút dữ liệu, thay đổi nội
dung XML bằng JavaScript
- Ứng dụng JavaScript vào XML
Tóm tắt chương
Chương này giới thiệu cách dùng JavaScript để xử lý dữ liệu XML theo mô
hình DOM Mặc dù DOM xử lý và truy xuất được mọi dữ liệu trong tài liệu XML,
nhưng mô hình khá phức tạp vì phải lần theo các nút trong cây tài liệu
6.1 Mô hình DOM
W3C định nghĩa tài liệu XML theo mô hình đối tượng tài liệu DOM (Document
Object Model) Mô hình này, tài liệu của chúng ta là một cây bao gồm các nút (node)
Nội dung các nút này có thể chứa các phần tử (element), dữ liệu văn bản (text), thuộc
Dữ liệu text Phân đoạn CDATA Tham chiếu thực thể Thực thể
Chỉ thị xử lý Chú thích Tài liệu Kiểu tư liệu Đoạn tài liệu Ghi chú
Trang 17Ví dụ: Chúng ta có tài liệu XML sau:
Tài liệu trên có thể phân theo cấu trúc hình cây bao gồm các nút đối tượng
Phần tử <DOCUMENT> là một nút bao gồm hai nút con là <GREETING> và
<MESSAGE> Hai nút <GREETING> và <MESSAGE> lần lượt chứa nút con khác
lưu dữ liệu dạng text với nội dung “Hello From XML” và “Welcome to the wild and
woolly word of XML” Toàn bộ cấu trúc trên chính là mô hình DOM
Khi phân tích cây tài liệu DOM ta xem mỗi nút là một đối tượng (object) DOM
còn cung cấp các phương thức như nextChild(), lastSibling()… để đi đến toàn bộ các
nút con khác
6.2 Nạp tài liệu XML cần xử lý bằng JavaScript
Có hai cách nạp dữ liệu XML vào trình duyệt IE bằng JavaScript
- Cách 1: Dùng lớp đối tượng Microsoft.XMLDOM
- Cách 2: Dùng phần tử nạp dữ liệu <XML>
Chúng ta sử dụng ví dụ (tập tin meetings.xml) sau để xử lý bằng Java Script theo
mô hình DOM (Tạo tập tin meetings.xml chứa thông tin của những người tham gia cuộc
Trang 18Ví dụ:
<?xml version = “1.0”?>
<MEETINGS>
<MEETING TYPE = “informal”>
<MEETING_TITLE> XML In The Real Word </MEETING_TITLE>
<MEETING_NUMBER> 2079 </MEETING_NUMBER>
<SUBJECT> XML</SUBJECT>
<DATE> 6/1/2002 </DATE>
<PEOPLE>
<PERSON ATTENDENCE= “present”>
<FIRST_NAME> Edward </FIRST_NAME>
<LAST_NAME> Edward </LAST_NAME>
</PERSON>
<PERSON ATTENDENCE= “absent”>
<FIRST_NAME> Ernestine </FIRST_NAME>
<LAST_NAME> Johnson </LAST_NAME>
</PERSON>
<PERSON ATTENDENCE= “present”>
<FIRST_NAME> Betty </FIRST_NAME>
<LAST_NAME> Richardson </LAST_NAME>
</PERSON>
</PEOPLE>
</MEETING>
</MEETINGS>
Tiếp theo, chúng ta tạo tài liệu viewdata.html bên dưới chứa đoạn mã JavaSript
để đọc và phân tích tài liệu XML trên Trước hết ta cần tạo ra đối tượng xử lý DOM
của Microsoft Như vậy, để thực hiện được điều này, ta gọi toán tử new để tạo mới đối
tượng ActiveXObject với tên lớp là Microsoft.XMLDOM
Trang 19xmldoc = new ActiveXObject (“Microsoft.XMLDOM”)
var xmldoc xmldoc = new ActiveXObject (“Microsoft.XMLDOC”)
xmldoc.load (“meetings.xml”);
</SCRIPT>
</HEAD>
</HTML>
Để duyệt qua tất cả các nút trong cây tài liệu theo mô hình DOM, ta cần xuất
phát từ nút gốc Trong tài liệu meetings.xml ở trên ta thấy <MEETINGS> là phần tử
gốc của tài liệu Chúng ta gọi phương thức documentElement để đến nút gốc của tài
liệu DOM như sau:
Trang 20{
var xmldoc, meetingsNode
xmldoc = new ActiveXObject (“Microsoft.XMLDOM”)
Chúng ta khai báo thêm biến meetingsNode để lưu giữ nút gốc Lúc này chúng ta
hoàn toàn có thể duyệt toàn bộ tài liệu bằng cách đi qua các nút của cấu trúc cây DOM
* Các phương thức duyệt qua các nút:
firstChild: lấy nút con đầu tiên
nextChild: lấy nút con kế tiếp
previousChild: lấy nút con trước đó
lastChild: lấy nút con sau cùng
* Ngoài ra còn có các phương thức:
firstSibling: trả về nút con cùng cấp đầu tiên
nextSibling: trả về nút con cùng cấp kế tiếp
previousSibling: trả về nút con cùng cấp trước đó
lastSibling: trả về nút con cùng cấp sau cùng
Ví dụ như <MEETING> là nút con của nút gốc <MEETINGS> và ta có thể gọi
phương thức fistChild để chuyển đến nút này như sau:
var xmldoc, meetingsNode, meetingNode
xmldoc = new ActiveXObject (“Microsoft.XMLDOM”)
Trang 21Chúng ta muốn tìm phần tử <PERSON> thứ 3 bên trong phần tử <PEOPLE> Do
<PEOPLE > là phần tử con cuối cùng của <MEETING> nên ta có thể lần ra nút dữ liệu này là:
Bởi vì phần tử <PERSON> thứ 3 mà ta muốn lấy là nút con cuối cùng của
<PEOPLE>, nên ta tiếp tục gọi phương thức lastChild của nút peopleNode
<HTML>
<HEAD>
<TITLE>
Trang 22Reading XML element values
Cuối cùng ta muốn lấy thông tin về họ tên <FIRST_NAME>, <LAST_NAME>
của phần tử <PERSON> Chúng ta sử dụng phương thức fistChild và nextSlibling (lấy
phần tử kế tiếp cùng cấp) như sau:
Trang 23Như vậy, chúng ta vừa đi qua tất cả các nút của cây tài liệu DOM để đến được các
mục thông tin cần lấy Công việc còn lại là hiển thị thông tin lấy được ra cửa sổ trình duyệt
Tiếp theo chúng ta sẽ tạo ra trang viewdata.html hoàn chỉnh bao gồm một nút
nhấn, khi kích chuột vào nút nhấn sẽ trả về thông tin của người thứ 3 tham dự cuộc
họp trong tập tin meetings.xml
Trang 24<INPUT TYPE =”BUTTON”
VALUE = “Get the name of the third person”
Khi dùng phần tử <XML> nạp dữ liệu, nguồn dữ liệu được đặt trong thuộc tính
SRC Để truy xuất đến đối tượng, chúng ta dựa vào thuộc tính ID
<XML ID= “meetingsXML” SCR = “meetings.xml”></XML>
<SCRIPT LANGUAGE = “javaScript”>
Function readXMLDocument ( ) {
var xmldoc, meetingsNode, meetingNode, peopleNode, first_nameNode, last_nameNode var outputText
xmldoc = document.all (“meetingsXML”).XMLDocument
meetingsNode = xmldoc.documentElement meetingNode = meetingsNode.firstChild peopleNode = meetingNode.lastChild personNode = peopleNode.lastChild
Trang 25first_nameNode = personNode.firstChild last_nameNode = first_nameNode.nextSibling outputText=“Third name:”+
first_nameNode.firstChild.nodeValue + „ „ + last_nameNode.firstChile.nodeValue
messageDIV.innerHTML = outputText }
<INPUT TYPE = “BUTTON”
VALUE = “Get the name of the third person”
Kết quả hiển thị vẫn không thay đổi
Với thẻ <XML> chúng ta có thể nhúng trực tiếp toàn bộ dữ liệu XML trong tài
liệu HTML, xem ví dụ sau:
<MEETING TYPE = “informal”>
<MEETING_TITLE> XML In The Real Word </MEETING_TITLE>
<MEETING_NUMBER> 2079 </MEETING_NUMBER>
<SUBJECT> XML </SUBJECT>
Trang 26<DATE> 6/1/2002 </DATE>
<PEOPLE>
<PERSON ATTENDENCE= “present”>
<FIRST_NAME> Edward </FIRST_NAME>
<LAST_NAME> Samson </LAST_NAME>
</PERSON>
<PERSON ATTENDENCE= “absent”>
<FIRST_NAME> Ernestine </FIRST_NAME>
<LAST_NAME> Johnson</LAST_NAME>
</PERSON>
<PERSON ATTENDENCE= “present”>
<FIRST_NAME> Betty </FIRST_NAME>
<LAST_NAME> Richardson </LAST_NAME>
xmldoc = document.all (“meetingsXML”) XMLDocument meetingsNode = xmldoc.documentElement
meetingNode = meetingsNode.firstChild peopleNode = meetingsNode.lastChild first_nameNode = personNode.firstChild last_nameNode = first_nameNode.nextSibling outputText = “Third name:” +
first_nameNode.firstChild.nodeValue + „ „ + last_nameNode.firstChild.nodeValue
messageDIV.innerHTML = outputText }
</SCRIPT>
</HEAD>
<BODY>
<CENTER>