[School] Bài tập về DTC, Schema, DOM trong XML

Đề bài: Một chương trình quản lý thông tin sinh viên và quá trình mượn tả sách của 1 thư viện lưu các TT sau: Thông tin về SV gồm: Mã SV, Họ tên, lớp và Năm sinh. Thông tin mượn sách của sinh viên bao gồm các thông tin về những cuốn sách, ngày mượn, ngày trả. Mỗi cuốn sách mà sv mượn bao gồm: Mã sách, tên sách, NXB, Năm XB. Mỗi sinh viên có thẻ mượn nhiều cuốn sách khác nhau.

1. Định nghĩa XMl Schema với các yêu cầu:

  • Mã SV, mã sách bao gồm 4 ký tự trong đó có 2 ký tự đầu là chữ, 2 ký tự sau là số
  • Lớp của sv là một trong những giá trị cuat tập hợp các lớp: CMPM1, CNPm2, CNPM3
  • Tông tin về cuốn sách xuất hiện theo thứ tự mã sách, tên sách, nhà XB, năm XB

2. Vẽ mô hình DOM

3. Sử dụng cá dối tượng XMLDOM duyệt qua toàn bộ cấu trúc cây và hiển thị thông tin sinh viên thứ 5 và thông tin mượn trả của sinh viên đó

Giải:

Định nghĩa XML Schema

<?xml version = "1.0"?>
<xs:schema xmlnx:xs = "www.w3.org/2001/XMLSchema">
	
	<!-- The goc thu vien gom cac phan tu QLMuon-->
	<xs:element name = "ThuVien">
		<xs:complexType>
			<xs:element name = "QLMuon" type = "KQLMuon"/>
		</xs:complexType>
	</xs:element>
	
	<!-- Thong tin gom Thong tin sinh vien va thong tin muon-->
	<xs:complexType name = "KQLMuon" minOccurs = "0">	
		<xs:element name = "SinhVien" type = "KSinhVien"/>
		<xs:element name = "Muon" type = "KMuon"/>
	</xs:complexType>
	
	<!-- Dinh nghia kieu sinh vien -->
	<xs:complexType name = "KSinhVien">
		<xs:sequense>
			<xs:element name = "MaSV" type = "KMa"/>
			<xs:element name = "Hoten" type = "xs:string"/>
			
			<!-- dinh nghia kieu lop-->
			<xs:element name = "Lop">
				<xs:simpleType>
					<xs:restriction base = "xs:string"/>
					<xs:pattern value = "CNPM1|CNPM2|CNPM3"/>
				</xs:simpleType>
			</xs:element>
			<!---ket thuc Lop-->
			
			<xs:element name = "NamSinh" type = "xs:date">
		</xs:sequense>
	</xs:complexType> 
	
	<!-- Dinh nghia kieu muon-->
	<xs:complexType name = "KMuon" minOccurs = "0">
		<xs:sequense>
			<xs:element name = "Sach" type = "KSach"/>
			<xs:element name = "NgayMuon" type = "xs:date"/>
			<xs:element name = "NgayTra" type = "xs:date"/>
		</xs:sequense>
	</xs:complexType>
	
	<!-- Dinh nghia kieu Sach-->
	<xs:complexType name = "KSach">
		<xs:sequense>
			<xs:element name = "MaSach" type = "KMa"/>
			<xs:element name = "TenSach" type = "xs:string"/>
			<xs:element name = "NXB" type = "xs:string"/>
			<xs:element name = "NamXB" type = "xs:Year"/>
		</xs:sequense>
	</xs:complexType>
	
	<!-- Dinh nghia Ma sach va Ma sinh vien-->
	<xs:simplexType name = "KMa">
		<xs:restriction base = "xs:string"/>
		<xs:pattern value = "[a-zA-Z]{2}[0-9]{2}">
	</xs:simplexType>
	
</xs:schema>

Sơ đồ DOM

Thực ra thì các bạn chỉ cần chuyển cấu trúc bên trên về dạng cây là xong.

Mô hình DOM
Mô hình DOM

Duyệt và in ra thông tin SV mượn thứ 5

Để duyệt và in ra thông tin ta cần dùng C#, Java, JavaScript, … Ở đây mình dùng JavaScrip.

<srcipt language = "JavaScript">
	function read(){
		var i, xmlDoc, QLMuonNode, ttSV, ttMuon, ttSach, output;
		xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.load("thuvien.xml");
		
		// lay thong tin sinh vien muon sach thu 5
		QLMuonNode = xmldoc.getElementsByTagName("QLMuon")[4];
		
		// lay toan bo cac node con cua SinhVien
		ttSV = QLMuonNode.firstChild.childNodes;
		
		for (i = 0; i < ttSV.length; i++){
			output += ttSV[i].nodeName + ":" + ttSV[i].nodeValue + <br/>
		}
		
		// lay toan bo cac node con cua Muon
		ttMuon = QLMuonNode.lastChild.childNodes;
		
		for (i = 1; i < ttMuon.length; i++){
			output += ttMuon[i].nodeName + ":" + ttMuon[i].nodeValue + <br/>
		}
		
		// lay toan bo cac node con cua Sach, Sach nam tai node[0] cua ttMuon
		ttSach = ttMuon[0].childNodes;
		
		for (i = 0; i < ttSach.length; i++){
			output += ttSach[i].nodeName + ":" + ttSach[i].nodeValue + <br/>
		}
		
		// hien thi thong tin
		document.write(output);
	}
</srcipt>