Thứ Hai, 29 tháng 8, 2016

Khai báo Entites trong DTD để tăng tính hiệu quả trong validation tài liệu XML

Khai báo Entites trong DTD để tăng tính hiệu quả trong validation tài liệu XML

Mục đích: Chủ đề của bài này mở rộng DTD với cách khai báo entities nhằm tạo sự thuận lợi trong việc sử dụng dữ liệu, code dùng chung nhiều lần trong xml và khai báo DTD. Qua nội dung tổng quát của lý thuyết, chúng tôi sẽ thực hiện một số ví dụ liên quan nhằm hiểu rõ nội dung của lý thuyết đã đề ra.

Khai báo Entites trong DTD để tăng tính hiệu quả trong validation tài liệu XML

Mục đích: Chủ đề của bài này mở rộng DTD với cách khai báo entities nhằm tạo sự thuận lợi trong việc sử dụng dữ liệu, code dùng chung nhiều lần trong xml và khai báo DTD. Qua nội dung tổng quát của lý thuyết, chúng tôi sẽ thực hiện một số ví dụ liên quan nhằm hiểu rõ nội dung của lý thuyết đã đề ra.

Yêu cầu về kiến thức cơ bản cho các khái niệm về XML

  • Nắm vững các khái niệm về XML và cách viết tài liệu XML well-formed (tham khảo lại bài Giới thiệu về XML – định nghĩa, cách viết XML đúng cú pháp (XML well-formed) http://www.kieutrongkhanh.net/2016/08/gioi-thieu-ve-xml-inh-nghia-cach-viet.html )
  • Nắm vững các khái niệm về DTD, khai báo element – tag và attribute trong DTD và cách thức validation tài liệu XML dùng DTD (tham khảo lại bài Khai báo Element – Tag và Attributes. Sử dụng DTD để kiểm tra tài liệu XML được viết đúng theo đúng định dạng dùng để truy xuất và giao tiếp (validation). http://www.kieutrongkhanh.net/2016/08/khai-bao-element-tag-va-attributes-su.html )
  • Nắm vững khái niệm về ngôn ngữ lập trình Java, lập trình thao tác hướng đối tượng
  • Đã viết và kiểm tra một tài liệu XML well-formed
  • Đã viết DTD và kiểm tra một tài liệu XML validation

Tổng quan DTD - Entity

  • Khai báo entity
    • Entity là cách thức để có thể tham chiếu đến dữ liệu được sử dụng lặp đi lặp lại nhiều lần mà không phải viết quá nhiều, tương tự như khái niệm macro hay biến hằng trong c/c++ hay khái niệm kế thừa trong lập trình hướng đối tượng
    • Entity có thể là
      • Một chuỗi ký tự hay tag name hay tài liệu XML - entity có thể parse bởi bộ parser – gọi là reference entity
      • Cũng có thể một dạng đặc biệt như MIME hay nhị phân – entity mà không thể parse bởi bộ parser – gọi là unparsed entity
    • Mỗi entity là một khoảng để có thể điền thông tin – placeholder – bao gồm tên điền và trị của nó. Mỗi lần bộ parser tìm thấy khai báo reference entity trong XML, parser sẽ tìm kiếm nội dung có liên quan đến tên tham chiếu và thay thế bởi trị cho tên đó và đưa kết quả đến chương trình ứng dụng
    • Entity có thể là một tài liệu hay một phần tài liệu XML – gọi là XML fragment – hướng tới hỗ trợ lắp ráp các thành phần XML lại với nhau
    • Entity cũng có thể là một phần tài liệu DTD hay toàn bộ tài liệu DTD được tái sử dụng lại để nhúng vào DTD khác, overriding hay kế thừa hay tái sử dụng lại để tạo ra tài liệu DTD hay filter những thành phần cần thiết
    • Tất cả entity phải được khai báo trước khi sử dụng.
    • Entity được khai báo trong prolog hay trong tập tin dtd (internal entity)  hay được tham chiếu từ tập tin dtd khác ngoài tập tin dtd hiện hành (external entity)
    • Một số entity chỉ được
      • Sử dụng trong thành phần tài liệu DTD hay khai báo DTD – gọi là parameter entity
      • Sử dụng trong phần tài liệu XML – gọi là general entity
    • Parser đưa ra một số entity định nghĩa sẵn để hỗ trợ mặc định có sẵn cho người dùng sử dụng mà không cần khai báo gì cả – gọi là predefined entity

Ký tự

Mô tả

Cách sử dụng

&

Dấu &

&

<

Nhỏ hơn

&lt;

>

Lớn hơn

&gt;

"

Nháy kém

&quot;

'

Nháy đơn

&apos;

    • Các dạng cú pháp khai báo entity được phân loại thành 5 loại

Loại

Mô tả & cú pháp khai báo trong DTD & cú pháp sử dụng

Internal Parsed General Entities

Dạng reference entity được parser parse và được khai báo trong phần prolog tài liệu XML hay trong phần DTD

Cú pháp: <!ENTITY tên_entity “giá trị”>

Sử dụng phần thân của tài liệu XML: &tên_entity;

External Parsed General Entities

Dạng reference entity được parser parse được khai báo trong tài liệu DTD khác tài liệu đang xử lý

Cú pháp: <!ENTITY tên_entity SYSTEM|PUBLIC “uri”>

Sử dụng phần thân của tài liệu XML: &tên_entity;

External Unparsed General Entities

Dạng entity không được parser parse dùng để tham chiếu đến dạng dữ liệu MIME hay nhị phân

Cú pháp:<!ENTITY tên_entity SYSTEM|PUBLIC “uri” NDATA tên_tham_chiếu_hay_NOTATION>

Sử dụng phần thân của tài liệu XML: tên_entity với kiểu dữ liệu của các thuộc tính được  định nghĩa là ENTITY hay ENTITIES

Internal Parsed Parameter Entities

Dạng parameter entity được parser parse và dùng để tái sử dụng nhiều lần trong định nghĩa của DTD và được định nghĩa ngay trong tài liệu xử lý hiện hành

Cú pháp: <!ENTITY % tên_entity “giá trị”>

Sử dụng trong tài liệu DTD hay định nghĩa DTD trong prolog: %tên_entity;

External Parsed Parameter Entities

Dạng parameter entity được parser parse và dùng để tái sử dụng nhiều lần trong định nghĩa của DTD và được định nghĩa bên ngoài tài liệu xử lý hiện hành

Cú pháp: <!ENTITY % tên_entity SYSTEM|PUBLIC “uri”>

Sử dụng trong tài liệu DTD hay định nghĩa DTD trong prolog: %tên_entity;

 

Vận dụng các kiến thức về DTD ở trên để áp dụng vào xây dựng tài liệu DTD, sau đó dùng tài liệu DTD để kiểm tra tính ràng buộc cho tài liệu XML trong một số ví dụ bên dưới

  • Yêu cầu
    • Nắm vững các khái niệm về XML (tham khảo lại bài Giới thiệu về XML – định nghĩa, cách viết XML đúng cú pháp (XML well-formed))
    • Nắm vững các khái niệm về DTD -  Element và attribute (tham khảo bài Khai báo Element – Tag và Attributes)
    • Nắm vững các khái niệm về DTD - Entity đã nêu ở trên
    • Tools sử dụng ở đây là Netbeans 6.9.1
    • JDK 6 update 22
  • Các bước thực hiện
    • Tạo Java Application hay Web Application, tạo DTD và / hay XML như bài Khai báo Element – Tag và Attributes
      • Khi gõ xong rồi chúng ta nên kiểm tra cú pháp gõ DTD đúng hay sai,chúng ta nhấn phải chuột ngay trên DTD và chọn check DTD
    • Sau đó tạo tập tin XML để gõ nội dung tương tự như bài Giới thiệu về XML – định nghĩa, cách viết XML đúng cú pháp (XML well-formed)
    • Ngoài cách nêu trên để tạo external DTD, chúng tạo DTD nhúng trong  XML, chúng ta tạo tập tin XML để gõ nội dung tương tự như bài Giới thiệu về XML – định nghĩa, cách viết XML đúng cú pháp (XML well-formed)
    • Ở đây chúng ta sẽ vẫn sử dụng cách check validation để kiểm tra tài liệu XML phù hợp với DTD được khai báo bằng cách nhấn phải chuột trực tiếp trong code XML, chọn Validate XML
    • Các bài ví dụ hướng tới là sử dụng định nghĩa về DTD - Entities áp dụng cho cả 02 trường hợp đúng và sai so với khái niệm và sử dụng thực tế
  • Các ví dụ
    • Ví dụ 1

      • Ví dụ này phát sinh lỗi là do chúng ta dùng ký tự nháy đôi chèn giữa thuộc tính, ký tự này được hiểu là bao giá trị attribute, theo nghĩa là dùng thuộc tính có giá trị nhưng không có tên attribute

      • Chúng ta sẽ khắc phục lỗi này bằng cách dùng entity để thay thế mà vẫn giữ nguyên nội dung của giá trị thuộc tính như mong muốn

 

    • Ví dụ 2

 

    • Ví dụ 3

      • Ví dụ này, chúng tôi định nghĩa các entity và sử dụng lại chúng để cho thấy khả năng tái sử dụng ở nhiều chỗ như khái niệm macro hay biến hằng trong ngôn ngữ C/C++ hay Java

 

    • Ví dụ 4

      • Đây là ví dụ chúng ta sử dụng định nghĩa trùng  lắp entity name. Kết quả là entity đầu tiên được lựa chọn

    • Ví dụ 5

      • Ví dụ này chúng ta đang sử dụng entity unparsed là logo còn entity parse là wwwc. Một điều đơn giản là chúng ta sử dụng entity unparse logo vì chúng ta đang reference đến hình ảnh thông qua vị trí lưu trữ hình ảnh được định nghĩa trong NOTATION. Hình ảnh là dạng nhị phân không thể insert trực tiếp vào trong XML mà phải thông qua lưu trữ vị trí chứa hình
      • Khái niệm này tương tự chúng ta xây dựng ứng dụng với DB, chúng ta không bao giờ nhúng hình vào trong DB mà chỉ lưu trữ đường dẫn và đến khi xử lý chúng ta mới lấy đường dẫn và đưa vào các control giao diện để hiển thị
      • Một khái niệm cũng cho thấy rõ sự cần thiết phải có entity unparsed, dó là MS Word từ 2003 trở về trước, khi chúng ta chèn hình thì hình sẽ chuyển thành nhị phân và insert trực tiếp vào file làm kích thước file word lớn hơn rất nhiều. Trong khi từ 2007 trở đi thì MS. Word tách hình ảnh riêng ra và chỉ lưu trữ đường dẫn tại thư mục hiện hành
      • Ngoài ra ví dụ này cũng mô tả kiểu dữ liệu dùng trong attributes là ENTITY

 

      • Chúng ta nhận thấy rằng khi view chúng ta chỉ thấy tên entity mà không xuất hiện hình vì XML đang tổ chức lưu trữ dữ liệu và người dùng khai thác theo mục đích của mình để xử lý. XML không làm nhiệm vụ trình bày dữ liệu
    • Ví dụ 6

      • Ví dụ này không validation vì sử dụng  một entity unparse chưa định nghĩa là logo1

    • Ví dụ 7

      • Ví dụ này cho thấy lỗi khi cố tình sử dụng ký hiệu của entity parse cho một kiểu dữ liệu attribute và entity là unparsed

 

      • Tương tự cho ví dụ bên dưới

 

 

      • Tương tự cho việc dùng parse cho unparse ở vị trí không khai báo entity

 

    • Ví dụ 8

      • Ví dụ trên mô tả cách thức sử dụng nhiều hơn một entity với kiểu dữ liệu của attributes là entities

 

    • Ví dụ 9

      • Ví dụ trên thể hiện sử dụng parameter entity để tái sử dụng những thành phần được định nghĩa lặp đi lặp lại nhiều lần, cụ thể là common.attribute với 02 attribute id và account
      • Sau đó apply vào tài liệu xml

 

    • Ví dụ 10

      • Chúng ta sẽ tái sử dụng lại dtd trên để kế thừa và mở rộng như lập trình hướng đối tượng và thể hiện tính mạnh mẽ nó hơn phần sử dụng combine của bài khai báo Element và Attribute

      • Check tài liệu XML và kết quả

 

    • Ví dụ 11

      • Ví dụ này cho thấy parameter entity phải được định nghĩa trước khi sử dụng

      • Tương tự như thế cho external DTD, nhưng đối external, định nghĩa trước check DTD vẫn bình thường nhưng khi apply tài liệu XML mới có lỗi

      • Apply vào tài liệu XML thì xuất hiện lỗi

 

    • Ví dụ 12

      • Ví dụ này cho thấy nếu dùng parameter entity nhúng trực tiếp trong tài liểu XML thì nó ko được sử dụng trong định nghĩa attributes

      • Nhưng nếu sử dụng định nghĩa và sử dụng lại trong DTD trong nhúng XML mà không có bất kỳ sử dụng lại trong khai báo của Element hay Attribute thì vấn đề là bình thường

 

Chúc mừng các bạn đã hoàn tất và nắm các khái niệm về sử dụng entity trong DTD và ứng dụng nó trong tài liệu XML. Chúng ta sẽ áp dụng nó trong các nội dung tiếp theo của chủ đề liên quan đến khái niệm và sử dụng XML

Chúng tôi hy vọng nội dung của bài này giúp ích các bạn trong việc cài đặt DTD để validation tài liệu XML.

Rất mong sự góp ý chân thành và chia sẻ của quí vị về vấn đề này. Hẹn gặp lại quý vị ở các chủ đề liên quan đến XML, cụ thể sẽ là vấn đề liên quan đến việc xây dựng XML Schema.

Không có nhận xét nào:

Đăng nhận xét