Định nghĩa và kiểm chứng XML schema bằng RELAX NG và NVDL với <oXyegen/>
Software Engineering
36
White

Ngoc Dao viết ngày 22/03/2016

Schema là thuật ngữ để chỉ định nghĩa về cấu trúc dữ liệu. Từ điển Websters định nghĩa schema là "phác thảo hoặc hình dung khái quát dễ hiểu về một khái niệm nào đó; ví dụ, 5 dấu chấm là schema của số 5".

Cách phổ biến để gói dữ liệu có cấu trúc vào plain text là dùng XML. Để diễn tả cấu trúc của tài liệu XML, người ta dùng XML schema, XML có nhiều ngôn ngữ để diễn tả schema. Tuy vậy, định nghĩa về schema ở trên trên không chính xác lắm cho trường hợp XML, vì tất cả ngôn ngữ schema của XML đều không hề dễ hiểu và chú trọng vào kiểm chứng từng phần nhỏ, hơn là phác thảo hay giúp hình dung khái quát về cấu trúc dữ liệu.

Bài viết này giới thiệu ngắn khái niệm và công cụ liên quan đến kiểm chứng tài liệu XML. Chi tiết hơn, hãy xem tài liệu ở phần tham khảo.

Kiểm chứng là gì?

Khi tiếp nhận thông tin đến từ nguồn nằm ngoài hệ thống, thì hệ thống cần kiểm tra xem thông tin này có hợp lệ hay không, rồi mới xử lí tiếp. Việc này gọi là kiểm chứng.

Best practice được áp dụng rộng rãi là tránh defensive programming. Cụ thể, khi viết các hàm nằm trong cùng hệ thống, lập trình viên không cần viết đoạn mã ở đầu hàm để kiểm tra xem đầu vào có hợp lệ hay không. Chỗ duy nhất cần kiểm tra tính hợp lệ của đầu vào, là khi nhận thông tin từ nguồn nằm ngoài hệ thống.

Ví dụ:

  • Nếu hệ thống là chương trình, thì đầu vào có thể là tập tin, chuỗi kí tự người dùng nhập từ bàn phím, toạ độ chuột.
  • Nếu hệ thống là web server, thì đầu vào có thể là request từ browser.

Như vậy, chỉ cần đầu vào hợp lệ và logic chương trình đúng, thì đảm bảo chương trình sẽ chạy đúng mà không cần tốn công viết đoạn mã để kiểm tra đầu vào cho toàn bộ các hàm nằm trong hệ thống.

Gần gũi hơn, nếu bộ máy nhà nước không được tam quyền phân lập thành 3 hệ thống nhỏ là lập pháp, hành pháp, tư pháp, để mỗi hệ thống bắt buộc phải phải kiểm chứng khi nhận thông tin từ hệ thống khác, thì nhà nước sẽ hoặc phải kiểm chứng mọi nơi mọi lúc (không ai tin ai), hoặc là mớ bòng bong (ai nói cũng tin, không cần kiểm chứng) vì sức lực và năng lực đâu mà làm công việc kiểm chứng vô cùng kém hiệu quả trên. Nếu tất cả nằm chung hệ thống, thì khi ông S bảo "tôi không nhận hối lộ", bộ phận nào của hệ thống có thể kiểm chứng thông tin này một cách minh bạch, khách quan?!

RELAX NG so với các ngôn ngữ khác

XML có cả tá ngôn ngữ schema, ví dụ theo Wikipedia:

Cái lập trình viên Java hay gặp nhất có lẽ là DTD, nó rất cổ và hiện không được khuyến khích sử dụng. XML Schema (chú ý viết hoa, để tránh nhầm với danh từ chung được viết thường) đồ sộ và đầy đủ nhất, nhưng cú pháp của nó dài dòng. RELAX NG là giải pháp dung hoà, cú pháp ngắn gọn và bỏ bớt những tính năng ít dùng trong XML Schema.

NVDL

Có thể trộn lẫn nhiều tài liệu XML có schema khác nhau, để tạo ra một tài liệu XML. Các đoạn XML đến từ tài liệu XML khác nhau phân biệt bằng namespace. Đây là hướng áp dụng XML mới phát sinh khi SOA, điện toán trên mây v.v. phát triển. Các công nghệ này có nhu cầu trộn kết quả của nhiều dịch vụ vào chung một tài liệu XML để chuyển tải thông tin. Hệ quả là xuất hiện nhu cầu kiểm chứng xem tài liệu XML có tuân theo cùng lúc nhiều schema khác nhau hay không. Đây là lí do xuất hiện cái gọi là NVDL.

Ví dụ đoạn NVDL ở dưới định nghĩa luật kiểm chứng sau:

  • Đối với đoạn XML có namespace http://www.w3.org/1999/xhtml, dùng tập tin schema xhtml.rng (viết bằng ngôn ngữ schema RELAX NG) để kiểm chứng.
  • Đối với đoạn XML có namespace http://www.w3.org/2000/svg/, dùng tập tin svg.sch (viết bằng ngôn ngữ schema khác) để kiểm chứng.
  • Nếu xuất hiện đoạn XML có schema khác, thì coi như tài liệu XML không hợp lệ.
<rules xmlns="http://purl.oclc.org/dsdl/nvdl/ns/structure/1.0">
<namespace ns="http://www.w3.org/1999/xhtml">
<validate schema="xhtml.rng"/>
</namespace>
<namespace ns="http://www.w3.org/2000/svg/">
<validate schema="svg.sch"/>
</namespace>
<anyNamespace>
<reject/>
</anyNamespace>
</rules>

<oXygen/>

Đây là chương trình cho phép soạn thảo và kiểm chứng XML bằng tay tiện lợi. Tất nhiên, nếu muốn viết chương trình để tự động kiểm chứng tài liệu XML đến từ dịch vụ "trên mây" nào đó xem có khớp với schema mình muốn hay không, thì phải dùng thư viện nào đó.

Tham khảo

Ghi chú: Integration Database vs. Application Database

Thông thường, có 2 cách sử dụng cơ sở dữ liệu.

  • Integration Database: cùng một cơ sở dữ liệu nhưng nhiều chương trình dùng chung. Các hệ thống cổ thường theo kiểu này. Do đó, việc định nghĩa một schema cố định, khó thay đổi qua thời gian cho cơ sở dữ liệu là không thể tránh khỏi.
  • Application Database: mỗi chương trình có cơ sở dữ liệu riêng. Xu hướng mới là kiểu này, do ảnh hưởng của SOA và điện toán trên mây. Theo hướng này, các chương trình khi cần trao đổi thông tin với nhau, sẽ thông qua API (A: Application) hoặc (web) service. Do mỗi cơ sở dữ liệu chỉ phục vụ cho một chương trình, nên việc định nghĩa schema bất biến qua thời gian là không cần thiết. Đại diện xuất sắc cho loại database server kiểu schemaless này hiện nay (thời điểm cuối 2008) là CouchDB.
Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Ngoc Dao

102 bài viết.
283 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
62 8
Làm thế nào để nâng cấp trang web mà không làm gián đoạn dịch vụ? Đây là câu hỏi phỏng vấn các công ty lớn thường hỏi khi bạn xin vào vị trí làm lậ...
Ngoc Dao viết hơn 2 năm trước
62 8
White
40 1
Bài viết này giải thích sự khác khác nhau giữa hai ngành khoa học máy tính (computer science) và kĩ thuật phần mềm (software engineering), hi vọng ...
Ngoc Dao viết hơn 2 năm trước
40 1
White
34 1
Nếu là team leader, giám đốc công ty hay tướng chỉ huy quân đội, vấn đề cơ bản bạn gặp phải là “hướng mọi người đi theo con đường bạn chỉ ra”. Thử...
Ngoc Dao viết hơn 2 năm trước
34 1
Bài viết liên quan
White
1 1
Lập trình đôi (pair programming) là hình thức lập trình trong đó 2 người cùng hợp tác làm việc trên cùng màn hình (có thể khác bàn phím v.v.). Bài ...
Ngoc Dao viết hơn 2 năm trước
1 1
White
7 1
Trong quyển sách Beyond Java, xuất bản vài năm trước có đoạn:Java has characteristics that many of us take for granted. You can find good Java deve...
Ngoc Dao viết hơn 2 năm trước
7 1
White
5 0
Lập trình viên quá cố người Mỹ Phil Karlton có câu nổi tiếng: There are only two hard things in Computer Science: cache invalidation and naming th...
Ngoc Dao viết hơn 2 năm trước
5 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
102 bài viết.
283 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!