Bài trước: Web services (5) - Trải nghiệm làm một web services (3)
1.1
XML là gì?
Đọc thêm: https://vi.wikipedia.org/wiki/XML
và https://en.wikipedia.org/wiki/XML
Theo wiki:
XML (viết tắt của từ tiếng Anh eXtensible Markup Language) được gọi là Ngôn ngữ đánh dấu
mở rộng.
XML là ngôn ngữ đánh dấu với mục đích chung, do W3C đề nghị,
để tạo ra các ngôn ngữ đánh dấu khác. Đây là tập con đơn giản của SGML, có khả năng
mô tả nhiều loại dữ liệu khác nhau. Mục đích chính của XML là đơn giản hóa việc
chia sẻ dữ liệu giữa các hệ thống khác nhau, đặc biệt là các hệ thống được kết
nối với Internet.
Các ngôn ngữ dựa trên XML (ví dụ: RDF, RSS, MathML, XHTML,
SVG, GML, và cXML) được định nghĩa theo cách thông thường, cho phép các chương
trình sửa đổi và kiểm tra hợp lệ bằng các ngôn ngữ này mà không cần có hiểu biết
trước về hình thức của chúng.
XML cung cấp một phương tiện dùng văn bản (text) để mô tả
thông tin và áp dụng một cấu trúc kiểu cây cho thông tin đó.
Một điều cần lưu ý là: trong quá trình thao tác và truyền dữ
liệu bằng XML, tỉ lệ sai sót và mất dữ liệu khoảng 5%-7%. Tuy con số này không
cao, nhưng cũng đáng để những người sử dụng phải có những cân nhắc kỹ càng hơn.
1.1.1
Cú pháp của tài liệu XML
Một tập tin chứa tài liệu XML thường có phần mở rộng là
.xml.
Một tài liệu XML thường bắt đầu bằng dòng chỉ thị xử lý
(processing instruction). Chỉ thị được đặt trong cặp dấu <? ?>. Nó cho biết phiên bản đặc tả XML được
sử dụng (version=“1.0”), bản mã hóa văn bản được sử dụng (encoding=“utf-8”), và
tài liệu XML có cần đến một tài liệu khác không (standalone=“yes”, nghĩa là
không cần đến tài liệu khác).
Dòng chú thích được đặt trong cặp dấu <!-- -->.
Ví dụ:
<?xml version="1.0" encoding="utf-8 standalone="yes"?>
<!-- thong tin sinh vien -->
<SinhVien>
<Ten>Teo</Ten>
<Tuoi>20</Tuoi>
<Diem>
<Toan>7</Toan>
<LapTrinh>8</LapTrinh>
</Diem>
</SinhVien>
Thẻ XML
Thẻ (tag) là thành phần để tạo ra các phần tử XML, chúng xác
định phạm vi một phần tử XML. Ngoài ra thẻ cũng có thể được sử dụng để chèn các
chú thích (comment), khai báo các thiết lập và tạo ra các chỉ thị lệnh đặc biệt.
Thẻ gồm hai loại: thẻ mở (start tag) và thẻ đóng (end tag).
Thẻ mở được sử dụng để đánh dấu bắt đầu một phần tử (phần tử
không rỗng). Ví dụ:
<SinhVien>
Thẻ đóng được sử dụng để đánh dấu kết thúc một phần tử (phần
tử không rỗng). Ví dụ:
</SinhVien>
Phần tử XML
Phần tử XML (XML element) được định nghĩa là các khối để tạo
ra một tài liệu XML. Mỗi khối được bắt đầu bằng <thẻ mở>, tiếp theo là phần
nội dung, và cuối cùng là thẻ đóng.
Ví dụ:
<Ten>Teo</Ten>
Phần tử có thể chứa văn bản (text), thuộc tính, phần tử
khác, đối tượng media.
Cú pháp của một phần tử:
<ten-phan-tu thuoc-tinh1=“gia-tri1”
thuoc-tinh2=“gia-tri2”>
nội dung
</ten-phan-tu>
Ví dụ:
<Sach the-loai=“VanHoc”>
<TacGia>NVTeo</TacGia>
</Sach>
Phần tử không có phần nội dung được gọi là phần tử rỗng
(empty element). Cú pháp của phần tử rỗng:
<element></element>
hoặc,
<element />
Thuộc tính
Thuộc tính là thông tin được khai báo trong thẻ mở, bao gồm
các thông tin bổ sung cho mỗi phần tử XML.
Cú pháp viết thuộc tính:
<element-name attribute1 attribute2 >
....content..
< /element-name>
Cú pháp của attribute:
name = “value”
Tên thuộc tính là duy nhất, giá trị (value) được bao bằng dấu
nháy đơn (‘’) hoặc nháy kép (“”).
<SinhVien>
<Ten>Teo</Ten>
<Tuoi>20</Tuoi>
<Diem>
<Toan HeSo="1">7</Toan>
<LapTrinh HeSo="2">8</LapTrinh>
</Diem>
</SinhVien>
Một số quy tắc về cú
pháp
Một tài liệu XML luôn phải có một phần tử gốc (root element)
duy nhất, nó chứa tất cả các phần tử còn lại. Phần tử gốc thường cho biết nội
dung chính của tài liệu XML. Ví dụ nếu tài liệu XML chứa danh sách của một lớp
thì phần tử gốc có thể đặt tên là DanhSachSinhVien.
<?xml version="1.0" encoding="utf-8 standalone="yes"?>
<!-- thong tin sinh vien -->
<DanhSachSinhVien>
<SinhVien>
<Ten>Teo</Ten>
<Tuoi>20</Tuoi>
<Diem>
<Toan>7</Toan>
<LapTrinh>8</LapTrinh>
</Diem>
</SinhVien>
</DanhSachSinhVien>
Tên của thẻ mở và thẻ đóng phải đồng nhất. Ví dụ tài liệu
XML sau sẽ bị lỗi,
<SinhVien>
<Ten>Teo</Ten>
<Tuoi>20</Tuoi>
<Diem>
<Toan>7</Toan>
<LapTrinh>8</LapTrinh>
</Diem>
</Sinhvien>
Mỗi thẻ mở luôn có thẻ đóng đi kèm. Ví dụ tài liệu XML sau bị
lỗi do thẻ <TiengAnh> không có thẻ đóng.
<SinhVien>
<Ten>Teo</Ten>
<Tuoi>20</Tuoi>
<Diem>
<Toan>7</Toan>
<TiengAnh>9
<LapTrinh>8</LapTrinh>
</Diem>
</SinhVien>
Phần tử con phải nằm trọn trong phần tử cha của nó. Ví dụ
tài liệu XML sau bị lỗi do thẻ </Toan> nằm ngoài thẻ </Diem>.
<SinhVien>
<Ten>Teo</Ten>
<Tuoi>20</Tuoi>
<Diem>
<Toan>7
<LapTrinh>8</LapTrinh>
</Diem>
</Toan>
</SinhVien>
Giá trị của thuộc tính được đặt trong cặp dấu nháy đơn (‘’)
hoặc nháy kép (“”).Ví dụ tài liệu XML sau bị lỗi.
<SinhVien>
<Ten>Teo</Ten>
<Tuoi>20</Tuoi>
<Diem>
<Toan HeSo=1>7</Toan>
<LapTrinh HeSo="2'>8</LapTrinh>
</Diem>
</SinhVien>
Lab 1.
Thực hiện kiểm tra một tài liệu XML (online) xem đã chuẩn chưa (validate). Vào
trang web https://www.xmlvalidation.com/,
nhập các đoạn mã XML bị lỗi ở các phần trên để kiểm tra lại.
Lab 2.
Tạo bằng tay một tài liệu XML để chứa danh sách sinh viên của lớp. Tham khảo ví
dụ sau:
[DanhSachSV.xml]
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- thong tin sinh vien -->
<DanhSachSinhVien>
<SinhVien>
<Ten>Teo</Ten>
<Tuoi>20</Tuoi>
<Diem>
<Toan HeSo="1">7</Toan>
<LapTrinh HeSo="2">8</LapTrinh>
</Diem>
</SinhVien>
<SinhVien>
<Ten>Ti</Ten>
<Tuoi>21</Tuoi>
<Diem>
<Toan HeSo="1">5</Toan>
<LapTrinh HeSo="2">5</LapTrinh>
</Diem>
</SinhVien>
<SinhVien>
<Ten>Mui</Ten>
<Tuoi>19</Tuoi>
<Diem>
<Toan HeSo="1">9</Toan>
<LapTrinh HeSo="2">9</LapTrinh>
</Diem>
</SinhVien>
</DanhSachSinhVien>
1.1.2
Cấu trúc cây trong XML
XML sử dụng cấu trúc cây để tổ chức dữ liệu. Một tài liệu
XML luôn bắt đầu bằng một phần tử gốc (root element) hay nút gốc, phần tử gốc
này sẽ chứa một hoặc nhiều phần tử con (hay nút con). Một tài liệu XML không được
có hai nút gốc.
Mỗi nút con lại có thể chứa một hoặc nhiều các nút con khác.
Nút con cấp cuối cùng (nút lá) sẽ chứa dữ liệu.
Xem hình ví dụ:
1.1.3 Một số chủ đề tìm hiểu thêm
– DTD
– Schema
– Tree structure
– DOM
– Namespace
– Database
1.1.4 Một số câu hỏi ôn tập
1. XML
là gì?
2. Cú
pháp của tài liệu XML
3. Cấu
trúc cây trong XML
4. JSON
5. JSON
và AJAX
Lab 3.
Đọc dữ liệu từ database để tạo ra một tài liệu XML bằng ngôn ngữ lập trình.
Tham khảo clip sau:
https://www.youtube.com/watch?v=F40a7nsPhuQ
Một vài gợi ý:
[dbconnection.php]
<?php
$con=mysqli_connect("localhost", "root","")
or
die("Connection Failed");
// echo "<pre>";
// print_r($con);
// echo "</pre>";
$db=mysqli_select_db ($con, "test");
?>
Thư viện mysql dùng cho PHP4, 5. Nếu dùng PHP5, 7 thì sử dụng
thư viện mysqli. Với mysqli, có thể viết theo kiểu gọi thủ tục hoặc kiểu hướng
đối tượng. Đoạn mã ở trên viết theo kiểu gọi thủ tục.
Học thêm về kiểu viết:
$con=mysqli_connect("localhost", "root","")
or
die("Connection Failed");
Nó là áp dụng tính chất xử lý của biểu thức or hay || trong
PHP. Cụ thể:
$ketqua = bieuthuc1 or bieuthuc2;
bieuthuc1 sẽ được thực hiện trước, nếu kết quả là true thì kết
thúc việc thực hiện vế phải, gán giá trị true vào biến $ketqua, không thực hiện
bieuthuc2. Nếu bieuthuc1 trả về kết quả false thì tiếp tục thực hiện biểu thức
2 (ở ví dụ trên nếu hàm mysqli_connect trả về false, thì thực hiện tiếp hàm
die() và kết thúc chương trình).
Viết dbconnection.php theo kiểu hướng đối tượng:
[dbconnection.php]
<?php
$conn = new mysqli("localhost", "root", "");
if($conn->connect_error){
die("Connection failed: " . $conn->connect_error);
}
// echo "<pre>";
// print_r($conn);
// echo "</pre>";
$conn->select_db("test");
?>
Hàm DOMDocument() để tạo một đối tượng XML, đối tượng này
giúp tham chiếu và thao tác với các thành phần trong tài liệu XML.
[index.php]
<?php
include 'dbconnection.php';
// createElement and appendChild()
$result = mysqli_query($con, 'select * from books');
// echo "<pre>";
// print_r($result);
// echo "</pre>";
$xml = new DOMDocument("1.0");
$xml -> formatOutput = true;
$books = $xml -> createElement("books");
$xml -> appendChild($books);
while($row = mysqli_fetch_array($result)){
$book = $xml -> createElement("book");
$books -> appendChild($book);
$name = $xml -> createElement("name", $row['name']);
$book -> appendChild($name);
$price = $xml -> createElement("price", $row['price']);
$book -> appendChild($price);
}
// xuất tài liệu XML ra trình duyệt để kiểm tra, dùng Developer tool để xem
echo "<xmp>" . $xml -> saveXML() . "</xmp>";
// xuất ra tập tin kết quả
$xml -> save("reports.xml");
?>
Lab 4.
Đọc dữ liệu gửi về của sensor dạng XML, viết chương trình chuyển dữ liệu dạng
XML vào database. Tham khảo clip sau:
https://www.youtube.com/watch?v=0EhtyNsLOVY
xml:lang thuộc tính xác định ngôn ngữ chính được sử dụng
trong phần nội dung (conten) và giá trị của các thuộc tính trong tài liệu XML.
[data.xml]
<?xml version="1.0" encoding="UTF-8"?>
<xmlResponse xml:lang="eng">
<Monitor>
<sensorList>
<sensor>
<name>Sensor 1</name>
<value>NOK</value>
<status>0</status>
</sensor>
<sensor>
<name>Sensor 2</name>
<value>OK</value>
<status>1</status>
</sensor>
<sensor>
<name>Sensor 3</name>
<value>OK</value>
<status>1</status>
</sensor>
<sensor>
<name>Sensor 4</name>
<value>OK</value>
<status>1</status>
</sensor>
<sensor>
<name>Sensor 5</name>
<value>NOK</value>
<status>0</status>
</sensor>
<sensor>
<name>Sensor 6</name>
<value>OK</value>
<status>1</status>
</sensor>
<sensor>
<name>Sensor 7</name>
<value>NOK</value>
<status>0</status>
</sensor>
<sensor>
<name>Sensor 8</name>
<value>OK</value>
<status>1</status>
</sensor>
<sensor>
<name>Sensor 9</name>
<value>OK</value>
<status>1</status>
</sensor>
<sensor>
<name>Sensor 10</name>
<value>NOK</value>
<status>0</status>
</sensor>
</sensorList>
</Monitor>
</xmlResponse>
[index.php]
<html>
<head></head>
<body>
<?php
include_once("processSensors.php")
?>
</body>
</html>
[processSensor.php]
<?php
include_once("dbLib.inc");
$xml = simplexml_load_file("data.xml");
if($xml){
foreach($xml->Monitor->sensorList->sensor as $sensor){
echo "<p>".$sensor->name."</p>";
echo "<p>".$sensor->value."</p>";
echo "<p>".$sensor->status."</p>";
recordSensor($sensor->name, $sensor->value, $sensor->status);
}
}
?>
[dbLib.inc]
<?php
$db_msg = "";
function connectDatabase(){
$username =
"root";
$password =
"";
try{
$db = new
PDO("mysql:dbname=sensors;host=localhost;port=3306",$username,$password);
}
catch(PDOException
$e){
$db = -1;
$db_msg =
"Khong ket noi duoc co so du lieu".$e->getMessage();
}
return $db;
}
function recordSensor($name, $value, $status){
$db =
connectDatabase();
if($db){
$sql =
"INSERT INTO
sensorsInfo(SensorName, SensorValue, SensorStatus) VALUES (\"$name\",
\"$value\", $status)";
try{
$r =
$db->query($sql);
}catch(PDOException $e){
echo "Loi trong qua trinh gi
du lieu" . $e->getMessage();
}
}else {
echo $db_msg;
}
}
?>
[database]
1.1.5 XML schema
Schema nghĩa là
lược đồ.
Theo từ điển Longman thì schema: a drawing or description of
the main parts of something.
Schema là một tài liệu được viết dưới dạng XML, được sử dụng
để mô tả cấu trúc của một tài liệu XML.
Trong XML, schema được sử dụng để:
– Định nghĩa cấu trúc các thành phần có trong XML
– Định nghĩa các thuộc tính có trong schema
– Định nghĩa các thành phần con và thứ tự xuất hiện của
chúng trong thành phần cha
– Định nghĩa một thành phần là rỗng hay có chứa văn bản
(text)
– Định nghĩa kiểu dữ liệu cho các thành phần và thuộc tính
– Định nghĩa giá trị mặc định cho thuộc tính
Schema được phát triển từ nền tảng DTDs, với các ưu điểm:
– Schema viết theo định dạng như XML, nên dễ sử dụng
– Schema cho phép người dùng tự định nghĩa kiểu dữ liệu
riêng từ các kiểu dữ liệu chuẩn
– Có hỗ trợ namespace
– Dễ dàng kiểm tra tính đúng của dữ liệu, dễ khai báo định dạng
và phạm vi của dữ liệu
Xem clip sau:
https://www.youtube.com/watch?v=1BjmZHRHDv0
Học thêm từ loạt bài giảng của tác giả Hải Lân:
https://www.youtube.com/watch?v=jA_PYaf239M
</////3
1.2
JSON và AJAX
Tổng quan về JSON
https://legiacong.blogspot.com/2020/10/json-1-lam-quen-voi-json.html
JSON và AJAX
Lab 1.
Thực hiện cấu hình dữ liệu JSON phía server, viết chương trình sử dụng AJAX để
lấy dữ liệu từ server về client. Tham khảo tài liệu sau:
https://legiacong.blogspot.com/2020/11/json-2-json-va-ajax.html