Web services (6) - XML, JSON, Ajax

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/XMLhttps://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

-----
Cập nhật: 27/11/2023