Cơ sở dữ liệu XML và truy vấn XML bằng XQuery

Một phần của tài liệu Chuẩn QTI trong các hệ thống sát hạch trắc nghiệm bằng máy tính và triển khai thử nghiệm (Trang 43 - 81)

2.3.1. Hệ cơ sở dữ liệu XML eXist

Kho câu hỏi trắc nghiệm và bài thi theo chuẩn QTI là một tập hợp các tệp XML nên việc nghiên cứu dùng cơ sở dữ liệu XML để quản trị kho câu hỏi trắc nghiệm là lựa chọn tự nhiên. Các hệ cơ sở dữ liệu XML về bản chất chia làm hai họ: các hệ cơ sở dữ liệu khả XML (XML-enable) và các hệ cơ sở dữ liệu nguyên sinh XML (native XML).

Các hệ cơ sở dữ liệu quan hệ nổi tiếng nhƣ Oracle, DB2, MySQL, … đều có phần mở rộng khả XML, cho phép tổ chức lƣu trữ và quản trị các tài liệu XML trên nền mô hình dữ liệu quan hệ. Cơ sở dữ liệu nguyên sinh XML là hệ cơ sở dữ liệu đƣợc phát triển dành riêng cho các tài liệu XML, coi toàn bộ tài liệu XML là đơn vị lƣu trữ lôgic cơ sở.

Từ góc độ ứng dụng khai thác các tài liệu XML, có thể xếp cơ sở dữ liệu XML vào hai nhóm khác nhau: hƣớng dữ liệu (data centric) và hƣớng tài liệu (document-centric). Cơ sở dữ liệu XML hƣớng tài liệu nhằm đến các ứng dụng sử dụng toàn bộ tài liệu XML nhƣ một đơn vị trọn vẹn. Cơ sở dữ liệu XML hƣớng dữ liệu phục vụ cho các ứng dụng có thể cần trích ra những phần dữ liệu dƣới dạng các phần tử hay thuộc tính chứa trong nhiều tài liệu XML.

Một đặc tính quan trọng cần xem xét là khả năng hoàn nguyên (round- trip) một tài liệu XML. Nhƣ đã biết, mô hình dữ liệu DOM của một tài liệu XML là mô hình phân cấp các nút, không kiểm soát trình tự anh em trong các con của cùng một nút cha. Các cơ sở dữ liệu XML có thể “băm nhỏ” tài liệu XML làm nhiều phần dựa trên mô hình phân cấp DOM và tổ chức lƣu trữ vật lý ở những vùng nhớ khác nhau. Khi lấy ra một tài liệu XML, các phần tử XML đƣợc lắp ghép trả lại, trình tự các nút con của cùng một nút cha có thể không giống nhƣ tài liệu gốc. Một số ứng dụng, ví dụ các văn bản pháp luật,

hợp đồng kinh tế,… đòi hỏi phải giữ nguyên dạng văn bản gốc. Tính chất này gọi là khả năng hoàn nguyên văn bản.

Bài toán tổ chức kho câu hỏi trắc nghiệm theo chuẩn QTI là xây dựng cơ sở dữ liệu XML hƣớng tài liệu, có một số yêu cầu đặc thù nhƣ sau đây:

- Quản lý một lƣợng lớn các tài liệu XML ngắn, không có tài liệu dài, kích thƣớc lớn;

- Lƣu trữ, lấy ra, chuyển tải toàn bộ tài liệu XML trọn vẹn, không có (hay ít khi) yêu cầu trích xuất từng phần nhỏ của nhiều tài liệu khác nhau.

- Yêu cầu khả năng “hoàn nguyên” tài liệu XML. Trình tự các phần trong tài liệu phải đƣợc kiểm soát.

- Có yêu cầu quản trị nội dung, tìm kiếm theo nội dung để khai thác sử dụng hay cập nhật sửa chữa các tài liệu XML chứa trong cơ sở dữ liệu.

Hệ cơ sở dữ liệu nguyên sinh XML đáp ứng tốt những yêu cầu trên. Hệ cơ sở dữ liệu eXist (http://exist-db.org/) là hệ cơ sở dữ liệu nguyên sinh XML sử dụng mô hình lƣu trữ cây B+ và tệp có phân trang, là một phần mềm nguồn mở để phát triển một hệ thống ngƣời sử dụng. eXist đƣợc viết hoàn toàn trong Java và có thể chạy trong chế độ khách chủ nhƣ máy chủ cơ sở dữ liệu, nhƣ một servlet hoặc nhúng trực tiếp vào một ứng dụng. Rất thuận lợi khi phát triển ứng dụng Web.

eXist đƣợc phân phối kèm với nhiều mô đun chứa các hàm tiện ích do ngƣời sử dụng tự phát triển, hỗ trợ nén dữ liệu, xử lý ngày giờ, các phép toán số học, làm việc với hình ảnh, tệp nhị phân và cả dữ liệu địa lý. Một ƣu điểm là eXist có tài liệu hƣớng dẫn rất đầy đủ dành cho ngƣời phát triển ứng dụng.

Trong khuôn khổ đề tài này, cơ sở dữ liệu eXist đƣợc chọn sử dụng lƣu trữ hệ thống kho câu hỏi trắc nghiệm.

2.3.2. Kiểm soát truy cập trong eXist

Để đảm bảo an toàn dữ liệu, các ứng dụng cơ sở dữ liệu đều phải có kiểm soát truy cập dữ liệu đúng đắn. Mô hình kiểm soát truy cập dữ liệu thƣờng dựa trên vai trò chức năng của nhóm ngƣời sử dụng. Dữ liệu về nhóm ngƣời dùng chứa trong CSDL, thuộc sƣu tập etest/users.

Các thí sinh là ngƣời sử dụng kho câu hỏi thông qua hệ thống phân phối bài thi. Mỗi lần đăng nhập hệ thống, thí sinh làm bài thi của một môn học. Thí sinh chỉ cần có quyền đọc. Ta định nghĩa nhóm ngƣời dùng thí sinh - môn học với quyền truy cập chỉ đọc sƣu tập môn học tƣơng ứng.

Nhƣ vậy, tổ chức lƣu trữ lôgic theo hệ thống sƣu tập ứng với từng môn học cũng phù hợp với yêu cầu phân quyền và kiểm soát truy cập kho câu hỏi.

Với hệ quản trị cơ sở dữ liệu eXist thực hiện phân quyền truy cập từng tài liệu XML, từng sƣu tập trong cơ sở dữ liệu tƣơng tự nhƣ quyền truy cập hệ thống tệp/thƣ mục của hệ điều hành linux/unix. Quyền truy cập mỗi tệp XML hay mỗi sƣu tập có ba mức khác nhau:

- R là Read/Execute: cho phép đọc nội dung đối với tệp hoặc liệt kê danh sách các tệp, các sƣu tập con có trong sƣu tập.

- W là Create/Delete: cho phép thêm mới hoặc xóa bỏ tệp, sƣu tập con. - U là Modify/Change: cho phép cập nhật, sửa đổi nội dung. Lƣu ý rằng nếu ngƣời sử dụng chỉ có quyền U thì không thể thêm tệp mới vào sƣu tập.

Tập hợp ngƣời sử dụng hệ thống đƣợc chia thành 3 lớp: chủ sở hữu (owner), nhóm ngƣời dùng (group) và khách (world). Một trƣờng gồm ba bít ứng với RWU, mỗi bít sẽ đƣợc bật hay tắt để cấp quyền tƣơng ứng cho từng lớp ngƣời sử dụng. Mô hình dữ liệu XML còn cho phép phân quyền và kiểm soát truy cập mịn hơn nữa, đến mức các phần tử trong mô hình DOM của tài liệu XML. Tuy nhiên, kho câu hỏi của chúng ta không yêu cầu kiểm soát truy cập mịn đến mức ấy.

2.3.3. Ngôn ngữ truy vấn XQuery

Bất cứ khi nào cần truy cập và thao tác dữ liệu XML thì một lựa chọn cần xem xét là dùng XQuery. XQuery là một ngôn ngữ để truy vấn dữ liệu XML. Nó đƣợc thiết kế để có thể đƣợc áp dụng rộng rãi cho nhiều nguồn dữ liệu XML. XQuery đƣợc sử dụng phổ biến để định vị và trích ra các thuộc tính và phần tử từ các tài liệu XML và cũng đƣợc dùng để tạo ra các tài liệu XML mới sử dụng các đối tƣợng đã lấy ra. Các mẫu so khớp cơ bản và phổ biến của các biểu thức XQuery là các biểu thức đƣờng dẫn, giống nhƣ trong XPath, nhƣng XQuery có khả năng biểu diễn mạnh hơn XPath.

XQuery là ngôn ngữ lập trình khai báo (declarative), không chỉ sử dụng làm ngôn ngữ truy vấn dữ liệu XML mà còn sử dụng làm ngôn ngữ chuyển đổi dữ liệu giữa các khuôn dạng khác nhau và làm ngôn ngữ tích hợp dữ liệu giữa các hệ thống. Khả năng diễn đạt của XQuery không kém bất cứ ngôn ngữ lập trình mục tiêu chung nào. Hoàn toàn có thể và rất hiệu quả khi phát triển toàn bộ trọn vẹn một ứng dụng web hoàn chỉnh quy mô lớn (enterprise web application) bằng XQuery. Hơn nữa, phát triển ứng dụng web bằng XQuery còn có một số ƣu điểm nhƣ sau:

- Mã lệnh ngắn gọn và đẹp đẽ. Hỗ trợ XLTS của XQuery cho phép thực hiện các trang XHTML rất ngắn gọn. Là một ngôn ngữ khai báo (declarative), XQuery cũng cho phép triển khai các dịch vụ kho câu hỏi đơn giản hơn nhiều so với Java.

- Đơn giản hóa kiến trúc tổng thể của ứng dụng và cải thiện tính linh hoạt. Một ứng dụng XQuery gồm nhiều mô đun, là những tệp XQuery. Một mô đun XQuery gồm nhiều hàm, có thể đƣợc gọi trực tiếp từ một mô đun khác hoặc đƣa ra qua REST hay nhƣ một dịch vụ Web. XQuery rất thuận tiện để xây dựng ứng dụng web theo kiến trúc MVC.

XQuery là một ngôn ngữ truy vấn mới đƣợc thiết kế chuyên dụng khi thao tác với dữ liệu XML. Là một phần của chuẩn kỹ nghệ W3C, XQuery cho phép ngƣời dùng duyệt cấu trúc phân cấp trong tài liệu XML. Kết quả là có thể truy vấn các tài liệu XML hoặc các phân đoạn tài liệu sử dụng XQuery. XQuery hỗ trợ nhiều khả năng nhƣ khả năng biến đổi đầu ra XML và kết hợp logic điều kiện vào các truy vấn.

Một XQuery luôn biến đổi từ một giá trị của mô hình dữ liệu XQuery này (XQuery Data Model) sang một giá trị của một mô hình dữ liệu XQuery khác. Một giá trị trong mô hình dữ liệu XQuery là một chuỗi gồm không hoặc nhiều hơn một danh mục (item). Một danh mục có thể là:

- Giá trị nguyên tử bất kì

- Một nút XML nhƣ phần tử (element), thuộc tính (attribute) hoặc nút văn bản (text node) (đôi khi đƣợc gọi là một phân đoạn tài liệu XML)

- Một tài liệu XML đầy đủ

Thƣờng thì đầu vào một XQuery là một tập hợp các tài liệu XML. Ngôn ngữ XQuery suy ra từ các chuẩn khác của XML, chẳng hạn nhƣ XPath. Nó xác định những ngƣời dùng có thể duyệt qua một tài liệu XML và lƣợc đồ XML nhƣ thế nào, nó chỉ rõ các kiểu dữ liệu và các cấu trúc hợp lệ cho các tài liệu của họ.

XQuery khác với SQL về một số phƣơng diện then chốt, phần lớn là do các ngôn ngữ này đƣợc thiết kế để làm việc với các mô hình dữ liệu khác nhau, mà các mô hình này có các đặc tính khác nhau. Các tài liệu XML có chứa các mức phân cấp và sở hữu một thứ tự có sẵn. Các cấu trúc dữ liệu dạng bảng đƣợc các DBMS dựa trên SQL hỗ trợ là phẳng và dựa trên tập hợp; vì thế, các hàng không theo thứ tự. Các sự khác nhau giữa các mô hình dữ liệu này dẫn đến một số khác biệt cơ bản trong các ngôn ngữ truy vấn riêng tƣơng ứng của chúng. Bảng dƣới liệt kê một vài ví dụ.

XQuery SQL

Hỗ trợ các biểu thức đƣờng dẫn để cho phép các lập trình viên dẫn hƣớng thông qua cấu trúc phân cấp của XML

Không hỗ trợ các biểu thức đƣờng dẫn

Hỗ trợ cả hai dữ liệu có định kiểu và không định kiểu

Luôn luôn đƣợc định nghĩa với một kiểu cụ thể

Không cần các giá trị NULL vì các tài liệu XML bỏ qua dữ liệu thiếu hoặc không đƣợc biết

Sử dụng các giá trị NULL để thể hiện các giá trị thiếu hoặc không đƣợc biết

Trả về các chuỗi dữ liệu XML Trả về các tập hợp kết quả của các kiểu dữ liệu SQL khác nhau

Bảng 2.1: Sự khác nhau giữa SQL và XQuery

Một ứng dụng XQuery gồm các thành phần sau:

- Các mô đun là tệp các lệnh XQuery thực hiện các truy vấn dữ liệu XML cũng nhƣ chuyển đổi dữ liệu và hiển thị kết quả thành trang web.

- Bộ xử lý XQuery thi hành các vấn tin XQuery. Đây có thể là một thành phần chạy độc lập hay phần mở rộng của hệ cơ sở dữ liệu tích hợp sẵn, có khả năng xử lý XQuery.

- Một hệ cơ sở dữ liệu XML chứa dữ liệu cần truy vấn và có hỗ trợ XQuery.

- Một giao diện lập trình ứng dụng XQuery để triệu gọi và xử lý các truy vấn từ trong ứng dụng.

Một số các ứng dụng của XQuery:

- Trích thông tin từ CSDL để sử dụng cho các dịch vụ Web - Tạo các báo cáo tổng kết về dữ liệu lƣu trong một CSDL XML

- Tìm các tài liệu dạng văn bản trên Web có các thông tin phù hợp và trình bày kết quả nhƣ mong muốn

- Chọn và chuyển đổi các dữ liệu XML sang XHTML để công bố trên Web

- Lấy dữ liệu từ CSDL để cho các tích hợp ứng dụng

- Tách một tài liệu XML chứa thông tin về nhiều giao dịch ra thành nhiều tài liệu XML.

2.4. JQuery - thƣ viện Javascript để xử lý sự kiện trên trang web 2.4.1. Giới thiệu 2.4.1. Giới thiệu

jQuery là một thƣ viện kiểu mới của Javascript, hay còn gọi là JavaScript Framework, giúp đơn giản hóa cách viết JavaScript và tăng tốc độ xử lý các sự kiện trên trang web. Các thƣ viện jQuery cung cấp một mục đích chung là sự trừu tƣợng hoá các lớp phổ biến cho các trang web scripting, do đó nó hữu ích trong hầu hết các tình huống scripting. Khẩu hiệu của jQuery là "Viết ngắn gọn, làm đƣợc nhiều”. Nếu không dùng jQuery thì lập trình viên phải viết code dài vài trang giấy mới làm đƣợc một nút Back to Top với hiệu ứng trƣợt, nhƣng nếu dùng jQuery + vài dòng code là đã có thể xử lý đƣợc yêu cầu trên. Bên cạnh đó, việc sử dụng jQuery giúp giải quyết tốt vấn đề xung đột giữa các trình duyệt web.

Các chức năng của jQuery bao gồm:

- Chọn một tag hoặc một tập hợp các tag trên trang web. - Cung cấp các hàm tiện ích thông dụng.

- Nhanh chóng tạo ra các tag mới.

- Phân tích việc thiết kế và lập trình web trên phía client.

Có thể download phiên bản mới nhất của jQuery từ địa chỉ: http://docs.jquery.com/Downloading_jQuery (phiên bản mới nhất 1.8.1 – tên file “jquery-1.8.1.js”)

Hình 2.9: Màn hình Download jQuery

2.4.2. Hoạt động của jQuery a. Gọi thƣ viện jQuery a. Gọi thƣ viện jQuery

Sử dụng thẻ script để trỏ tới jquery.js theo cú pháp:

<script type=”text/javascript” src=”js/jquery-1.8.1.js”></script>

b. Chạy mã khi Document Ready (trang đã sẵn sàng)

Khi lập trình với Javascript, kết thúc mã thực thi bằng cách thêm các dòng mã vào script nhƣ sau:

window.onload = function() { … }

Các mã bên trong đó sẽ đƣợc thực thi khi trang đƣợc tải xong. Tuy nhiên, mã Javascript không chạy cho đến khi tất cả các hình ảnh trong trang đƣợc tải xong (kể cả banner quảng cáo). Lý do sử dụng window.onload là để chắc chắn rằng HTML 'document' phải đƣợc tải xuống hết, sau đó mới chạy mã kia. Để giải quyết, jQuery dùng lệnh:

$(document).ready(function() { //Mã lệnh

});

Mã này kiểm tra document và đợi cho đến khi nó sẵn sàng để sử dụng - theo ý chúng ta muốn.

c. Function $()

Khi làm việc với CSS, Xpath hoặc custom, jQuery sử dụng function $() (dấu $ và cặp dấu ngoặc). Dƣới dây là một số thành phần trong $():

$("p"): p là tên của một thẻ (tag). $("#id"): id là tên của một id.

$(".class"): class là tên của một lớp.

2.4.3. Một số API trong jQuery a. Selectors a. Selectors

id #

Trả về một phần tử của mảng: Array <Element>. Nó tƣơng ứng với một phần tử duy nhất đƣợc gán bởi thuộc tính id. Nếu id chứa các ký tự nhƣ dấu chấm (.) hoặc 2 dấu [] thì chúng phải thêm 2 dấu ngạch chéo (\\) vào trƣớc các ký tự đó.

Nếu là $("#some.id") thì phải viết thành $("#some\\.id") Nếu là $("#some[id]") thì phải viết thành $("#some\\[id]\\")

element

Kiểu trả về: Array<Element(s). Tƣơng ứng với tất cả các phần tử với tên đƣợc gán.

.class

Kiểu trả về: Array<Element(s). Tƣơng ứng với tất cả các phần tử với tên lớp.

Kiểu trả về: Array<Element(s). Tƣơng ứng với tất cả các phần tử.

:contains(text)

Kiểu trả về: Array<Element(s). Tƣơng ứng với các phần tử chứa nội dung văn bản.

Ví dụ: Gạch chân tất cả các thẻ “div” có chứa từ “John”. $("div:contains('John')").css("text-decoration", "underline");

:empty

Kiểu trả về: Array<Element(s). Tƣơng ứng với tất cả các phần tử không có phần tử con

Ví dụ: Chèn xâu “Không có nội dung” màu đỏ vào các thẻ “td” không có phần tử con.

$("td:empty").text("Không có nội dung!").css('color','red');

:has(selector)

Kiểu trả về: Array<Element(s). Tƣơng ứng với các phần tử bao gồm ít nhất một phần tử phù hợp với định danh selector.

Ví dụ: Đặt cỡ chữ là 30px cho đoạn văn có nằm trong các thẻ “div” có chứa thẻ “p”.

$("div:has(p)").css("font-size", "30px");

:parent

Kiểu trả về: Array<Element(s). Tƣơng ứng với tất cả các phần tử là cha (chứa các phần tử con, gồm cả phần tử văn bản).

b. Các thuộc tính (Attributes) addClass (class)

Kiểu trả về: jQuery. Thêm các class đã xác định vào mỗi tập phần tử phù hợp. Nếu có thêm nhiều class thì các class đƣợc cách nhau bởi khoảng trắng.

Ví dụ: Thêm class “Maudo” vào các thẻ p. $("p").addClass("Maudo");

removeClass (class)

Kiểu trả về: jQuery. Loại bỏ tất cả hoặc các class đã xác định khỏi tập phần tử phù hợp.

Ví dụ: Loại bỏ class “Maudo” khỏi các thẻ p.

Một phần của tài liệu Chuẩn QTI trong các hệ thống sát hạch trắc nghiệm bằng máy tính và triển khai thử nghiệm (Trang 43 - 81)