Xml schema (Bài 5)

Xml schema được sử dụng để giải quyết liên quan đến xác nhận (validate) như: Qui định phần tử root; Qui định trình tự xuất hiện; Qui định số lần xuất hiện; Qui định kiểu dữ liệu (chỉ chứa chuỗi hoặc chứa phần tử khác). Hình bên dưới là một ví dụ.

xml schema 1

Như chúng ta đã biết, những vấn đề trên có thể giải quyết với DTD trong XML. Tuy nhiên, một tài liệu XML ngoài những ràng buộc như trên, cần phải qui định về: Kiểu dữ liệu (Data Type); Số ký tự trong một chuỗi (Length): Giới hạn phạm vi giá trị (Range (age >=1))…Trong trường hợp này, chúng ta phải sử dụng XML Schema

xml schema 2

Xml schema – Định nghĩa một phần tử đơn (Defining a Simple Element)

Cú pháp

<xsd:element name="x" type="y"/>

Trong đó: x là tên phần tử; y là kiểu dữ liệu.

Kiểu dữ liệu Miêu tả
xsd:string Ký tự
xsd:decimal Số thực
xsd:integer Số nguyên
xsd:boolean Luận lý (true hoặc false)
xsd:date Ngày
xsd:time Thời gian

Ví dụ các phần tử trong tài liệu XML như sau

<lastname>Refsnes</lastname>
<age>36</age>
<dateborn>1970-03-27</dateborn>

Định nghĩa các phân tử trong XSD

<xsd:element name="lastname" type="xsd:string"/>
<xsd:element name="age" type="xsd:integer"/>
<xsd:element name="dateborn" type="xsd:date"/>

Xml schema – Qui định giá trị mặc định và giá trị cố định cho phần tử đơn

Phần tử đơn là phần tử chỉ chứa giá trị. Một phần tử đơn có thể có một giá trị mặc định hoặc một giá trị cố định.

Ví dụ qui định giá trị mặc định là “red” cho phần tử color

<xsd:element name="color" type="xsd:string" default="red"/>

Ví dụ qui định giá trị cố định là “red” cho phần tử color

<xsd:element name="color" type="xsd:string" fixed="red"/>

Xml schema – Định nghĩa thuộc tính cho một phần tử

Cú pháp

<xsd:attribute name="xxx" type="yyy"/>

Ví dụ trong tài liệu XML, phần tử lastname có một thuộc tính lang

<lastname lang="EN">Smith</lastname>

Định nghĩa thuộc tính

<xsd:attribute name="lang" type="xsd:string"/>

Thiết lập giá trị mặc định cho thuộc tính. Ví dụ giá trị mặc định cho thuộc tính lang là “EN”

<xsd:attribute name="lang" type="xsd:string" default="EN"/>

Thiết lập giá trị cố định cho thuộc tính. Ví dụ giá trị cố định cho thuộc tính lang là “EN”

<xsd:attribute name="lang" type="xsd:string" fixed="EN"/>

Ví dụ thiết lập bắt buộc phải nhập giá trị cho thuộc tính lang

<xsd:attribute name="lang" type="xsd:string" use="required"/>

Xml schema – Ràng buộc giá trị

Ví dụ sau sẽ định nghĩa một phần tử “age” với ràng buộc là: tuổi lớn hơn 0 và nhỏ hơn 120

<xsd:element name="age">
   <xsd:simpleType>
     <xsd:restriction base="xsd:integer">
       <xsd:minInclusive value="0"/>
       <xsd:maxInclusive value="120"/>
     </xsd:restriction>
   </xsd:simpleType>
 </xsd:element>

Xml schema – Ràng buộc với một tập các giá trị

Ví dụ định nghĩa phần tử “car” với ràng buộc là: chỉ chấp nhận một trong các giá trị như Audi, Golf, BMW

Cách 1: Thiết lập ràng buộc trong khi định nghĩa phần tử

<xsd:element name="car">
   <xsd:simpleType>
     <xsd:restriction base="xsd:string">
       <xsd:enumeration value="Audi"/>
       <xsd:enumeration value="Golf"/>
       <xsd:enumeration value="BMW"/>
     </xsd:restriction>
   </xsd:simpleType>
 </xsd:element>

Cách 2: Thiết lập ràng buộc bằng cách tạo ra một kiểu dữ liệu mới

<!--Định nghĩa phần tử "car" với kiểu dữ liệu là "carType"-->
<xsd:element name="car" type="carType"/>

<!--Định nghĩa kiểu dữ liệu tên "carType"-->
<xsd:simpleType name="carType">  
  <xsd:restriction base="xsd:string">    
    <xsd:enumeration value="Audi"/>    
    <xsd:enumeration value="Golf"/>    
    <xsd:enumeration value="BMW"/>  
  </xsd:restriction>
</xsd:simpleType>

Xml schema – Ràng buộc trên một loạt các giá trị (Restrictions on a Series of Values)

Ví dụ định nghĩa một phần tử “letter” với ràng buộc là: chỉ chấp nhận giá trị là một ký tự thường từ a đến z: (Ví dụ 1)

<xsd:element name="letter">
   <xsd:simpleType>
     <xsd:restriction base="xsd:string">
       <xsd:pattern value="[a-z]"/>
     </xsd:restriction>
   </xsd:simpleType>
</xsd:element>

Ví dụ định nghĩa một phần tử “initials” với ràng buộc là: chỉ chấp nhận giá trị là ba ký tự in hoa từ a đến z: (Ví dụ 2)

<xsd:element name="initials">
   <xsd:simpleType>
     <xsd:restriction base="xsd:string">
       <xsd:pattern value="[A-Z][A-Z][A-Z]"/>
     </xsd:restriction>
   </xsd:simpleType>
</xsd:element>

Ví dụ định nghĩa một phần tử “initials” với ràng buộc là: chỉ chấp nhận giá trị là ba ký tự viết thường hoặc in hoa từ a đến z: (Ví dụ 3)

<xsd:element name="initials">
   <xsd:simpleType>
     <xsd:restriction base="xsd:string">
       <xsd:pattern value="[a-zA-Z][a-zA-Z][a-zA-Z]"/>
     </xsd:restriction>
   </xsd:simpleType>
</xsd:element>

Ví dụ định nghĩa một phần tử “choice” với ràng buộc là: chỉ chấp nhận giá trị là một ký tự x, y hoặc z: (Ví dụ 4)

<xsd:element name="choice">
   <xsd:simpleType>
     <xsd:restriction base="xsd:string">
       <xsd:pattern value="[xyz]"/>
     </xsd:restriction>
   </xsd:simpleType>
</xsd:element>

Ví dụ định nghĩa một phần tử “prodid” với ràng buộc là: chỉ chấp nhận giá trị là năm chữ số và mỗi chữ số phải thuộc phạm vi từ 0 đến 9: (Ví dụ 5)

<xsd:element name="prodid">
   <xsd:simpleType>
     <xsd:restriction base="xsd:integer">
       <xsd:pattern value="[0-9][0-9][0-9][0-9][0-9]"/>
     </xsd:restriction>
   </xsd:simpleType>
</xsd:element>

Ví dụ định nghĩa một phần tử “gender” với ràng buộc là: chỉ chấp nhận giá trị là male hoặc female: (Ví dụ 6)

<xsd:element name="gender">
   <xsd:simpleType>
     <xsd:restriction base="xsd:string">
       <xsd:pattern value="male|female"/>
     </xsd:restriction>
   </xsd:simpleType>
</xsd:element>

Ví dụ định nghĩa một phần tử “password” với ràng buộc là: phải đủ 8 ký tự và mỗi ký tự phải là chữ thường hoặc chữ in hoa từ a đến z, hoặc chữ số từ 0 đến 9: (Ví dụ 7)

<xsd:element name="password">
   <xsd:simpleType>
     <xsd:restriction base="xsd:string">
       <xsd:pattern value="[a-zA-Z0-9]{8}"/>
     </xsd:restriction>
   </xsd:simpleType>
</xsd:element>

Ràng buộc phạm vi về số ký tự của chuỗi

<xsd:minLength value="5"/>
<xsd:maxLength value="8"/>

Xml schema – Ví dụ mẫu

Tập tin SampleXSD.xml

<?xml version="1.0"?>
<doc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="sampleXSD.xsd">

 <person>
   <name>John</name>
   <initials>z</initials>
   <prodid>12345</prodid>
   <password>abc12345</password>
   <shoesize country="VN">12</shoesize>
 </person>

</doc>

Tập tin SampleXSD.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <xsd:element name="doc">
   <xsd:complexType>
    <xsd:sequence>
     <xsd:element name="person" minOccurs="0" maxOccurs="unbounded">
      <xsd:complexType>
       <xsd:sequence>
        <xsd:element name="name" type="xsd:string"/> 
        <xsd:element name="initials">
         <xsd:simpleType>
          <xsd:restriction base="xsd:string">
           <xsd:pattern value="[xyz]"></xsd:pattern>
          </xsd:restriction>
        </xsd:simpleType>
       </xsd:element>
       <xsd:element name="prodid">
        <xsd:simpleType>
         <xsd:restriction base="xsd:integer">
          <xsd:pattern value="[0-9][0-9][0-9][0-9][0-9]"/>
         </xsd:restriction>
        </xsd:simpleType>
      </xsd:element>
      <xsd:element name="password">
       <xsd:simpleType>
        <xsd:restriction base="xsd:string">
         <xsd:pattern value="[a-zA-Z0-9]{8}"/>
        </xsd:restriction>
       </xsd:simpleType>
      </xsd:element>
      <xsd:element name="shoesize">
       <xsd:complexType>
        <xsd:simpleContent>
         <xsd:extension base="shoeType">
         <xsd:attribute name="country" type="xsd:string" use="required"/>
       </xsd:extension>
      </xsd:simpleContent>
     </xsd:complexType>
    </xsd:element>
   </xsd:sequence>
  </xsd:complexType>
 </xsd:element>
 </xsd:sequence>
 </xsd:complexType>
 </xsd:element>
 <!-- Definition new data type and restriction value-->
 <xsd:simpleType name="shoeType">
   <xsd:restriction base="xsd:integer">
    <xsd:minInclusive value="1"/>
    <xsd:maxInclusive value="12"/>
   </xsd:restriction>
 </xsd:simpleType>
</xsd:schema>

Sử dụng phần mềm XMLwriter để validate

Tập tin XML hợp lệ

xml schema 3

Tập tin XML không hợp lệ

xml schema 4

Xml schema – Bài tập thực hành

Cho tập tin XML dùng để đóng gói dữ liệu bán hàng online bao gồm các thông tin sau:

  • Name – ví dụ như paper, clips, rubber bands, pens, …
  • Inventory ID – ví dụ như “F12333”, “Z55557”, … Thiết lập ràng buộc với yêu cầu là Inventory ID phải bắt đầu là một ký tự in hoa, theo sau là 5 chữ số từ 1 đến 9.
  • Unit Price – ví dụ như 4.55, 22.33, … Yêu cầu không được nhỏ hơn 1.00
  • Stock Bin – ví dụ như “B789”, “B123”, … Thiết lập ràng buộc với yêu cầu phải bắt đầu là “B” và theo sau là 3 chữ số từ 0 đến 9.

Yêu cầu

  • Tạo tập tin schema định nghĩa các phần tử, kiểu dữ liệu và thiết lập ràng buộc.
  • Tạo tập tin xml và chắc chắn rằng nó Well-Formed
  • Kiểm tra xem tập tin schema có validate đúng hay không

Trả lời