3. Xác định nội dung văn bản

Không thể tìm thấy URL thông số tiện ích

Tổng quan: Xác định nội dung văn bản

Với bài học này bạn đã biết được các quy tắc cơ bản của văn bản XML, tuy nhiên bạn cũng cần phải xác định những yếu tố sử dụng để trình bày dữ liệu. Trong bài này bạn sẽ học hai cách để làm điều đó.

  • Một phương pháp là sử dụng một Document Type Definition (Định nghĩa kiểu của Văn bản), hoặc DTD. Một DTD xác định các phần tử có thể xuất hiện trong văn bản, thứ tự chúng xuất hiện, cách chúng được sắp xếp trong cái khác, và các chi tiết cơ bản trong cấu trúc văn bản XML. Các DTD là bộ phận của chi tiết kỹ thuật XML gốc, và chúng rất giống với các DTD SGML.
  • Phương pháp khác là sử dụng Lược đồ XML. Một lược đồ có thể xác định tất cả các cấu trúc văn bản mà bạn có để đặt trong một DTD, nó cũng có thể xác định chủng loại dữ liệu và các quy tắc phức tạp hơn DTD có thể làm. W3C đã phát triển chi tiết kỹ thuật lược đồ XML trong vài năm sau chi tiết kỹ thuật XML gốc

Xác định kiểu cho Văn bản

Một DTD cho phép chỉ ra cấu trúc của một văn bản XML. Hai phần tiếp theo sẽ bàn tới những đoạn của các DTD. Trước hết, đây là một DTD xác định cấu trúc cơ bản của văn bản địa chỉ ví dụ trong phần trên, XML là gì? :

<!-- address.dtd -->
<!ELEMENT address (name, street, city, state, postal-code)>
<!ELEMENT name (title? first-name, last-name)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT first-name (#PCDATA)>
<!ELEMENT last-name (#PCDATA)>
<!ELEMENT street (#PCDATA)>
<!ELEMENT city (#PCDATA)>
<!ELEMENT state (#PCDATA)>
<!ELEMENT postal-code (#PCDATA)>
          

DTD này xác định tất cả các phần tử sử dụng trong văn bản mẫu. Nó xác định ba điều cơ bản:

  • Một phần tử <address> chứa một <name>, một <street>, một <city>, một <state>, và một <postal-code>. Tất cả các phần tử này phải xuất hiện, và chúng xuất hiện trong trật tự đó.
  • Một phần tử <name> chứa một phần tử <title> tùy ý (dấu hỏi chỉ danh xưng tùy ý), theo sau là một phần tử <first-name> và một phần tử <last-name>.
  • Tất cả các phần tử khác chứa chữ. (#PCDATA nghĩa là dữ liệu kiểu ký tự đã được kiểm tra ngữ pháp, không thể chứa thêm phần tử khác trong các phần tử này.)

Mặc dù DTD tương đối đơn giản, nhưng nó vẫn rạch ròi kết hợp các phần tử thành hợp lệ. Một văn bản địa chỉ có một phần tử <postal-code> trước phần tử <state> là không hợp lệ, và cũng không có phần tử <last-name>.

Ngoài ra, Phải chú ý rằng cú pháp DTD khác xa so với của pháp XML gốc. (Các văn bản lược đồ XML, ngược lại, lại chính là bản thân XML, mà có một số hệ quả thú vị.) Cho dù cú pháp khác với các DTD, bạn vẫn có thể đặt các chú thích ngay trong DTD.

Ký tự thay thế trong các DTD

Có một số ký tự thay thế được sử dụng trong các DTD để biểu thị mức độ xuất hiện thường xuyên (hoặc có xuất hiện hay không) của một số thứ trong văn bản XML. Đây là vài ví dụ với ý nghĩa của chúng:

  • <!ELEMENT address (name, city, state)>

    Phần tử <address> phải chứa một phần tử <name>, một phần tử <city>, và một phần tử <state>, trong trật tự đó. Tất cả các phần tử đều bắt buộc. Dấu phẩy biểu thị một danh sách.

  • <!ELEMENT name (title?, first-name, last-name)>

    Điều này có nghĩa là phần tử <name> chứa một phần tử <title> tùy ý, tiếp theo một phần tử <first-name> và một phần tử <last-name>. Dấu hỏi biểu thị một giá trị là tùy ý, nó có thể xuất hiện một lần hoặc không.

  • <!ELEMENT addressbook (address+)>

    Một phần tử <addressbook> chứa một hoặc hơn một phần tử <address>. Bạn có thể có nhiều phần tử <address> như ý muốn, nhưng phải có ít nhất một phần tử. Dấu cộng biểu thị một giá trị ít nhất phải xuất hiện một lần, nhưng cũng có thể nhiều hơn một.

  • <!ELEMENT private-addresses (address*)>

    Một phần tử <private-addresses> không chứa hoặc chứa nhiều phần tử <address> hơn. Dấu hoa thị biểu thị một giá trị có thể xuất hiện bao nhiêu lần cũng được, kể cả không lần nào.

  • <!ELEMENT name (title?, first-name, (middle-initial | middle-name)?, last-name)>

    Một phần tử <name> chứa một phần tử <title> tùy ý, tiếp theo sau là phần tử <first-name>, có thể theo sau bằng một phần tử <middle-initial> hoặc một phần tử <middle-name>, tiếp theo sau bằng một phần tử <last-name>. Nói cách khác, cả <middle-initial> <middle-name> đều tùy ý, và bạn cũng có thể có một trong hai phần tử đó. Gạch thẳng đứng biểu thị một danh sách lựa chọn, bạn có thể chọn một giá trị duy nhất trong danh sách. Ngoài ra nên nhớ rằng ví dụ này sử dụng các dấu ngoặc đơn để nhóm các phần tử nhất định lại với nhau, và còn đặt dấu hỏi đứng sát với nhóm.

  • <!ELEMENT name ((title?, first-name, last-name) | (surname, mothers-name, given-name))>

    Phần tử <name> có thế chứa một hoặc hai dãy: một phần tử tùy ý <title>, theo sau bằng một phần tử <first-name> và một phần tử <last-name>; hoặc một phần tử <surname>, một <mothers-name>, và một <given-name>.

Một từ về tính co giãn

Trước khi tiếp tục, cần ghi nhớ về tính co giãn của sự thiết kế các loại văn bản XML. Cân nhắc về tên mẫu và loại văn bản địa chỉ, tôi đã viết rất rõ ràng bằng địa chỉ bưu chính ở Mỹ. Nếu bạn muốn một DTD hoặc một sơ đồ xác định các quy tắc cho các loại khác hoặc các địa chỉ, cần phải phức tạp nó lên rất nhiều. Đưa một phần tử <state> có thể có nghĩa Australia, nhưng lại vô nghĩa ở Anh. Một địa chỉ ở Canada có thể được xử lý bằng DTD mẫu trong Xác định Loại Văn bản, nhưng thêm một yếu tố <province> là một ý kiến hay hơn. Cuối cùng, phải chú ý rằng có rất nhiều các khu vực trên thế giới, các khái niệm như chủ đề, tên và họ đều không có nghĩa.

Đường gạch dưới: Nếu muốn xác định cấu trúc một văn bản XML, bạn phải tính toán trước rất nhiều trong DTD hay lược đồ của bạn, cũng giống như khi bạn thiết kế một sơ đồ cơ sở dữ liệu hoặc một kết cấu dữ liệu. Bạn càng tính trước được nhiều, thì về sau khi bạn thực hiện càng dễ dàng với chi phí càng thấp.


Xác định thuộc tính

Bài giới thiệu này không đi sâu chi tiết vào cách các DTD làm việc như thế nào, nhưng có một vấn đề cơ bản bao trùm ở đây: xác định thuộc tính. Bạn có thể xác định thuộc tính cho các yếu tố sẽ xuất hiện trong văn bản XML của bạn. Sử dụng một DTD, bạn còn có thể:

  • Xác định những thuộc tính nào là bắt buộc
  • Xác định các giá trị mặc định cho thuộc tính
  • Lên danh sách tất cả các giá trị hợp lệ cho một thuộc tính đã cho

Giả sử rằng bạn muốn thay đổi DTD để state là một thuộc tính của phần tử <city>. Đây là cách thực hiện:

<!ELEMENT city (#PCDATA)>
<!ATTLIST city state CDATA #REQUIRED>
          

Điều này xác định phần tử <city> như trước, nhưng ví dụ cũng sử dụng một tuyên bố ATTLIST để lên danh sách những thuộc tính của phần tử. Cái tên city bên trong danh sách thuộc tính chỉ cho bộ kiểm ngữ thấy những thuộc tính này được xác định cho phần tử <city>. Cái tên state là tên của thuộc tính, và từ khóa CDATA #REQUIRED chỉ cho bộ kiểm ngữ biết rằng thuộc tính state bao gồm chữ cái và bắt buộc phải có (nếu nó là tùy ý thì kiểu sẽ là CDATA #IMPLIED).

Để xác định nhiều thuộc tính cho một phần tử, viết ATTLIST thế này:

<!ELEMENT city (#PCDATA)>
<!ATTLIST city state CDATA #REQUIRED
               postal-code CDATA #REQUIRED>
          

Ví dụ này xác định cả state postal-code là thuộc tính của phần tử <city>.

Cuối cùng, các DTD cho phép bạn xác định các giá trị mặc định cho các thuộc tính và liệt kê tất cả các giá trị hợp lệ cho một thuộc tính:

<!ELEMENT city (#PCDATA)>
<!ATTLIST city state CDATA (AZ|CA|NV|OR|UT|WA) "CA">
          

Ví dụ này cho thấy nó chỉ phù hợp với các địa chỉ từ các bang Arizona (AZ), California (CA), Nevada (NV), Oregon (OR), Utah (UT), và Washington (WA), và bang mặc định là California. Do vậy, bạn có thể kiểm soát dữ liệu có giới hạn. Đó là một chức năng hữu ích, là một tập hợp nhỏ những việc bạn có thể làm với lược đồ XML (xem các lược đồ XML).


Các lược đồ XML

Với các lược đồ XML, bạn sẽ dễ dàng hơn trong việc xác định một văn bản XML hợp lệ hay không. Một số lợi ích vượt trội của nó so với các DTD:

  • Lược đồ XML sử dụng cú pháp XML. Nói cách khác, một lược đồ XML là một văn bản XML. Điều đó có nghĩa rằng bạn có thể xử lý một lược đồ như các văn bản khác. Ví dụ, bạn có thể soạn tài liệu kiểu XSLT để chuyển một lược đồ XML thành một dạng Web với các mã JavaScript được tạo ra tự động như bạn đưa vào vậy.
  • Lược đồ XML thích hợp các loại dữ liệu. Các DTD thích hợp các loại dữ liệu được phát triển từ xuất bản. Lược đồ XML thì thích hợp với mọi loại dữ liệu gốc từ các DTD (như các ID và những thứ liên quan tới ID). Chúng cũng thích hợp với số nguyên, số dấu phẩy động, ngày, thời gian, chuỗi, URL và các loại dữ liệu hữu ích khác cho việc xử lý và kiểm soát dữ liệu.
  • Lược đồ XML mở rộng. Ngoài các loại dữ liệu được xác định trong chi tiết kĩ thuật của lược đồ XML, bạn còn có thể tạo dữ liệu riêng, và từ những loại dữ liệu này suy ra các loại dữ liệu mới.
  • Lược đồ XML có khả năng biểu đạt ấn tượng. Ví dụ, với lược đồ XML bạn có thể xác định giá trị của bất cứ thuộc tính <state> nào không thể dài hơn 2 ký tự, hoặc giá trị của bất cứ phần tử <postal-code> nào cũng phải phù hợp với cách biểu đạt phổ biến [0-9]{5}(-[0-9]{4})?. Bạn không thể làm điều tương tự với các DTD.


Một lược đồ XML mẫu

Đây là một lược đồ XML phù hợp với tên gốc và địa chỉ DTD. Thêm vào 2 lần bắt buộc: Giá trị của phần tử <state> phải là 2 ký tự và giá trị của phần tử <postal-code> phải khớp với cách biểu đạt phổ biến [0-9]{5}(-[0-9]{4})?. mặc dù một lược đồ thì dài hơn nhiều so với một DTD, nhưng nó biểu đạt rõ ràng hơn về một văn bản hợp lệ. Đây là một lược đồ:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="address">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="name"/>
        <xsd:element ref="street"/>
        <xsd:element ref="city"/>
        <xsd:element ref="state"/>
        <xsd:element ref="postal-code"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="name">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="title" minOccurs="0"/>
        <xsd:element ref="first-Name"/>
        <xsd:element ref="last-Name"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="title"      type="xsd:string"/>
  <xsd:element name="first-Name" type="xsd:string"/>
  <xsd:element name="last-Name"  type="xsd:string"/>
  <xsd:element name="street"     type="xsd:string"/>
  <xsd:element name="city"       type="xsd:string"/>

  <xsd:element name="state">
    <xsd:simpleType>
      <xsd:restriction base="xsd:string">
        <xsd:length value="2"/>
      </xsd:restriction>
    </xsd:simpleType>
  </xsd:element>

  <xsd:element name="postal-code">
    <xsd:simpleType>
      <xsd:restriction base="xsd:string">
        <xsd:pattern value="[0-9]{5}(-[0-9]{4})?"/>
      </xsd:restriction>
    </xsd:simpleType>
  </xsd:element>
</xsd:schema>
          


Xác định phần tử trong lược đồ

Lược đồ XML trong Một lược đồ XML mẫu Xác định số lượng các phần tử XML bằng phần tử <xsd:element>. Hai yếu tố đầu tiên xác định, <address> <name>, bao gồm những phần tử khác. Phần tử <xsd:sequence> xác định tính liên tục của các phần tử trong chúng. Ví dụ:

<xsd:element name="address">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element ref="name"/>
      <xsd:element ref="street"/>
      <xsd:element ref="city"/>
      <xsd:element ref="state"/>
      <xsd:element ref="postal-code"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>
          

Như trong phiên bản DTD, lược đồ XML xác định rằng, một phần tử <address> chứa một phần tử <name>, một phần tử <street>, một phần tử <city>, một phần tử <state>, và một phần tử <postal-code>, nằm trong trật tự đó. Nhớ rằng lược đồ thật sự xác định một loại dữ liệu mới bằng phần tử <xsd:complexType>.

Hầu hết các phần tử đều chứa dữ liệu kiểu ký tự, vì vậy để xác định chúng khá đơn giản. Bạn chỉ cần chỉ ra một phần tử mới, và cho nó một loại dữ liệu xsd:string:

<xsd:element name="title"      type="xsd:string"/>
<xsd:element name="first-Name" type="xsd:string"/>
<xsd:element name="last-Name"  type="xsd:string"/>
<xsd:element name="street"     type="xsd:string"/>
<xsd:element name="city"       type="xsd:string"/>
          

Xác định phần tử có trong lược đồ

Lược đồ mẫu xác định sự bắt buộc nội dung của hai phần tử: Nội dung của phần tử <state> phải là 2 ký tự và nội dung của phần tử <postal-code> phải khớp với cách biểu đạt phổ biến [0-9]{5}(-[0-9]{4})?. Đây là cách thực hiện:

  <xsd:element name="state">
    <xsd:simpleType>
      <xsd:restriction base="xsd:string">
        <xsd:length value="2"/>
      </xsd:restriction>
    </xsd:simpleType>
  </xsd:element>

  <xsd:element name="postal-code">
    <xsd:simpleType>
      <xsd:restriction base="xsd:string">
        <xsd:pattern value="[0-9]{5}(-[0-9]{4})?"/>
      </xsd:restriction>
    </xsd:simpleType>
  </xsd:element>
          

Đối với các phần tử <state> <postal-code>, lược đồ xác định loại dữ liệu mới bằng cách giới hạn. Trường hợp đầu tiên sử dụng phần tử <xsd:length>, và trường hợp thứ hai sử dụng phần tử <xsd:pattern> để xác định cách biểu đạt thông thường mà phần tử này phù hợp.

Bản tóm tắt này chỉ bàn sơ qua về những điều lược đồ XML có thể làm, có cả những quyển sách chuyên nói về chủ đề này. Tuy nhiên với mục đích là giới thiệu, thế này đã đủ để nói rằng lược đồ XML rất mạnh và linh hoạt trong mô tả một văn bản XML hợp lệ.

3 của 7 | Trang trước | Trang sau


Comments