XML: Bài 4.3. Làm việc với các kiểu Phức hợp


Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên

Trong bài học thứ ba này, Làm việc với các kiểu Phức hợp, bạn sẽ học cách:

  • Mô tả các phần tử kiểu phức hợp.
  • Mô tả minOccurs và maxOccurs.
  • Giải thích hàm lượng nguyên tố và hàm lượng hỗn hợp.
  • Mô tả cách nhóm có thể được thực hiện.

4.3.1. Các kiểu phức hợp

Một lược đồ chỉ định một kiểu cho mỗi phần tử và thuộc tính mà nó khai báo. Các phần tử có kiểu phức hợp có thể chứa các phần tử lồng nhau và có các thuộc tính. Chỉ các phần tử mới có thể chứa các kiểu phức hợp. Phần tử kiểu phức hợp có bốn biến thể.

Ø Phần tử empty

Các phần tử empty tùy ý chỉ định các loại thuộc tính, nhưng không cho phép nội dung như được hiển thị trong ví dụ sau.

<xs:element name="Books">
  <xs:complexType>
    <xs:attributename="BookCode" type="xs:positiveInteger"/>
  </xs:complexType>
</xs:element>

Ø Phần tử only

Loại phần tử này chỉ có thể chứa phần tử và không chứa các thuộc tính như trong ví dụ sau.

<xs:element name="Books">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="ISBN" type="xs:string"/>
      <xs:element name="Price" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Ø Chỉ văn bản

Các phần tử này chỉ có thể chứa văn bản và có thể có hoặc không có các thuộc tính như trong ví dụ sau.

<xs:complexType name="Books">
  <xs:simpleContent>
    <xs:extension base="xs:string">
      <xs:attribute name="BookCode" type="xs:positiveInteger"/>
    </xs:extension>
  </xs:simpleContent>
</xs:complexType>

Ø Trộn

Đây là các phần tử có thể chứa nội dung văn bản cũng như các phần tử con bên trong phần tử như trong ví dụ sau. Chúng có thể có hoặc không có thuộc tính.

<xs:element name="Books">
  <xs:complexType mixed="true">
    <xs:sequence>
      <xs:element name="BookName" type="xs:string"/>
      <xs:element name="ISBN" type="xs:positiveInteger"/>
      <xs:element name="Price" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

4.3.2. Định nghĩa kiểu phức hợp

Một phần tử phức hợp có thể được định nghĩa theo hai cách khác nhau. Các ví dụ sau đây xác định các thuộc tính của phần tử phức hợp.

Bằng cách đặt tên trực tiếp cho phần tử

Ví dụ:

<xs:element name="Student">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="FirstName" type="xs:string"/>
      <xs:element name="MiddleName" type="xs:string"/>
      <xs:element name="LastName" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Phần tử Student có thể được khai báo bằng cách đề cập trực tiếp đến nó trong lược đồ. Kiểu phức hợp đề cập rằng tài liệu XML chứa các phần tử XML lồng nhau. Phần tử trình tự chỉ ra rằng các phần tử con FirstName, MiddleName và LastName xuất hiện theo thứ tự như chúng được khai báo.

Bằng cách sử dụng thuộc tính tên và kiểu của kiểu phức hợp

Ví dụ:

<xs:element name="Student" type="PersonInfo"/>
<xs:complexType name="PersonInfo">
  <xs:sequence>
    <xs:element name="FirstName" type="xs:string"/>
    <xs:element name="LastName" type="xs:string"/>
  </xs:sequence>
</xs:complexType>

Phần tử Student có thể có một kiểu như PersonInfo tham chiếu đến tên của kiểu phức hợp. Một số phần tử có thể sử dụng lại kiểu phức hợp này bằng cách tham chiếu đến tên PersonInfo trong khai báo kiểu phức hợp của chúng.

4.3.3. minOccurs và maxOccurs

Khi làm việc với DTD, chúng ta đã sử dụng các dấu *, ?, và + để cho biết số lần một phần tử con cụ thể có thể được sử dụng làm nội dung cho một phần tử. Tương tự, lược đồ XML cho phép chỉ định số lần tối thiểu và tối đa một phần tử có thể xảy ra. Trong lược đồ, cả phần tử và thuộc tính đều sử dụng các thuộc tính sau:

Ø minOccurs

minOccurs chỉ định số lần xuất hiện tối thiểu của phần tử trong tài liệu XML. Giá trị mặc định cho thuộc tính minOccurs là 1. Thuộc tính là tùy chọn, nếu minOccurs bằng 0. Nếu minOccurs được đặt thành 1, thuộc tính này là bắt buộc.

Ø maxOccurs

maxOccurs chỉ định số lần xuất hiện tối đa của phần tử trong tài liệu XML. Giá trị mặc định cho thuộc tính maxOccurs là 1. Nếu giá trị của nó được giữ nguyên không giới hạn, điều đó có nghĩa là phần tử có thể xuất hiện không giới hạn số lần. Thuộc tính maxOccurs mặc định là 1 trừ khi nó được chỉ định.

Ví dụ sau minh họa việc sử dụng các thuộc tính minOccurs và maxOccurs.

…
<xs:element name= "Books">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="ISBN"
                  type="xs:string"/>
      <xs:element name="Quantity"
                  type="xs:string"
                  maxOccurs="100"
                  minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>
…

Ví dụ thể hiện rằng phần tử Quantity có thể xuất hiện tối thiểu là 0 lần và tối đa là 100 lần trong phần tử Book.

Mối quan hệ giữa các thuộc tính minOccurs và maxOccurs được thể hiện trong bảng 4.1.

minOccur

MaxOccur

Số lần một phần tử có thể xuất hiện

0

1

0 hoặc 1

1

1

1

0

*

Vô hạn

1

*

Ít nhất một lần

>0

*

Ít nhất là minOccurs lần

>maxOccurs

>0

0

Mọi giá trị

<minOccurs

0

Bảng 4.1: minOccurs và maxOccurs

4.3.4. Nội dung phần tử

Một kiểu phức hợp có thể đề cập đến nội dung phần tử. Nội dung phần tử chỉ có thể chứa các phần tử. Có thể có các trường hợp trong đó các phần tử được chứa cũng có thể có các phần tử con.

Đoạn mã sau minh họa các thuộc tính của nội dung phần tử.

Books.xml

<?xml version="1.0"?>
<Books xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:noNamespaceSchemaLocation= "Books.xsd">
  <Title>A cup of tea</Title>
  <Author>
    <Name>Dennis Compton</Name>
  </Author>
  <Author>
    <Name>George Ford</Name>
  </Author>
  <Publisher>
    <Name>Orange</Name>
  </Publisher>
</Books>

Đây là tài liệu giới hạn lược đồ XML mô tả chi tiết cuốn sách.

Books.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Books"
              type="BookType">
    <xs:complexType name="AuthorType">
      <xs:sequence>
        <xs:element name="Name"
                    type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
    <xs:complexType name="PublisherType">
      <xs:sequence>
        <xs:element name="Name"
                    type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
    <xs:complexType name="BookType">
      <xs:sequence>
        <xs:element name="Title"
                    type="xs:string"/>
        <xs:element name="Author"
                    type="ComposerType"
                    maxOccurs="unbounded"/>
        <xs:element name="Publisher"
                    type="PublisherType"
                    minOccurs="0"
                    maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
  Trong tài liệu XML, mỗi phần tử Author và Publisher chứa các phần tử Name. Vì vậy, các kiểu dữ liệu tích hợp sẵn như xs:string không thể được sử dụng, thay vào đó, AuthorName và PublisherName có thể được xác định bằng cách sử dụng các phần tử xs:complexType cấp cao nhất.

4.3.5. Nội dung hỗn hợp

Một kiểu phức hợp có thể chỉ định nội dung của nó là một nội dung hỗn hợp. Nội dung hỗn hợp có thể chứa văn bản trộn lẫn với các phần tử. Thứ tự và số lượng phần tử xuất hiện trong nội dung hỗn hợp cũng có thể được chỉ định trong lược đồ. Loại nội dung này có thể có hoặc không có thuộc tính.

Nội dung hỗn hợp được khai báo giống hệt nhau, việc khai báo nội dung phần tử được thực hiện. Phần bổ trợ duy nhất cho khai báo là, nó lấy thuộc tính hỗn hợp được đặt thành giá trị true.

Ví dụ sau đây thể hiện các thuộc tính của nội dung hỗn hợp.

Book.xml

<Books>
  Apocalypse written by
  <Author>Mary Jane</Author>
  is of Genre
  <Category>Fiction</Type>.
</Books>

Book.xsd

<xs:element name="Books">
  <xs:complexType mixed="true">
    <xs:sequence>
      <xs:element name="Author"
                  type="xs:string"/>
      <xs:element name="Category"
                  type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

4.3.6. Cấu trúc phân nhóm

Ngôn ngữ lược đồ XML cung cấp ba cấu trúc phân nhóm xác định xem thứ tự của các phần tử riêng lẻ có quan trọng hay không:

Ø xs:all

Cấu trúc phân nhóm này yêu cầu mỗi phần tử trong nhóm phải xuất hiện nhiều nhất một lần, nhưng thứ tự đó không quan trọng. Lưu ý duy nhất là trong kiểu nhóm này, thuộc tính minOccurs có thể là 0 hoặc 1 và thuộc tính maxOccurs phải là 1. Đoạn mã sau minh họa khái niệm này.

<xs:element name="Books">
  <xs:complexType>
    <xs:all>
      <xs:element name="Name"
                  type="xs:string"
                  minOccurs="1"
                  maxOccurs="1"/>
      <xs:element name="ISBN"
                  type="xs:string"
                  minOccurs="1"
                  maxOccurs="1"/>
      <xs:element name="items"
                  type="Items"
                  minOccurs="1"/>
    </xs:all>
  </xs:complexType>
</xs:element>

Ø xs:choice

Phần tử choice là đối lập với tất cả các phần tử khác. Thay vì yêu cầu tất cả các phần tử phải có mặt, nó sẽ chỉ cho phép một trong các lựa chọn xuất hiện. Phần tử choice cung cấp một biểu diễn XML để mô tả một lựa chọn từ một tập hợp các loại phần tử. Bản thân phần tử choice có thể có các thuộc tính minOccurs và maxOccurs thiết lập chính xác số lượng lựa chọn có thể được thực hiện từ choice. Đoạn mã sau đây thể hiện khái niệm này.

<xs:complexType name="AdressInfo">
  <xs:group>
    <xs:choice>
      <xs:element name="Address"
                  type="USAddress"/>
      <xs:element name="Address"
                  type="UKAddress"/>
      <xs:element name="Address"
                  type="FranceAddress"/>
    </xs:choice>
  </xs:group>
</xs:complexType>

Trong đoạn mã, có ba phần tử con loại trừ lẫn nhau. Với phần tử xs:choice được khai báo, chỉ một phần tử trong số các lựa chọn có thể là phần tử con của phần tử cha AddressInfo.

Ø xs:sequence

Một phần tử xs:sequence chỉ định mỗi phần tử của chuỗi xuất hiện theo cùng một thứ tự trong tài liệu cá thể như đã đề cập trong phần tử xs:sequence. Số lần mỗi phần tử được phép xuất hiện có thể được kiểm soát bởi các thuộc tính minOccurs và maxOccurs của phần tử. Đoạn mã sau đây thể hiện khái niệm này.

<xs:element name="Books">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="Name"
                  type="xs:string"/>
      <xs:element name="ISBN"
                  type=" xs:string "/>
      <xs:element name="Price"
                  type=" xs:string "/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Kiểm tra kiến thức bài 4.3

1. Trong các câu này, câu nào về kiểu phức là đúng và câu nào sai?

(A)

Không thể xác định thứ tự và số lượng phần tử xuất hiện trong nội dung hỗn hợp trong lược đồ.

(B)

Nếu giá trị của thuộc tính maxOccurs được giữ không bị giới hạn, điều đó có nghĩa là phần tử có thể xuất hiện không giới hạn số lần.

(C)

Các phần tử có kiểu phức hợp có thể chứa các phần tử lồng nhau và có các thuộc tính.

(D)

Giá trị mặc định cho thuộc tính minOccurs là 0.

(E)

Khi sử dụng thuộc tính minOccurs, không thể có thuộc tính maxOccurs trong cùng một dòng.

2. Trong các câu này, câu nào về nguyên tố và hàm lượng hỗn hợp là đúng, câu nào sai?

(A)

Nội dung hỗn hợp có nghĩa là một phần tử có cấu trúc là kiểu phức hợp có thể chứa các phần tử có thuộc tính.

(B)

Nội dung phần tử có nghĩa là một phần tử kiểu phức hợp chỉ chứa các phần tử.

(C)

Không thể chỉ định thứ tự và số lượng phần tử xuất hiện trong nội dung hỗn hợp trong lược đồ.

(D)

Nội dung phần tử không được có thuộc tính.

3. Câu nào trong số các câu sau về phân nhóm là đúng và câu nào là sai?

(A)

Phần tử trình tự cung cấp một biểu diễn XML để mô tả một lựa chọn từ một tập hợp các loại phần tử.

(B)

Phần tử tất cả yêu cầu mỗi phần tử trong nhóm phải xuất hiện nhiều nhất một lần.

(C)

Đối với mỗi loại phần tử được liên kết với một phần tử trình tự, phải có một phần tử trong thể hiện XML theo cùng một thứ tự.

(D)

Phần tử lựa chọn không thể đề cập đến thuộc tính minOccurs và maxOccurs.

» Tiếp: Bài 4.4. Làm việc với kiểu đơn giản
« Trước: Bài 4.2. Khám phá các lược đồ XML
Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên
Copied !!!