DTD - Hướng dẫn nhanh

Khai báo kiểu tài liệu XML, thường được gọi là DTD, là một cách để mô tả chính xác ngôn ngữ XML. Các DTD kiểm tra tính hợp lệ của cấu trúc và từ vựng của một tài liệu XML dựa trên các quy tắc ngữ pháp của ngôn ngữ XML thích hợp.

Một tài liệu XML có thể được định nghĩa là -

  • Well-formed- Nếu tuân thủ tài liệu XML cho tất cả các XML chung cai trị như thẻ phải được lồng nhau đúng cách, mở và thẻ đóng phải được cân bằng, và các thẻ trống phải kết thúc với '/>', sau đó nó được gọi là tốt được hình thành .

    HOẶC LÀ

  • Valid- Một tài liệu XML được cho là hợp lệ khi nó không chỉ được định dạng tốt mà còn tuân theo DTD có sẵn để chỉ định những thẻ nào nó sử dụng, những thuộc tính nào mà những thẻ đó có thể chứa và những thẻ nào có thể xuất hiện bên trong các thẻ khác, trong số các thuộc tính khác .

Sơ đồ sau thể hiện rằng một DTD được sử dụng để cấu trúc tài liệu XML:

Các loại

DTD có thể được phân loại trên cơ sở khai báo của nó trong tài liệu XML, chẳng hạn như -

  • DTD nội bộ

  • DTD bên ngoài

Khi một DTD được khai báo trong tệp, nó được gọi là Internal DTD và nếu nó được khai báo trong một tệp riêng biệt, nó được gọi là External DTD.

Chúng ta sẽ tìm hiểu thêm về những điều này trong chương Cú pháp DTD

Đặc trưng

Sau đây là một số điểm quan trọng mà DTD mô tả:

  • các phần tử có thể xuất hiện trong tài liệu XML.

  • thứ tự mà chúng có thể xuất hiện.

  • các yếu tố tùy chọn và bắt buộc.

  • thuộc tính phần tử và liệu chúng là tùy chọn hay bắt buộc.

  • liệu các thuộc tính có thể có giá trị mặc định hay không.

Ưu điểm của việc sử dụng DTD

  • Documentation- Bạn có thể xác định định dạng của riêng mình cho các tệp XML. Nhìn vào tài liệu này, người dùng / nhà phát triển có thể hiểu cấu trúc của dữ liệu.

  • Validation - Nó cung cấp một cách để kiểm tra tính hợp lệ của các tệp XML bằng cách kiểm tra xem các phần tử có xuất hiện theo đúng thứ tự hay không, các phần tử và thuộc tính bắt buộc có đúng vị trí, các phần tử và thuộc tính không được chèn theo cách không chính xác, v.v.

Nhược điểm của việc sử dụng DTD

  • Nó không hỗ trợ các không gian tên. Không gian tên là một cơ chế mà tên phần tử và thuộc tính có thể được gán cho các nhóm. Tuy nhiên, trong một DTD không gian tên phải được xác định trong DTD, điều này vi phạm mục đích sử dụng không gian tên.

  • Nó chỉ hỗ trợ kiểu dữ liệu chuỗi văn bản.

  • Nó không phải là hướng đối tượng. Do đó, khái niệm kế thừa không thể được áp dụng trên các DTD.

  • Khả năng hạn chế để thể hiện bản số cho các phần tử.

Một DTD XML có thể được chỉ định bên trong tài liệu, hoặc nó có thể được giữ trong một tài liệu riêng biệt và sau đó tài liệu có thể được liên kết với tài liệu DTD để sử dụng nó.

Cú pháp

Cú pháp cơ bản của một DTD như sau:

<!DOCTYPE element DTD identifier
[
   declaration1
   declaration2
   ........
]>

Trong cú pháp trên -

  • DTD bắt đầu bằng dấu phân cách <! DOCTYPE.

  • An element yêu cầu trình phân tích cú pháp phân tích cú pháp tài liệu từ phần tử gốc được chỉ định.

  • DTD identifierlà mã định danh cho định nghĩa loại tài liệu, có thể là đường dẫn đến tệp trên hệ thống hoặc URL dẫn đến tệp trên internet. Nếu DTD trỏ đến đường dẫn bên ngoài, nó được gọi làexternal subset.

  • Các square brackets [ ] đính kèm một danh sách tùy chọn khai báo thực thể được gọi là internal subset.

DTD nội bộ

DTD được gọi là DTD nội bộ nếu các phần tử được khai báo trong tệp XML. Để tham chiếu nó là DTD nội bộ, thuộc tính độc lập trong khai báo XML phải được đặt thànhyes. Điều này có nghĩa là khai báo hoạt động độc lập với nguồn bên ngoài.

Cú pháp

Cú pháp của DTD nội bộ như được hiển thị:

<!DOCTYPE root-element [element-declarations]>

trong đó phần tử gốc là tên của phần tử gốc và phần khai báo phần tử là nơi bạn khai báo các phần tử.

Thí dụ

Sau đây là một ví dụ đơn giản về DTD nội bộ -

<?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?>

<!DOCTYPE address [
   <!ELEMENT address (name,company,phone)>
   <!ELEMENT name (#PCDATA)>
   <!ELEMENT company (#PCDATA)>
   <!ELEMENT phone (#PCDATA)>
]>

<address>
   <name>Tanmay Patil</name>
   <company>TutorialsPoint</company>
   <phone>(011) 123-4567</phone>
</address>

Hãy để chúng tôi xem qua đoạn mã trên -

Start Declaration - Bắt đầu khai báo XML bằng câu lệnh sau.

<?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?>

DTD- Ngay sau tiêu đề XML, khai báo kiểu tài liệu theo sau, thường được gọi là LOẠI TÀI LIỆU -

<!DOCTYPE address [

Khai báo DOCTYPE có dấu chấm than (!) Ở đầu tên phần tử. DOCTYPE thông báo cho trình phân tích cú pháp rằng một DTD được liên kết với tài liệu XML này.

DTD Body - Khai báo DOCTYPE được theo sau bởi phần thân của DTD, nơi bạn khai báo các phần tử, thuộc tính, thực thể và ký hiệu -

<!ELEMENT address (name,company,phone)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT company (#PCDATA)>
<!ELEMENT phone_no (#PCDATA)>

Một số phần tử được khai báo ở đây tạo nên từ vựng của tài liệu <name>. <! Tên phần tử (#PCDATA)> xác định tên phần tử thuộc loại "#PCDATA". Ở đây #PCDATA có nghĩa là dữ liệu văn bản có thể phân tích cú pháp.

End Declaration- Cuối cùng, phần khai báo của DTD được đóng bằng cách sử dụng dấu ngoặc đóng và dấu ngoặc nhọn đóng (]>). Điều này thực sự kết thúc định nghĩa, và sau đó, tài liệu XML tiếp theo ngay lập tức.

Quy tắc

  • Khai báo kiểu tài liệu phải xuất hiện ở đầu tài liệu (chỉ đứng trước tiêu đề XML) - nó không được phép ở bất kỳ nơi nào khác trong tài liệu.

  • Tương tự như khai báo DOCTYPE, khai báo phần tử phải bắt đầu bằng dấu chấm than.

  • Tên trong khai báo kiểu tài liệu phải khớp với kiểu phần tử của phần tử gốc.

DTD bên ngoài

Trong các phần tử DTD bên ngoài được khai báo bên ngoài tệp XML. Chúng được truy cập bằng cách chỉ định các thuộc tính hệ thống có thể là tệp .dtd hợp pháp hoặc URL hợp lệ. Để tham chiếu nó là DTD bên ngoài, thuộc tính độc lập trong khai báo XML phải được đặt làno. Điều này có nghĩa là, khai báo bao gồm thông tin từ nguồn bên ngoài.

Cú pháp

Sau đây là cú pháp cho DTD bên ngoài -

<!DOCTYPE root-element SYSTEM "file-name">

trong đó tên-tệp là tệp có phần mở rộng .dtd .

Thí dụ

Ví dụ sau đây cho thấy việc sử dụng DTD bên ngoài:

<?xml version = "1.0" encoding = "UTF-8" standalone = "no" ?>
<!DOCTYPE address SYSTEM "address.dtd">

<address>
  <name>Tanmay Patil</name>
  <company>TutorialsPoint</company>
  <phone>(011) 123-4567</phone>
</address>

Nội dung của tệp DTD address.dtd như được hiển thị -

<!ELEMENT address (name,company,phone)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT company (#PCDATA)>
<!ELEMENT phone (#PCDATA)>

Các loại

Bạn có thể tham khảo một DTD bên ngoài bằng cách sử dụng system identifiers hoặc là public identifiers.

System Identifiers

Định danh hệ thống cho phép bạn chỉ định vị trí của tệp bên ngoài có chứa các khai báo DTD. Cú pháp như sau:

<!DOCTYPE name SYSTEM "address.dtd" [...]>

Như bạn có thể thấy, nó chứa từ khóa SYSTEM và một tham chiếu URI trỏ đến vị trí của tài liệu.

Public Identifiers

Mã định danh công khai cung cấp một cơ chế để định vị tài nguyên DTD và được viết như sau:

<!DOCTYPE name PUBLIC "-//Beginning XML//DTD Address Example//EN">

Như bạn có thể thấy, nó bắt đầu với từ khóa PUBLIC, theo sau là một số nhận dạng chuyên biệt. Định danh công khai được sử dụng để xác định một mục nhập trong danh mục. Số nhận dạng công khai có thể tuân theo bất kỳ định dạng nào, tuy nhiên, một định dạng thường được sử dụng được gọi là Số nhận dạng công cộng chính thức, hoặc FPI.

Chương này sẽ thảo luận về các Thành phần XML từ góc độ DTD. Một DTD về cơ bản sẽ chứa các khai báo của các thành phần XML sau:

  • Element

  • Attributes

  • Entities

Thành phần

Các phần tử XML có thể được định nghĩa như các khối xây dựng của một tài liệu XML. Các phần tử có thể hoạt động như một vùng chứa để chứa văn bản, phần tử, thuộc tính, đối tượng phương tiện hoặc kết hợp tất cả.

Mỗi tài liệu XML chứa một hoặc nhiều phần tử, ranh giới của chúng được phân định bằng thẻ bắt đầu và thẻ kết thúc hoặc các phần tử trống.

Thí dụ

Dưới đây là một ví dụ đơn giản về các phần tử XML

<name>
   Tutorials Point
</name>

Như bạn có thể thấy, chúng tôi đã xác định thẻ <name>. Có một văn bản giữa thẻ bắt đầu và thẻ kết thúc của <name>. Các phần tử, khi được sử dụng trong XML-DTD, cần phải được khai báo và sẽ được thảo luận chi tiết trong chương Phần tử DTD .

Thuộc tính

Các thuộc tính là một phần của các phần tử XML. Một phần tử có thể có bất kỳ số lượng thuộc tính duy nhất nào. Các thuộc tính cung cấp thêm thông tin về phần tử XML hay chính xác hơn là nó định nghĩa một thuộc tính của phần tử. Thuộc tính XML luôn là một cặp tên-giá trị .

Thí dụ

Dưới đây là một ví dụ đơn giản về các thuộc tính XML -

<img src = "flower.jpg"/>

Ở đây img là tên phần tử trong khi src là tên thuộc tính và flower.jpg là một giá trị cho thuộc tính src .

Nếu các thuộc tính được sử dụng trong một DTD XML thì những thuộc tính này cần được khai báo sẽ được thảo luận chi tiết trong chương Các thuộc tính DTD

Thực thể

Các thực thể là trình giữ chỗ trong XML. Chúng có thể được khai báo trong phần mở đầu tài liệu hoặc trong DTD. Các thực thể chủ yếu có thể được phân loại thành -

  • Các thực thể cài sẵn

  • Thực thể nhân vật

  • Thực thể chung

  • Thực thể tham số

Có năm thực thể cài sẵn chơi trong XML được định dạng tốt, chúng là:

  • dấu và: & amp;

  • Trích dẫn duy nhất: & apos;

  • Lớn hơn: & gt;

  • Nhỏ hơn: & lt;

  • Dấu ngoặc kép: & quot;

Chúng ta sẽ nghiên cứu chi tiết hơn về khai báo thực thể trong DTD XML trong chương Các thực thể DTD

Các phần tử XML có thể được định nghĩa như các khối xây dựng của một tài liệu XML. Các phần tử có thể hoạt động như một vùng chứa để chứa văn bản, phần tử, thuộc tính, đối tượng phương tiện hoặc kết hợp tất cả.

Phần tử DTD được khai báo bằng khai báo ELEMENT. Khi một tệp XML được DTD xác thực, trình phân tích cú pháp ban đầu sẽ kiểm tra phần tử gốc và sau đó các phần tử con được xác thực.

Cú pháp

Tất cả các khai báo phần tử DTD đều có dạng chung này:

<!ELEMENT elementname (content)>
  • Khai báo ELEMENT được sử dụng để chỉ ra trình phân tích cú pháp mà bạn sắp xác định một phần tử.

  • ElementName là tên nguyên tố (còn gọi là nhận dạng generic ) mà bạn đang xác định.

  • nội dung xác định nội dung nào (nếu có) có thể đi trong phần tử.

Các loại nội dung yếu tố

Nội dung khai báo các phần tử trong DTD có thể được phân loại như sau:

  • Nội dung trống

  • Nội dung yếu tố

  • Nội dung hỗn hợp

  • Mọi nội dung

Nội dung trống

Đây là một trường hợp đặc biệt của khai báo phần tử. Khai báo phần tử này không chứa bất kỳ nội dung nào. Chúng được khai báo với từ khóaEMPTY.

Syntax

Sau đây là cú pháp khai báo phần tử rỗng:

<!ELEMENT elementname EMPTY >

Trong cú pháp trên -

  • ELEMENTlà phần tử khai báo của danh mục EMPTY

  • elementname là tên của phần tử trống.

Example

Sau đây là một ví dụ đơn giản minh họa khai báo phần tử rỗng:

<?xml version = "1.0"?>

<!DOCTYPE hr[
   <!ELEMENT address EMPTY>    
]>
<address />

Trong ví dụ này, địa chỉ được khai báo là một phần tử rỗng. Đánh dấu cho phần tử địa chỉ sẽ xuất hiện dưới dạng <address />.

Nội dung yếu tố

Trong khai báo phần tử với nội dung phần tử, nội dung sẽ là các phần tử được phép trong dấu ngoặc đơn. Chúng tôi cũng có thể bao gồm nhiều hơn một phần tử.

Syntax

Sau đây là cú pháp khai báo phần tử với nội dung phần tử:

<!ELEMENT elementname (child1, child2...)>
  • ELEMENT là thẻ khai báo phần tử

  • elementname là tên của phần tử.

  • child1, child2 .. là các phần tử và mỗi phần tử phải có định nghĩa riêng trong DTD.

Example

Ví dụ dưới đây minh họa một ví dụ đơn giản về khai báo phần tử với nội dung phần tử:

<?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?>

<!DOCTYPE address [
   <!ELEMENT address (name,company,phone)>
   <!ELEMENT name (#PCDATA)>
   <!ELEMENT company (#PCDATA)>
   <!ELEMENT phone (#PCDATA)>
]>

<address>
   <name>Tanmay Patil</name>
   <company>TutorialsPoint</company>
   <phone>(011) 123-4567</phone>
</address>

Trong ví dụ trên, địa chỉ là phần tử mẹ và tên , công typhone_no là phần tử con của nó.

Danh sách các toán tử và các quy tắc cú pháp

Bảng bên dưới hiển thị danh sách các toán tử và quy tắc cú pháp có thể được áp dụng để xác định các phần tử con -

Nhà điều hành Cú pháp Sự miêu tả Thí dụ
+ <! ELEMENT element-name (child1 +)> Nó chỉ ra rằng phần tử con có thể xuất hiện một hoặc nhiều lần bên trong phần tử mẹ.

<! Địa chỉ ELEMENT (tên +)>

Tên phần tử con có thể xuất hiện một hoặc nhiều lần bên trong địa chỉ tên phần tử .

* <! ELEMENT element-name (child1 *)> Nó chỉ ra rằng phần tử con có thể xuất hiện không hoặc nhiều lần bên trong phần tử mẹ.

<! Địa chỉ ELEMENT (tên *)>

Tên phần tử con có thể xuất hiện không hoặc nhiều lần bên trong địa chỉ tên phần tử .

? <! ELEMENT element-name (child1?)> Nó chỉ ra rằng phần tử con có thể xuất hiện không hoặc một lần bên trong phần tử mẹ.

<! Địa chỉ ELEMENT (tên?)>

Tên phần tử con có thể xuất hiện không hoặc một lần bên trong địa chỉ tên phần tử .

, <! ELEMENT element-name (child1, child2)> Nó cung cấp chuỗi các phần tử con được phân tách bằng dấu phẩy phải được bao gồm trong tên phần tử.

<! Địa chỉ ELEMENT (tên, công ty)>

Chuỗi tên phần tử con , công ty , phải diễn ra theo cùng một thứ tự bên trong địa chỉ tên phần tử .

| <! ELEMENT element-name (child1 | child2)> Nó cho phép thực hiện các lựa chọn trong phần tử con.

<! ELEMENT address (name | company)>

Nó cho phép bạn chọn một trong các phần tử con nghĩa là tên hoặc công ty , phải xuất hiện bên trong địa chỉ tên phần tử .

Quy tắc

Chúng tôi cần tuân theo các quy tắc nhất định nếu có nhiều hơn một nội dung phần tử -

  • Sequences - Thường thì các phần tử bên trong tài liệu DTD phải xuất hiện theo một thứ tự riêng biệt. Nếu đúng như vậy, bạn xác định nội dung bằng trình tự.

    Khai báo chỉ ra rằng phần tử <address> phải có chính xác ba phần tử - <name>, <company> và <phone> - và chúng phải xuất hiện theo thứ tự này. Ví dụ -

<!ELEMENT address (name,company,phone)>
  • Choices- Giả sử bạn cần cho phép phần tử này hay phần tử khác, nhưng không cho phép cả hai. Trong những trường hợp như vậy, bạn phải sử dụng ký tự pipe (|). Đường ống hoạt động như một HOẶC độc quyền. Ví dụ -

<!ELEMENT address (mobile | landline)>

Nội dung yếu tố hỗn hợp

Đây là sự kết hợp của (#PCDATA) và các phần tử con. PCDATA là viết tắt của dữ liệu ký tự được phân tích cú pháp, nghĩa là văn bản không phải là đánh dấu. Trong các mô hình nội dung hỗn hợp, văn bản có thể tự xuất hiện hoặc có thể xen kẽ giữa các phần tử. Các quy tắc cho mô hình nội dung hỗn hợp tương tự như nội dung phần tử như đã thảo luận trong phần trước.

Syntax

Sau đây là cú pháp chung cho nội dung phần tử hỗn hợp:

<!ELEMENT elementname (#PCDATA|child1|child2)*>
  • ELEMENT là thẻ khai báo phần tử.

  • elementname là tên của phần tử.

  • PCDATAlà văn bản không phải là đánh dấu. #PCDATA phải đứng đầu trong khai báo nội dung hỗn hợp.

  • child1, child2 .. là các phần tử và mỗi phần tử phải có định nghĩa riêng trong DTD.

  • Toán tử (*) phải tuân theo khai báo nội dung hỗn hợp nếu bao gồm các phần tử con

  • Khai báo phần tử (#PCDATA) và phần tử con phải được phân tách bằng toán tử (|).

Example

Sau đây là một ví dụ đơn giản minh họa khai báo phần tử nội dung hỗn hợp trong một DTD.

<?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?>

<!DOCTYPE address [
   <!ELEMENT address (#PCDATA|name)*>
   <!ELEMENT name (#PCDATA)>
]>

<address>
   Here's a bit of text mixed up with the child element.
   <name>
      Tanmay Patil
   </name>
</address>

BẤT KỲ Nội dung yếu tố nào

Bạn có thể khai báo một phần tử bằng cách sử dụng từ khóa BẤT KỲ trong nội dung. Nó thường được gọi là yếu tố danh mục hỗn hợp. ANY hữu ích khi bạn vẫn chưa quyết định nội dung cho phép của phần tử.

Syntax

Sau đây là cú pháp để khai báo các phần tử có nội dung BẤT KỲ:

<!ELEMENT elementname ANY>

Ở đây, từ khóa ANY chỉ ra rằng văn bản (PCDATA) và / hoặc bất kỳ phần tử nào được khai báo trong DTD có thể được sử dụng trong nội dung của phần tử <elementname>. Chúng có thể được sử dụng theo thứ tự bất kỳ lúc nào. Tuy nhiên, từ khóa BẤT KỲ không cho phép bạn bao gồm các phần tử không được khai báo trong DTD.

Example

Sau đây là một ví dụ đơn giản minh họa khai báo phần tử với BẤT KỲ nội dung nào -

<?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?>

<!DOCTYPE address [
   <!ELEMENT address ANY>
]>

<address>
   Here's a bit of sample text
</address>

Trong chương này, chúng ta sẽ thảo luận về các thuộc tính DTD. Thuộc tính cung cấp thêm thông tin về một phần tử hoặc chính xác hơn là nó xác định thuộc tính của một phần tử. Thuộc tính XML luôn ở dạng một cặp tên-giá trị. Một phần tử có thể có bất kỳ số lượng thuộc tính duy nhất nào.

Khai báo thuộc tính rất giống với khai báo phần tử theo nhiều cách ngoại trừ một; thay vì khai báo nội dung cho phép cho các phần tử, bạn khai báo một danh sách các thuộc tính cho phép cho mỗi phần tử. Các danh sách này được gọi là khai báo ATTLIST.

Cú pháp

Cú pháp cơ bản của khai báo thuộc tính DTD như sau:

<!ATTLIST element-name attribute-name attribute-type attribute-value>

Trong cú pháp trên -

  • Các thuộc tính DTD bắt đầu bằng từ khóa <! ATTLIST nếu phần tử chứa thuộc tính.

  • element-name chỉ định tên của phần tử mà thuộc tính áp dụng.

  • attribute-name chỉ định tên của thuộc tính được bao gồm với tên phần tử.

  • attribute-typexác định loại thuộc tính. Chúng ta sẽ thảo luận thêm về vấn đề này trong các phần sau.

  • attribute-valuenhận một giá trị cố định mà các thuộc tính phải xác định. Chúng ta sẽ thảo luận thêm về vấn đề này trong các phần sau.

Thí dụ

Dưới đây là một ví dụ đơn giản về khai báo thuộc tính trong DTD -

<?xml version = "1.0"?>

<!DOCTYPE address [
   <!ELEMENT address ( name )>
   <!ELEMENT name ( #PCDATA )>
   <!ATTLIST name id CDATA #REQUIRED>
]>

<address>
   <name id = "123">Tanmay Patil</name>
</address>

Hãy để chúng tôi xem qua đoạn mã trên -

  • Bắt đầu với khai báo XML với câu lệnh sau:

<?xml version = "1.0"?>
  • Ngay sau tiêu đề XML là khai báo loại tài liệu, thường được gọi là LOẠI TÀI LIỆU như được hiển thị bên dưới:

    DOCTYPE thông báo cho trình phân tích cú pháp rằng một DTD được liên kết với tài liệu XML này. Khai báo DOCTYPE có dấu chấm than (!) Ở đầu tên phần tử.

<!DOCTYPE address [
  • Sau đây là phần thân của DTD. Ở đây chúng tôi đã khai báo phần tử và thuộc tính -

<!ELEMENT address ( name )>
<!ELEMENT name ( #PCDATA )>
  • Id thuộc tính cho tên phần tử được định nghĩa như sau:

    Ở đây loại thuộc tính là CDATA và giá trị của nó là #REQUIRED .

<!ATTLIST name id CDATA #REQUIRED>

Quy tắc khai báo thuộc tính

  • Tất cả các thuộc tính được sử dụng trong tài liệu XML phải được khai báo trong Định nghĩa loại tài liệu (DTD) bằng cách sử dụng khai báo danh sách thuộc tính

  • Các thuộc tính chỉ có thể xuất hiện trong thẻ bắt đầu hoặc thẻ trống.

  • Từ khóa ATTLIST phải viết hoa

  • Không cho phép các tên thuộc tính trùng lặp trong danh sách thuộc tính cho một phần tử nhất định.

Các loại thuộc tính

Khi khai báo thuộc tính, bạn có thể chỉ định cách bộ xử lý sẽ xử lý dữ liệu xuất hiện trong giá trị. Chúng tôi có thể phân loại các loại thuộc tính thành ba loại chính:

  • Loại chuỗi

  • Các loại mã hóa

  • Các loại được liệt kê

Bảng sau cung cấp tóm tắt về các loại thuộc tính khác nhau:

Sr.No. Loại & Mô tả
1

CDATA

CDATA là dữ liệu ký tự (văn bản và không phải đánh dấu). Nó là một loại thuộc tính chuỗi .

2

ID

Nó là một định danh duy nhất của thuộc tính. Nó không nên xuất hiện nhiều hơn một lần. Nó là một loại thuộc tính được mã hóa .

3

IDREF

Nó được sử dụng để tham chiếu một ID của một phần tử khác. Nó được sử dụng để thiết lập kết nối giữa các phần tử. Nó là một loại thuộc tính được mã hóa .

4

IDREFS

Nó được sử dụng để tham chiếu nhiều ID. Nó là một loại thuộc tính được mã hóa .

5

ENTITY

Nó đại diện cho một thực thể bên ngoài trong tài liệu. Nó là một loại thuộc tính được mã hóa .

6

ENTITIES

Nó đại diện cho một danh sách các thực thể bên ngoài trong tài liệu. Nó là một loại thuộc tính được mã hóa .

7

NMTOKEN

Nó tương tự như CDATA và giá trị thuộc tính bao gồm một tên XML hợp lệ. Nó là một loại thuộc tính được mã hóa .

số 8

NMTOKENS

Nó tương tự như CDATA và giá trị thuộc tính bao gồm một danh sách tên XML hợp lệ. Nó là một loại thuộc tính được mã hóa .

9

NOTATION

Một phần tử sẽ được tham chiếu đến một ký hiệu được khai báo trong tài liệu DTD. Nó là một loại thuộc tính được liệt kê .

10

Enumeration

Nó cho phép xác định danh sách các giá trị cụ thể trong đó một trong các giá trị phải khớp. Nó là một loại thuộc tính được liệt kê .

Khai báo giá trị thuộc tính

Trong mỗi khai báo thuộc tính, bạn phải chỉ định cách giá trị sẽ xuất hiện trong tài liệu. Bạn có thể chỉ định nếu một thuộc tính -

  • có thể có một giá trị mặc định

  • có thể có một giá trị cố định

  • bắt buộc

  • được ngụ ý

Giá trị mặc định

Nó chứa giá trị mặc định. Các giá trị có thể được đặt trong dấu nháy đơn (') hoặc dấu nháy kép (").

Syntax

Sau đây là cú pháp của giá trị -

<!ATTLIST element-name attribute-name attribute-type "default-value">

trong đó giá trị mặc định là giá trị thuộc tính được xác định.

Example

Sau đây là một ví dụ đơn giản về khai báo thuộc tính với giá trị mặc định:

<?xml version = "1.0"?>

<!DOCTYPE address [
   <!ELEMENT address ( name )>
   <!ELEMENT name ( #PCDATA )>
   <!ATTLIST name id CDATA "0">
]>

<address>
   <name id = "123">
      Tanmay Patil
   </name>
</address>

Trong ví dụ này, chúng ta có phần tử tên với id thuộc tính có giá trị mặc định là 0 . Giá trị mặc định được đặt trong dấu ngoặc kép.

Giá trị CỐ ĐỊNH

Từ khóa #FIXED theo sau là giá trị cố định được sử dụng khi bạn muốn chỉ định rằng giá trị thuộc tính là không đổi và không thể thay đổi. Cách sử dụng phổ biến của các thuộc tính cố định là chỉ định số phiên bản.

Syntax

Sau đây là cú pháp của các giá trị cố định:

<!ATTLIST element-name attribute-name attribute-type #FIXED "value" >

trong đó #FIXED là một giá trị thuộc tính được xác định.

Example

Sau đây là một ví dụ đơn giản về khai báo thuộc tính với giá trị CỐ ĐỊNH -

<?xml version = "1.0"?>

<!DOCTYPE address [
  <!ELEMENT address (company)*>
  <!ELEMENT company (#PCDATA)>
  <!ATTLIST company name NMTOKEN #FIXED "tutorialspoint">
]>

<address>
  <company name = "tutorialspoint">we are a free online teaching faculty</company>
</address>

Trong ví dụ này, chúng tôi đã sử dụng từ khóa #FIXED trong đó nó chỉ ra rằng giá trị "tutorialspoint" là giá trị duy nhất cho tên thuộc tính của phần tử <company>. Nếu chúng tôi cố gắng thay đổi giá trị thuộc tính thì nó sẽ báo lỗi.

Sau đây là một DTD không hợp lệ -

<?xml version = "1.0"?>

<!DOCTYPE address [
  <!ELEMENT address (company)*>
  <!ELEMENT company (#PCDATA)>
  <!ATTLIST company name NMTOKEN #FIXED "tutorialspoint">
]>

<address>
  <company name = "abc">we are a free online teaching faculty</company>
</address>

Giá trị BẮT BUỘC

Bất cứ khi nào bạn muốn chỉ định rằng một thuộc tính là bắt buộc, hãy sử dụng từ khóa #REQUIRED.

Syntax

Sau đây là cú pháp của #REQUIRED -

<!ATTLIST element-name attribute-name attribute-type #REQUIRED>

trong đó #REQUIRED là một loại thuộc tính được xác định.

Example

Sau đây là một ví dụ đơn giản về khai báo thuộc tính DTD với từ khóa #REQUIRED -

<?xml version = "1.0"?>

<!DOCTYPE address [
   <!ELEMENT address ( name )>
   <!ELEMENT name ( #PCDATA )>
   <!ATTLIST name id CDATA #REQUIRED>
]>

<address>
   <name id = "123">
      Tanmay Patil
   </name>
</address>

Trong ví dụ này, chúng tôi đã sử dụng từ khóa #REQUIRED để xác định rằng các thuộc tính id phải được cung cấp cho các phần tử có tên tuổi tên

Giá trị IMPLIED

Khi khai báo các thuộc tính, bạn phải luôn chỉ định một khai báo giá trị. Nếu thuộc tính bạn đang khai báo không có giá trị mặc định, không có giá trị cố định và không bắt buộc, thì bạn phải khai báo thuộc tính đó như ngụ ý . Từ khóa #IMPLIED được sử dụng để chỉ định một thuộc tính như được ngụ ý .

Syntax

Sau đây là cú pháp của #IMPLIED -

<!ATTLIST element-name attribute-name attribute-type #IMPLIED>

trong đó #IMPLIED là một loại thuộc tính được xác định.

Example

Sau đây là một ví dụ đơn giản về #IMPLIED

<?xml version = "1.0"?>

<!DOCTYPE address [
   <!ELEMENT address ( name )>
   <!ELEMENT name ( #PCDATA )>
   <!ATTLIST name id CDATA #IMPLIED>
]>

<address>
   <name />
</address>

Trong ví dụ này, chúng tôi đã sử dụng từ khóa #IMPLIED vì chúng tôi không muốn chỉ định bất kỳ thuộc tính nào được đưa vào tên phần tử . Nó là tùy chọn.

Các thực thể được sử dụng để xác định các phím tắt cho các ký tự đặc biệt trong tài liệu XML. Các thực thể chủ yếu có thể có bốn loại -

  • Các thực thể cài sẵn

  • Thực thể nhân vật

  • Thực thể chung

  • Thực thể tham số

Cú pháp khai báo thực thể

Nói chung, các thực thể có thể được khai báo internally hoặc là externally. Hãy để chúng tôi hiểu từng điều này và cú pháp của chúng như sau:

Thực thể nội bộ

Nếu một thực thể được khai báo trong DTD thì nó được gọi là thực thể nội bộ.

Syntax

Sau đây là cú pháp để khai báo thực thể nội bộ:

<!ENTITY entity_name "entity_value">

Trong cú pháp trên -

  • entity_name là tên của thực thể theo sau là giá trị của nó trong dấu ngoặc kép hoặc dấu nháy đơn.

  • entity_value giữ giá trị cho tên thực thể.

  • Giá trị thực thể của Đối tượng nội bộ được hủy tham chiếu bằng cách thêm tiền tố & sang tên thực thể tức là & entity_name.

Example

Sau đây là một ví dụ đơn giản về khai báo thực thể nội bộ:

<?xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>

<!DOCTYPE address [
   <!ELEMENT address (#PCDATA)>
   <!ENTITY name "Tanmay patil">
   <!ENTITY company "TutorialsPoint">
   <!ENTITY phone_no "(011) 123-4567">
]>

<address>
   &name;
   &company;
   &phone_no;
</address>

Trong ví dụ trên, tên thực thể tương ứng tên , công typhone_no được thay thế bằng giá trị của họ trong tài liệu XML. Các giá trị thực thể được hủy tham chiếu bằng cách thêm tiền tố & đến tên thực thể.

Lưu tệp này thành sample.xmlvà mở nó trong bất kỳ trình duyệt nào, bạn sẽ nhận thấy rằng các giá trị thực thể cho name , company , phone_no được thay thế tương ứng.

Thực thể bên ngoài

Nếu một thực thể được khai báo bên ngoài DTD thì nó được gọi là thực thể bên ngoài. Bạn có thể tham chiếu đến Đối tượng bên ngoài bằng cách sử dụng số nhận dạng hệ thống hoặc số nhận dạng công khai.

Syntax

Sau đây là cú pháp khai báo Đối tượng Bên ngoài:

<!ENTITY name SYSTEM "URI/URL">

Trong cú pháp trên -

  • name là tên của thực thể.

  • SYSTEM là từ khóa.

  • URI/URL là địa chỉ của nguồn bên ngoài được đặt trong dấu ngoặc kép hoặc đơn.

Types

Bạn có thể tham khảo một DTD bên ngoài bằng cách sử dụng:

  • System Identifiers - Mã định danh hệ thống cho phép bạn chỉ định vị trí của tệp bên ngoài chứa các khai báo DTD.

    Như bạn có thể thấy, nó chứa từ khóa SYSTEM và một tham chiếu URI trỏ đến vị trí của tài liệu. Cú pháp như sau:

<!DOCTYPE name SYSTEM "address.dtd" [...]>
  • Public Identifiers - Mã định danh công khai cung cấp một cơ chế để định vị tài nguyên DTD và được viết như sau:

    Như bạn có thể thấy, nó bắt đầu với từ khóa PUBLIC, theo sau là một số nhận dạng chuyên biệt. Định danh công khai được sử dụng để xác định một mục nhập trong danh mục. Định danh công khai có thể theo bất kỳ định dạng nào; tuy nhiên, một định dạng thường được sử dụng được gọi là Số nhận dạng Công cộng Chính thức, hoặc FPI.

<!DOCTYPE name PUBLIC "-//Beginning XML//DTD Address Example//EN">

Example

Hãy để chúng tôi hiểu về thực thể bên ngoài với ví dụ sau:

<?xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>
<!DOCTYPE address SYSTEM "address.dtd">

<address>
   <name>
      Tanmay Patil
   </name>
   
   <company>
      TutorialsPoint
   </company>
   
   <phone>
      (011) 123-4567
   </phone>
</address>

Dưới đây là nội dung của tệp DTD address.dtd -

<!ELEMENT address (name, company, phone)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT company (#PCDATA)>
<!ELEMENT phone (#PCDATA)>

Các thực thể cài sẵn

Tất cả các trình phân tích cú pháp XML phải hỗ trợ các thực thể dựng sẵn. Nói chung, bạn có thể sử dụng các tham chiếu thực thể này ở bất cứ đâu. Bạn cũng có thể sử dụng văn bản bình thường trong tài liệu XML, chẳng hạn như trong nội dung phần tử và giá trị thuộc tính.

Có năm thực thể tích hợp đóng vai trò của chúng trong XML được định dạng tốt, chúng là:

  • dấu và: & amp;

  • Trích dẫn duy nhất: & apos;

  • Lớn hơn: & gt;

  • Nhỏ hơn: & lt;

  • Dấu ngoặc kép: & quot;

Thí dụ

Ví dụ sau minh họa khai báo thực thể tích hợp:

<?xml version = "1.0"?>

<note>
   <description>I'm a technical writer & programmer</description>
<note>

Như bạn có thể thấy ở đây, & amp; ký tự được thay thế bằng & bất cứ khi nào bộ xử lý gặp phải điều này.

Thực thể nhân vật

Thực thể ký tự được sử dụng để đặt tên cho một số thực thể biểu thị thông tin, tức là các ký tự khó hoặc không thể nhập có thể được thay thế bằng Thực thể ký tự.

Thí dụ

Ví dụ sau minh họa khai báo thực thể ký tự:

<?xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>
<!DOCTYPE author[
   <!ELEMENT author (#PCDATA)>
   <!ENTITY writer "Tanmay patil">
   <!ENTITY copyright "&#169;">
]>
<author>&writer;&copyright;</author>

Bạn sẽ nhận thấy ở đây chúng tôi đã sử dụng &#169;như giá trị cho nhân vật bản quyền. Lưu tệp này dưới dạng sample.xml và mở nó trong trình duyệt của bạn và bạn sẽ thấy bản quyền được thay thế bằng ký tự ©.

Thực thể chung

Các thực thể chung phải được khai báo trong DTD trước khi chúng có thể được sử dụng trong tài liệu XML. Thay vì chỉ đại diện cho một ký tự đơn lẻ, các thực thể chung có thể đại diện cho các ký tự, đoạn văn và thậm chí toàn bộ tài liệu.

Cú pháp

Để khai báo một thực thể chung, hãy sử dụng một khai báo của biểu mẫu chung này trong DTD của bạn -

<!ENTITY ename "text">

Thí dụ

Ví dụ sau minh họa khai báo thực thể chung:

<?xml version = "1.0"?>

<!DOCTYPE note [
   <!ENTITY source-text "tutorialspoint">
]>

<note>
   &source-text;
</note>

Bất cứ khi nào trình phân tích cú pháp XML gặp một tham chiếu đến thực thể văn bản nguồn , nó sẽ cung cấp văn bản thay thế cho ứng dụng tại điểm tham chiếu.

Thực thể tham số

Mục đích của thực thể tham số là cho phép bạn tạo các phần có thể sử dụng lại của văn bản thay thế.

Cú pháp

Sau đây là cú pháp để khai báo thực thể tham số:

<!ENTITY % ename "entity_value">
  • entity_value là bất kỳ ký tự nào không phải là '&', '%' hoặc '"'.

Thí dụ

Ví dụ sau minh họa khai báo thực thể tham số. Giả sử bạn có các khai báo phần tử như bên dưới:

<!ELEMENT residence (name, street, pincode, city, phone)>
<!ELEMENT apartment (name, street, pincode, city, phone)>
<!ELEMENT office (name, street, pincode, city, phone)>
<!ELEMENT shop (name, street, pincode, city, phone)>

Bây giờ, giả sử bạn muốn thêm quốc gia bầu cử bổ sung , sau đó bạn cần thêm quốc gia đó vào cả bốn khai báo. Do đó, chúng ta có thể tìm tham chiếu thực thể tham số. Bây giờ sử dụng tham chiếu thực thể tham số, ví dụ trên sẽ là:

<!ENTITY % area "name, street, pincode, city">
<!ENTITY % contact "phone">

Các thực thể tham số được tham chiếu giống như một tham chiếu thực thể chung, chỉ bằng dấu phần trăm thay vì dấu và -

<!ELEMENT residence (%area;, %contact;)>
<!ELEMENT apartment (%area;, %contact;)>
<!ELEMENT office (%area;, %contact;)>
<!ELEMENT shop (%area;, %contact;)>

Khi trình phân tích cú pháp đọc các khai báo này, nó sẽ thay thế văn bản thay thế của thực thể cho tham chiếu thực thể.

Chúng tôi sử dụng DTD để mô tả chính xác tài liệu XML. Các DTD kiểm tra tính hợp lệ của cấu trúc và từ vựng của một tài liệu XML dựa trên các quy tắc ngữ pháp của ngôn ngữ XML thích hợp. Bây giờ để kiểm tra tính hợp lệ của DTD, có thể sử dụng các quy trình sau:

  • Using XML DTD validation tools - Bạn có thể sử dụng một số IDE như XML Spy (không miễn phí) và XMLStarlet (mã nguồn mở) có thể được sử dụng để xác thực các tệp XML dựa trên tài liệu DTD.

  • Using XML DTD on-line validators- Dịch vụ xác thực đánh dấu W3C được thiết kế để xác thực tài liệu Web. Sử dụng trình xác thực trực tuyến để kiểm tra tính hợp lệ của DTD XML của bạn tại đây .

  • Write your own XML validators with XML DTD validation API - Các phiên bản mới hơn của JDK (trên 1.4) hỗ trợ API xác thực DTD XML. Bạn có thể viết mã trình xác thực của riêng mình để kiểm tra tính hợp lệ của xác thực DTD XML.