Thứ Hai, 29 tháng 8, 2016

Giới thiệu về XML Schema – định nghĩa, cách viết XML Schema, áp dụng XML Schema cho validation nội dung của tài liệu XML

Giới thiệu về XML Schema – định nghĩa, cách viết XML Schema, áp dụng XML Schema cho validation nội dung của tài liệu XML

Mục đích: Chủ đề của bài này mở rộng cách thức validation tài liệu XML với XML Schema với những điểm tối ưu hơn DTD. XML Schema với khả năng cho phép định nghĩa kiểu dữ liệu mới từ kiểu dữ liệu có sẵn và thể hiện tính kế thừa và đa hình của hướng đối tượng trong thiết kế phần mềm và ngôn ngữ lập trình. 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.

Giới thiệu về XML Schema – định nghĩa, cách viết XML Schema, áp dụng XML Schema cho validation nội dung của tài liệu XML

Mục đích: Chủ đề của bài này mở rộng cách thức validation tài liệu XML với XML Schema với những điểm tối ưu hơn DTD. XML Schema với khả năng cho phép định nghĩa kiểu dữ liệu mới từ kiểu dữ liệu có sẵn và thể hiện tính kế thừa và đa hình của hướng đối tượng trong thiết kế phần mềm và ngôn ngữ lập trình. 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

  • 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 các khái niệm và khai báo entity trong DTD (tham khảo lại bài Khai báo Entites trong DTD để tăng tính hiệu quả trong validation tài liệu XML http://www.kieutrongkhanh.net/2016/08/khai-bao-entites-trong-dtd-e-tang-tinh.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 XML Schema

  • Sau khi đi qua nội dung validation tài liệu XML dùng DTD trong bài trước chúng ta nhận thấy DTD còn một số khuyết điểm mà không thể tiếp cận với ngôn ngữ lập trình và validation dữ liệu hay tạo ràng buộc tương tự như các trình DBMS hay RDBMS – chương trình quản lý CSDL quan hệ như MS. SQL 2005, Oracle, DB2, ….
  • Các khuyết điểm đó là
    • Khi sử dụng DTD, chúng ta phải viết và nghiên cứu một ngôn ngữ mới không tương thích dạng chuẩn không tuân theo qui tắc các viết của XML
    • DTD chưa hỗ trợ namespace trong khai báo. Việc phối hợp và kế thừa của DTD phải thông qua việc phối hợp giữa DTD external với DTD internal hay phải sử dụng parameter entity. Tuy nhiên, chúng không thể hiện được theo một cách thông thường mà nhìn có vẻ cưỡng ép
    • DTD chưa cung cấp kiểu dữ liệu cụ thể cho phần element và attribute cho dù element có content model và 10 kiểu dữ liệu. Nhưng tất cả chúng là kiểu chung chung – hay nói cách khác, chúng là kiểu dữ liệu chữ - text sẽ được parse hay không được parse với bộ parser
    • Phần DTD chưa thiết lập được giá trị mặc định của element (DTD mới cho phép thiết lập các ràng buộc trên các attribute)
  • XML Schema
    • Một tài liệu dùng để validation tài liệu XML viết theo cú pháp của XML tương tự tính năng của DTD
    • Các nội dung trong tài liệu XML Schema được validation nội dung và cú pháp bởi tài liệu DTD. Đứng về khía cạnh thuận lợi thì XML Schema sẽ tạo thuận lợi cho người dùng, nhưng đứng về khía cạnh tổng quát, bản chất của XML Schema cũng là DTD
    • XML Schema sẽ làm được tất cả những gì DTD có thể làm được ngoài ra Schema còn thể hiện nhiều tính chất và đặc điểm tốt hơn so với DTD, nói cách khác, Schema sẽ khắc phục những nhược điểm của DTD
    • Schema cho phép định nghĩa kiểu dữ liệu mới, tạo sự kế thừa, tính đa hình, nhóm các kiểu dữ liệu lại với nhau, giới hạn lại kiểu dữ liệu có sẵn và tạo nên ràng buộc của các element và attribute hướng tới tạo cấu trúc cho tài liệu XML. Ngoài ra, cho phép tích hợp nhiều Schema thông qua cơ chế hỗ trợ namespace
  • Cấu trúc tài liệu XML Schema
    • Tương tự như cấu trúc tài liệu XML nhưng thành phần khai báo trong tài liệu phải được validation từ các thành phần chuẩn được qui định sẵn
    • Tập tin được lưu trữ dưới dạng tập tin văn bản bình thường có phần mở rộng là xsd
    • Sau khi khai báo xml declaration đến phần khai báo schema rồi đến các thành phần định nghĩa tương tự như DTD
      • Element schema sẽ là nút root cho tài liệu XML Schema
      • Khai báo xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        • Cú pháp các element và kiểu dữ liệu được dùng trong schema sẽ được tham chiếu và kiểm chứng tại địa chỉ http://www.w3.org/2001/XMLSchema
        • Tất cả các element và kiểu dữ liệu được sử dụng phải bắt đầu bằng prefix xsd
      • Khai báo targetNamespace=“namespace_uri"
        • Định nghĩa uri namespace cho tài liệu đang khai báo để có thể sử dụng lại trong các tài liệu khác
        • Khái niệm bên trên có thể coi tương đương như chúng ta khai báo package cho class trong java để sử dụng lại trong các class khác với dòng khai báo import (ở đây là khai báo prefix với namespace được định nghĩa)
      • Khai báo xmlns=“namespace_uri"
        • Tương tự khái niệm của java class, đó là khi sử dụng lại phải import nhưng trong java class, trong cùng lớp đang khai báo thì không cần import.
        • Tuy nhiên, trong XML Schema khác hoàn toàn với ngôn ngữ, ở đây sẽ phải khai báo lại namespace để khi dùng các giá trị đang định nghĩa ngay cả trong khi đang trong tập tin khai báo (cụ thể namespace ở đây được khai báo là default namespace)
      • Khai báo elementFormDefault="qualified"
        • Thể hiện rằng khi tài liệu XML áp dụng tài liệu Schema này sẽ phải dùng khai báo prefix kết hợp với uri namespace đã được định nghĩa trong target namespace
    • Ví dụ

  • Cách viết tài liệu XML áp dụng tài liệu Schema đã khai báo
    • Trong tài liệu XML phải xác định cụ thể tài liệu schema nào đang được validation thông qua việc xác định tập tin schema và các định nghĩa các prefix kết hợp với uri namespace
    • Sau đó định nghĩa cấu trúc tài liệu xml
    • Các khai báo được sử dụng trong xml để áp dụng được thể hiện trong các nội dung tiếp theo
    • Tài liệu xml với phần root element với phần khai báo bao gồm các thành phần
      • Khai báo xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
        • Xác định một số giá trị sẽ được áp dụng trong tài liệu xml như hằng số trong các ngôn ngữ hay việc xác định tập tin cần validation trong phần định nghĩa tiếp theo
      • Khai báo xmlns=“http://xml.netbeans.org/schema/mail”
        • Định nghĩa namespace tham chiếu tới tài liệu schema cần áp dụng thông qua một prefix cụ thể (ở đây là default namespace)
      • Khai báo xsi:schemaLocation=“namespace_uri instance
        • Dùng để xác định namespace của một schema được validation với nội dung của một tập tin cụ thể
        • Dòng khai báo gồm 02 thành phần, tên namespace và vị trí tập tin schema
    • Ví dụ

  • Cú pháp khai báo của các thành phần trong tài liệu schemas
    • Khai báo Element: bao gồm nhiều dạng
      • Khai báo một element chỉ chứa text mà không chứa thuộc tính nào và không chứa element con nào cả (simple type)
        • Thành phần text có 02 dạng
          • Built-in: được schema chuẩn cung cấp sẵn bao gồm 02 loại
            • Primitive: những kiểu dữ liệu cơ bản tương tự như kiểu int, long, float, double như của java
            • Derived: những kiểu được tạo ra từ những kiểu cơ bản hay là một phần của kiểu cơ bản hay cùng nhóm loại như là short với int, char với string, … trong ngôn ngữ java và c/c++
          • User-Derived: cũng được schema chuẩn cung cấp dẵn nhưng có thể nhóm nhiều kiểu dữ iệu hay chứa nhiều hơn một giá trị
            • Atomic: kiểu dự liệu không thể chia nhỏ như kiểu int, long, double, …
            • Non-atomic: cho phép chứa nhiều hơn 1 trị như Array hay Collection trong java
      • Khai báo với element có thể chứa text với thuộc tính, element chứa kiểu text và có ràng buộc về kiểu dữ liệu, hay là element có chứa element khác, chứa attribute, lồng nhiều cấp … ở đây chính là kiểu do người dùng định nghĩa
        • Empty: element không có thân nhưng có thể có attribute
        • Simple Context: là element có thân là text và được dẫn xuất hay mở rộng từ kiểu dữ liệu có sẵn
        • Complex Content: element chứa thân với đủ loại từ text đến element và có thể chứa attribute …
    • Mô hình tổng quát được thể hiện tổng quát bên dưới

    • Chúng ta đi chi tiết từng loại cùng với cách khai báo và sử dụng
      • Simple Type: có 02 cách khai báo
        • Khai báo mới:

<xsd:element name=“element_name" type=“data_type"/>

          • Cụ thể xác định tên thông qua thuộc tính name và xác định kiểu dữ liệu thông qua thuộc tính type
        • Tham chiếu đến một khai báo đã có sẵn để tái sử dụng, hạn chế khai báo lặp đi lặp lại nhiều lần, gây trùng lắp:
          <xsd:element ref=“referenced_element_name”/>
          • Xác định tham chiếu đến tên element khai báo thông qua thuộc tính ref
      • Simple Type cho phép khai báo giá trị default, fix tương tự như DTD khai báo cho attribute nhưng ở đây schema cho khai báo áp dụng đến element
        • <xsd:element name=“element_name" type=“data_type“ default=“default_value”/>
          • Xác định giá trị default thông qua thuộc tính default
        • <xsd:element name=“element_name" type=“data_type“ fixed=“fixed_value”/>
          • Xác định giá trị không thay đổi từ lúc khai báo và trong quá trình sử dụng được thể hiện qua thuộc tính fixed
          • Lưu ý: Giá trị khai báo default và fixed không tồn tại cùng nhau, nếu tồn tại cũng nhau sẽ gây lỗi khi checking tài liệu schema đúng ngữ pháp
      • Đặc biệt hơn cả, element trong schema được cho phép khai báo để gán giá trị là null tương tự như không gán trị cho một số object trong trong ngôn ngữ java hay con trỏ - pointer trong c/c++
        • <xsd:element name=“element_name" type=“data_type“ nillable=“true|false”/>
          • Giá trị cho phép null thể hiện qua thuộc tính nillable
          • Và khi xử dụng trong tài liệu xml, element đó phải dùng thuộc tính từ instance schema là xsi:nil và gán bằng true
      • Các kiểu dữ liệu được định nghĩa trong Schema
        • Kiểu String
          • Tập hợp các ký tự và có hỗ trợ Unicode
          • Kiểu cơ bản là string với cú pháp xsd:string
          • Thành phần kiểu dẫn xuất của string được thể hiện trong cấu trúc bên dưới

          • Mô tả của các thành phần dẫn xuất của string

Kiểu

Mô tả

normalizedString

- Chứa đựng toàn bộ chuỗi ký tự được nhập vào hay được đặt trong tài liệu xml.

- Cú pháp: xsd:normalizedString

token

- Chuỗi sẽ được loại bỏ đi các ký tự như  line feeds, carriage returns, tabs, các khoảng trắng trước và sau chuỗi, các khoảng trắng dư thừa trong chuỗi

- Cú pháp: xsd:token

language

- Một chuỗi chứa được dạng ngôn ngữ qui định bao gồm tối thiểu có từ 1 đến 8 ký tự hay có từ 1 đến 16 ký và được phân cách ở giữa 8 ký tự bởi dấu -.

- Cú pháp: xsd:language

NMTOKEN

- Tương tự kiểu quy định trong DTD.

- Cú pháp: xsd:NMTOKEN

NMTOKENS

List of NMTOKEN values separated by whitespace (only used - Tương tự kiểu quy định trong DTD.

- Cú pháp: xsd:NMTOKENS

Name

- Chuỗi chứa đựng các ký tự tuân thủ quy tắc đặt tên element của XML.

- Cú pháp: xsd:Name

QName

- Trình bày chuỗi có phân cách bởi dấu :

- Cú pháp: xsd:Qname

NCNAME

-  Trình bày chuỗi mà không được phép dấu : trong chuỗi

- Cú pháp: xsd:NCName

ID

- Tương tự như DTD.

- Cú pháp: xsd:ID

IDREF

- Tương tự như DTD.

- Cú pháp: xsd:IDREF

IDREFS

- Tương tự như DTD.

- Cú pháp: xsd:IDREFS

ENTITY

- Tương tự như DTD.

- Cú phápxsd:ENTITY

ENTITIES

- Tương tự như DTD.

- Cú phápxsd:ENTITIES

        • Kiểu Boolean
          • Thể hiện 02 giá trị true (1) và false (0)
          • Cú pháp: xsd:Boolean
        • Kiểu dữ liệu Binary
          • Thể hiện kiểu dữ liệu không thể trình bày như hình ảnh, chương trình …
          • Cú pháp: xsd:hexBinary (sử dụng hexa encoding) hay xsd:base64Binary (sử dụng 64 base encoding)
        • Kiểu dữ liệu anyURI
          • Xác định địa chỉ URI
          • Cú pháp: xsd:anyURI
        • Kiểu dữ liệu NOTATION
          • Tương tự như DTD
          • Cú pháp: xsd:NOTATION
        • Kiểu dữ liệu numeric
          • Chứa kiểu dữ liệu số với kiểu cơ bản là decimal
          • Cú pháp xsd:decimal
          • Với các kiểu dẫn xuất

          • Mô tả các kiểu dữ liệu và cú pháp áp dụng tương tự như sơ đồ nêu trên với từ xsd:kiểu
        • Kiểu dữ liệu ngày giờ
          • Thể hiện định dạng format theo dạng ngày giờ

Kiểu

Mô tả

dateTime

- Trình bày dạng ngày tháng với định dạng CCYY-MM-DDThh:mm:ss.sss  

- Trong đó CC là 02 số thể hiện thế kỷ và chữ T là ký hiệu phân biệt giữa ngày và giờ

- Cú pháp: xsd:dateTime

date

- Trình bày ngày tháng có dạng CCYY-MM-DD.

- Cú pháp: xsd:date

time

- Trình bày dạng thời gian có dạng hh:mm:ss.sss.

- Cú pháp:  xsd:time

duration

- Trình bày dạng khoảng thời gian với dạng PnYnMnDTnHnMnS.

- Trong đó P là ký hiệu để bắt đầu khoảng thời gian, n là số điền vào

- Cú pháp:  xsd:duration

gYearMonth

- Trình bày kiểu dữ liệu tháng năm dạng CCYY-MM.

- Cú pháp:   xsd:gYearMonth

gYear

- Trình bày kiểu dữ liệu tháng có định dạng

- Cú pháp:  xsd:gYear

gMonthDay

- Trình bày kiểu dữ liệu tháng ngày có dạng --MM-DD.

- Cú pháp:   xsd:gMonthDay

gDay

- Trình bày dạng dữ liệu ngày dạng ---DD.

- Cú pháp:  xsd:gDay

gMonth

- Trình bày kiểu dữ liệu dạng tháng dạng  --MM--.

- Cú pháp:   xsd:gMonth

      • Định nghĩa kiểu dữ liệu dẫn xuất từ kiểu Simple type
        • Đây là kiểu giới hạn kích thước dữ liệu từ kiểu cơ bản hay kiểu dẫn xuất được cung cấp sẵn bởi schema
        • Cú pháp:

<xsd:simpleType name=”tên kiểu dữ liệu mới”>

<xsd:restriction base=”kiểu dữ liệu cơ bản hay dẫn xuất”>

</xsd:restriction>

</xsd:simpleType>

      • Kiểu dữ liệu non-atomic
        • Có 02 kiểu tất cả
        • Lists
          • Liệt kê các thành phần đúng theo kiểu dữ liệu cơ bản và được phân cách bởi các whitespace
          • Cú pháp

<xsd:simpleType name=“tên kiểu dữ liệu mới ">

<xsd:list itemType=“kiểu dữ liệu"/>

</xsd:simpleType>

        • Unions
          • Nhóm một hay nhiều kiểu dữ liệu lại với nhau
          • Cú pháp

<xsd:simpleType name=“ tên kiểu dữ liệu mới ">

            <xsd:union memberTypes=“danh sách kiểu dữ liệu cách nhau bằng whitespace"/>

</xsd:simpleType>

      • Khai báo attribute
        • Attribute bản chất là kiểu dữ liệu simple type. Tuy nhiên, khi attribute kết hợp với element nó sẽ tạo thành kiểu dữ liệu phức hợp
        • Các khai báo của attribute sẽ khác với DTD vì dạng định nghĩa tag của XML thì attribute là con của tag hay element nào thì nó sẽ là attribute của element đó
        • Cú pháp

<xsd:attribute name=“tên attribute" type=“kiểu dữ liệu"/>

        • Cho phép định nghĩa giá trị mặc định và giá trị hằng tương tự DTD và element của schema
          • Default

<xsd:attribute name=“attr_name" type=“data_types“ default=“value”/>

          • Fixed

<xsd:attribute name=“attr_name" type=“data_types“ fixed=“value”/>

          • Default và Fixed sẽ không bao giờ tồn tại cùng nhau
        • Thuộc tính không có giá trị null hay nil như element nhưng attribute được định nghĩa là bắt buộc có hay là không thông qua thuộc tính use

<xsd:attribute name=“attr_name" type=“data_types“ use=“required” [fixed=“value”]/>

      • Facets
        • Định nghĩa restriction hay giới hạn kiểu dữ liệu sẵn có áp dụng cho kiểu dẫn xuất từ simple type
        • Cú pháp

<xsd:restriction base=“Kiểu cơ bản”>

      <xsd:facet_element value=“ràng buộc”/>

      …

</xsd:restriction>

        • Có 12 facets tất cả

Ràng buộc

Mô tả

enumeration

- Định nghĩa một danh sách giá trị chọn lựa.

- Cú pháp: xsd:enumeration

fractionDigits

- Xác định số ký số thập phân

- Cú pháp:  xsd:fractionDigits

totalDigits

- Xác định số ký số xuất hiện.

- Cú pháp: xsd:totalDigits

length

- Xác định chính xác kích thước chuỗi trình bày.

- Cú pháp: xsd:length

maxExclusive

- Xác định trị nhỏ hơn giá trị max

- Cú pháp: xsd:maxExclusive

minExclusive

- Xác định trị nhỏ hơn giá trị min

- Cú pháp: xsd:minExclusive

maxInclusive

- Xác định trị nhỏ hơn hay bằng giá trị max

- Cú pháp: xsd:maxInclusive

minInclusive

- Xác định trị nhỏ hơn hay bằng giá trị min

- Cú pháp: xsd:minInclusive

minLength

- Xác định giá trị chiểu dài nhỏ nhất của chuỗi xuất hiện

- Cú pháp: xsd:minLength

maxLength

- Xác định giá trị chiều dài lớn nhất của chuỗi xuất hiện

- Cú pháp: xsd:maxLength

pattern

- Xác định chuỗi regular expression ứng dụng cho giá trị trong xml

- Cú pháp: xsd:pattern

whitespace

- Loại bỏ hay để lại whitespace

- Có 3 trị bao gồm preserve (giữ nguyên giá trị của chuỗi), replace (thay thế tab, line feed, carriage return với khoảng trắng), hay collapse (thay thế nhiều khoảng trắng với một khoảng trắng, bỏ đi các khoảng trắng bắt đầu và kết thúc chuỗi

- Cú pháp: xsd:whitespace

      • Kiểu dữ liệu Complex Type
        • Có 4 kiểu tất cả
        • Kiểu Empty: chứa đựng element không có thân và có thể chứa attribute
        • Kiểu Only Element: một element chứa đựng các element bên trong nhưng không chứa bất kỳ thuộc tính nào
        • Kiểu Text-Only hay gọi là Simple Content: Kiểu element chứa thân với attribute. Dữ liệu là kiểu dẫn xuất bằng cách mở rộng – extend hay giới hạn – restriction kiểu có sẵn
        • Kiểu Mixed: trộn lẫn giữa element và chuỗi tương tự như kiểu (PCDATA|element)* trong định nghĩa DTD
        • Ngoài kiểu Simple Content, tất cả các kiểu còn lại là Complex Content. Complex content có thể giới hạn hay mở rộng từ các 4 kiểu qui định nêu trên. Kiểu Complext Content bao hàm kiểu Simple Contents
        • Có 02 cách định nghĩa complex type
          • Kiểu sử dụng 1 lần – định nghĩa trực tiếp trong element

<xsd:element name=“tên element">

<xsd:complexType>
            <xsd:sequence>
                <xsd:element name=“tên" type=“kiểu"/>
                …
            </xsd:sequence>
</xsd:complexType>

< /xsd:element>

          • Định nghĩa kiểu dữ liệu rồi tham chiếu vào element. Cách này dùng tái sử dụng lại element

<xsd:element name=“tên" type=“kiểu mới định nghĩa"/>
<xsd:complexType name=“ kiểu mới định nghĩa ">
            <xsd:sequence>
               <xsd:element name=“tên" type=“kiểu"/>
               …
            </xsd:sequence>

< /xsd:complexType>

      • Định nghĩa liên quan số lần xuất hiện và thứ tự xuất hiện trong schema
        • Order Indicator
          • Xác định thứ tự của các element xuất hiện trong tài liệu xml
          • All: các element xuất hiện theo bất kỳ thứ tự nào
          • Choice: chỉ một trong các element xuất hiện tương ứng với dấu | trong DTD
          • Sequence: các element phải xuất hiện tuần tự như khai báo, tương tự như dấu phẩy trong DTD
        • Occurrence indicator
          • Xác định số lần xuất hiện của các element trong tài liệu XML tương tự như ký hiệu content model ?, *, + trong DTD
          • Hai giá trị attribute được sử dụng, đó là minOccurs và maxOccurs
          • Khi không khai báo gì cả, mặc định 02 attribute có giá trị là 1
          • minOccurs: thể hiện số lần xuất hiện tối thiểu
          • maxOccurs: thể hiện số lần xuất hiện tối đa
        • Group indicator
          • Để nhóm những thành phần tương tự với nhau để tái sử dụng lặp đi lặp lại nhiều lần theo dạng viết hàm – thủ tục trong các ngôn ngữ.
          • Schema hổ trợ cơ chế nhóm element hay nhóm attribute lại với nhau
          • Cú pháp nhóm Element

<xsd:group name="group_name">
...

< /xsd:group>

          • Cú pháp nhóm Attribute

<xsd:attributeGroup name="group_name">
...

< /xsd:attributeGroup>

          • Cách gọi nhóm
            • Element: <xsd:group ref=“group_name”/>
            • Attribute: <xsd:attributeGroup ref=“”/>
      • Tính kế thừa hay mở rộng trong schema
        • Cho phép kế thừa kiểu dữ liệu có sẵn hay mở rộng kiểu dữ liệu hiện có ra và tích hợp thêm những đặc tính mới
        • Cho phép tạo ra kiểu dữ liệu trừu tượng chưa định nghĩa chi tiết, khi nào cần định nghĩa chi tiết sẽ kế thừa và mở rộng kiểu trừu tượng ra
        • Cú pháp

<xsd:extension base=“kiểu dữ liệu cơ bản”>

            …

</xsd:extension>

        • Cú pháp khai báo kiểu trừu tượng chưa được cài đặt và không thể sử dụng thông qua thuộc tính abstract được gán bằng true

<xsd:complexType name=“kiểu dữ liệu mới” abstract=“true”>

            …

</xsd:complexType>

        • Thực hiện cài đặt bằng cách dùng cú pháp extension ở trên
        • Khi sử dụng trong tài liệu xml sử dụng giá trị xsi:Type để gán kiểu dữ liệu cụ thể được cài đặt trong XML Schema

<element_Name xsi:type=“derivedType”>

</element_Name>

      • Để cho phép định nghĩa kiểu dữ liệu bất kỳ trong element, chúng ta dùng ANY trong DTD, ở đây schema cũng hỗ trợ chúng ta điều đó để hướng tới tích hợp nhiều tài liệu schema vào trong tài liệu XML và chứa thành phần chưa định nghĩa trong tài liệu hiện hành
        • Cú pháp <xsd:any/>
        • Tương tự schema còn hỗ trợ any cho element, ưu điểm vượt lên DTD với cú pháp <xsd:anyAttribute/>
      • Để tạo khái niệm cho phép đa ngôn ngữ - I18n trong lúc xây dựng ứng dụng và cách giao tiếp tài liệu có thể bất cứ theo định dạng tag nào thì schema định nghĩa substitution group cho element lẫn attribute để dùng element tên khác nhau những có cùng chung ngữ nghĩa
        • Cú pháp
          • Định nghĩa element

<xsd:element name=“element_name” type=“data_type” [block=“substitution”]/>.

          • Nếu không muốn có nhiều tag cùng ngữ nghĩa tag đang định nghĩa dùng attribute block
          • Định nghĩa tiếp element có tên khác nhưng cùng ngữ nghĩa nhưng dùng attribute substitutionGroup gán với tên element định nghĩa trước đó

<xsd:element name=“alternative_name” substitutionGroup=“element_name” />

  • Chúng ta đã hoàn tất lý thuyết cơ bản của XML Schema.

Vận dụng các kiến thức về Schema ở trên để áp dụng vào xây dựng tài liệu Schema, sau đó dùng tài liệu Schema để 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 (tham khảo bài Khai báo Element – Tag và Attributes, và bài Khai báo Entites trong DTD để tăng tính hiệu quả trong validation tài liệu XML)
    • Nắm vững các khái niệm về Schema đã 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
    • Netbeans 6.9.1 không hỗ trợ sử dụng schema, do vậy, chúng ta cần add plugin vào bên trong Netbeans như sau
      • Chọn Tools, click chọn Plugin
      • Chọn tab Settings, nhấn nút Add để đưa vào địa chỉ bổ sung cho việc Update Center

      • Click OK

      • Chọn qua tab Available Plugin, nhấn nút Reload Catalog
      • Chờ Reload Catalog xong, tìm chọn XML Schema và WSDL và click nút Install

      • Thực hiện các bước tiếp theo để install hoàn tất

 

 

 

  • Tạo ứng dụng Java Application hay Web Application như bình thường
    • Tạo new file và chọn XML trong categories và XML Schema trong File Types

    • Nhấn Next, đặt tên file và xác định nơi chứa cùng với namespace của tài liệu định nghĩa

    • Chọn Source hay Design hay Schema để tạo ra tài liệu schema. Chúng tôi luôn chọn Source để tạo ra tài liệu với sự hỗ trợ của autocompleted. (Quý vị nào thích kéo thả thì chọn design, còn Add theo dạng cấu trúc cây thì chọn Schema)

    • Khi gõ code nên sử dụng phím Ctrl + Space bar để đưa ra giá trị gợi ý cho việc lựa chọn chính xác, hạn chế tự gõ sẽ gây sai sót trong quá trình áp dụng
    • Các bài ví dụ hướng tới là sử dụng định nghĩa về Schema á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 kiểu dữ liệu mới định nghĩa là Customer mà không có namespace hay nói cách khác dùng namespace default
      • Chúng ta định nghĩa kiểu dữ liệu Customer với target namespace http://xml.netbeans.org/schema/customers
      • Sau đó import hay sử dụng namespace với prefix ns, nhưng khi sử dụng lại dùng default namespace
      • Chúng ta click chuột phải và chọn validation XML, lỗi phát sinh như sau

      • Chúng ta sẽ khắc phục lỗi này bằng cách đưa namespace ns khi gọi Customer. Đây là sự khác biệt khi sử dụng namespace với package trong java đã đề cập trong lý thuyết

    • Ví dụ 2

      • Tài liệu này hoàn toàn chính xác ngoại trừ chúng tôi không sử dụng thuộc tính elementFormDefault
      • Nhưng khi áp dụng schema này cho tài liệu XML thì tài XML không thể xác định các node thành phần khi checking validation

 

      • Kết quả tương tự nếu chúng ta dùng thuộc tính elementFormDefault=“unqualified”

    • Ví dụ 3

      • Ví dụ này, chúng tôi bỏ đi thuộc tính targetNamespace giống như khái niệm java là tạo class mà không tạo package, ở đây là tạo schema mà không tạo namespace
      • Khi validation thì tài liệu Schema không có gì sai sót gì chúng ta không sử dụng lại kiểu dữ liệu định nghĩa trong ngay tài liệu
      • Nhưng khi chúng ta validation tài liệu xml áp dụng cho schema này thì lỗi pháp sinh vì parser cho phép điều này

    • Ví dụ 4

 

      • Đây là ví dụ chúng tôi dùng schema định nghĩa đúng áp dụng vào tài liệu xml nhưng khi áp dụng không xác định namespace được validation thông qua tập tin nào khi bỏ đi schemaLocation thì tài liệu vẫn không validation được vì không biết check cú pháp định nghĩa các element từ đâu.
      • Khái niệm tương tự như chúng ta import thư viện trong java thì phải add gói jar kèm theo trong project

    • Ví dụ 5

      • Ví dụ này chúng tôi sử dụng schemaLocation để tìm tập tin. Tuy nhiên schemaLocation được checking cú pháp từ XML Instance. XML Instance chưa được khai báo nên tài liệu phát sinh lỗi

    • Ví dụ 6

 

      • Ví dụ này đang mô tả cách sử dụng khai báo element với các giá trị fixed, default
      • Lỗi phát sinh khi validation tài liệu XML vì giá trị from định nghĩa fixed nghĩa là hằng số, không được thay đổi khi áp dụng

      • Nếu chúng ta sửa lại bằng chính giá trị thì tài liệu hết lỗi

    • Ví dụ 7

      • Ví dụ này cho thấy lỗi khi cố tình fixed và default cùng chung với nhau

    • Ví dụ 8

      • Ví dụ trên mô tả cách thức element có khai báo và gán trị là null
      • Nhưng khi chúng ta cố gắng vừa gán null và vừa gán trị trong tài liệu xml thì parser sẽ thông báo lỗi khi validation

      • Nếu chúng ta dùng trị bình thường và không gán null thì kết quả vẫn bình thường

    • Ví dụ 9

 

      • Ví dụ trên thể hiện sử dụng kiểu dữ liệu non-atomic với kiểu list chứa nhiều hơn ngày tháng cách nhau bởi khoảng trắng trong VacationDays với kiểu dữ liệu dạng ngày được định nghĩa mới là DateList
      • Bên cạnh đó dùng cách giới hạn dữ liệu thông qua restrictions với facet
    • Ví dụ 10

 

      • Ví dụ này dùng kiểu non-atomic với union phối hợp nhiều kiểu dữ liệu qua element Event
      • Kết hợp sử dụng restrictions với facet
    • Ví dụ 11

      • Ví dụ này khai báo attribute tạo thành kiểu dữ liệu phức tạp sau đó áp dụng tài liệu xml

 

      • Thay đổi schema với việc sử dụng attribute với yêu cầu required

      • Tài liệu xml sẽ không validation vì thiếu thuộc tính bắt buộc phải có

    • Ví dụ 12

 

      • Ví dụ này cho thấy sử dụng facet với regular expression
      • Tài liệu phát sinh lỗi do chứa ký tự đặc biệt và chưa đủ từ 6 đến 12 ký tự

    • Ví dụ 13

      • Ví dụ này đang ví dụ về kiểu dữ liệu complex dạng empty
      • Cách khai báo để tái sử dụng lại

    • Ví dụ 14

      • Ví dụ này cho thấy sử dụng kiểu only element complex type
      • Cách khai báo tái sử dụng lại

    • Ví dụ 15

      • Ví dụ khai báo kiểu Text Only hay Simple Content
      • Cách khai báo tái sử dụng

    • Ví dụ 16

      • Ví dụ này khai báo kiểu mixed content trộn lẫn text và element
      • Cách khai báo tái sử dụng

      • Parser sẽ báo lỗi validation với tài liệu xml trên nếu bỏ đi mixed=”true”

    • Ví dụ 17

 

 

      • Ví dụ sử dụng all indicators với 02 tài liệu với các element không cần theo thứ tự vẫn đảm bảo đúng validation
    • Ví dụ 18

 

      • Ví dụ này dùng choice, tại 1 thời điểm chỉ xuất hiện 1 lần.
      • Nếu cố gắng xuất hiện cả 02 parser sẽ báo lỗi validation trên tài liệu xml

 

    • Ví dụ 19

 

      • Ví dụ này dùng sequence indicator và parser thông báo lỗi validation vì thứ tự không đúng như khai báo

    • Ví dụ 20

 

      • Ví dụ này cho thấy sự phối hợp giữa các indicators
    • Ví dụ 21

      • Ví dụ này giới thiệu số lần xuất hiện
      • Nếu như dùng sai số lượng sẽ bị báo lỗi validation

      • Nếu dùng chỉ thị maxOccurs nhỏ hơn minOccurs hay ngược lại thì chương trình vi phạm validation

    • Ví dụ 22

 

      • Ví dụ này sử dụng group indicators để tận dụng lại các thành phần có sẵn mà không viết quá nhiều lần lặp đi lặp lại
    • Ví dụ 23

      • Ví dụ này cho thấy mở rộng kiểu Person thành kiểu PersonExtended
    • Ví dụ 24

      • Ví dụ khai báo và sử dụng kiểu dữ liệu abstract và extending thành kiểu mới và đưa thêm đặc tính mới như ngôn ngữ lập trình java như Dog kế thừa Animal và Bird kế thừa Animal và theo WingSpan
      • Nếu cố tình sử dụng Animal mà không thể hiện instance thì sẽ vi phạm validation theo kiểu xsi:type như là từ khóa new của ngôn ngữ java, không thể nào sử dụng interface hay không thể new interface

      • Nếu cố tình new kiểu abstract thì validation sẽ báo lỗi

    • Ví dụ 25

      • Ví dụ này dùng định nghĩa any với element và kết hợp 02 schema cho tài liệu xml
      • Tương tự chúng ta định nghĩa cho attribute và định nghĩa kết hợp 3 schema cho 1 xml

    • Ví dụ 26

      • Ví dụ này dùng định nghĩa substitution với I18n để các tag khác nhau những cùng ngữ nghĩa
      • Để cấm thay thế, chúng ta dùng từ khóa block và cố tình thay thế sẽ báo lỗi

      • Chúng ta có thể phối hợp các tag lẫn lộn mà không báo lỗi gì cả

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 schema và ứng dụng nó trong validation 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 kết hợp với API của ngôn ngữ lập trình và làm tăng tính hiệu quả trong xử lý XML và đưa dữ liệu cho chương trình

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 Schema để 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 XSL – Extensible Style Language để áp dụng truy vấn và lọc dữ liệu cho XML.

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

Đăng nhận xét