DTD屬性


在本章中,我們將討論學習DTD屬性。 屬性提供了有關元素的更多資訊,或者更確切地說,它定義了元素的屬性。 XML屬性始終採用名稱-值 對的形式。 元素可以具有任意數量的唯一屬性。

屬性宣告在很多方面與元素宣告非常相似; 可以為每個元素宣告一個允許的屬性列表,而不是為元素宣告允許的內容。 這些列表稱為ATTLIST宣告。

語法

DTD屬性宣告的基本語法如下 -

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

在上面的語法中 -

  • 如果元素包含屬性,則DTD屬性以<!ATTLIST關鍵字開頭。
  • element-name指定屬性適用元素的名稱。
  • attribute-name指定element-name包含的屬性的名稱。
  • attribute-type定義屬性的型別,將在以下部分中對此進行更多討論。
  • attribute-value採用屬性必須定義的固定值。將在以下部分中對此進行更多討論。

範例

下面是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>

我們來看看上面的程式碼 -

  • 使用以下語句宣告XML開始 -
    <?xml version = "1.0"?>
    
  • 緊跟XML頭之後是文件型別宣告,通常稱為DOCTYPEDOCTYPE通知解析器DTD與此XML文件相關聯。 DOCTYPE宣告在元素名稱的開頭有一個感嘆號(!)。如下所示 -

    <!DOCTYPE address [
    
  • 以下是DTD的主體,這裡宣告了元素和屬性 -

    <!ELEMENT address ( name )>
    <!ELEMENT name ( #PCDATA )>
    
  • 元素名稱定義屬性id,它的屬性型別是CDATA,它的值為#REQUIRED
<!ATTLIST name id CDATA #REQUIRED>

屬性宣告規則

  • 必須使用屬性列表宣告在文件型別定義(DTD)中宣告XML文件中使用的所有屬性.
  • 屬性可能只出現在開始或空標籤中。
  • 關鍵字ATTLIST必須為大寫
  • 對於給定元素,屬性列表中不允許重複的屬性名稱。

1. 屬性型別

宣告屬性時,可以指定處理器應如何處理值中顯示的資料。可以將屬性型別分為三個主要類別 -

  • 字串型別
  • 標記型別
  • 列舉型別

下表提供了不同屬性型別的摘要 -

  • 字串型別
  • 標記型別
  • 列舉型別

下表提供了不同屬性型別的說明 -

序號 型別 描述
1 CDATA CDATA是字元資料(文字而非標記),它是一個字串屬性型別。
2 ID 它是屬性的唯一識別符號,它不能出現多次。 它是一個標記化的屬性型別。
3 IDREF 它用於參照另一個元素的ID,用於建立元素之間的連線,是一個標記化的屬性型別。
4 IDREFS 它用於參照多個ID,是一個標記化的屬性型別。
5 ENTITY 它代表文件中的外部實體,是一個標記化的屬性型別。
6 ENTITIES 它表示文件中的外部實體列表,是一個標記化的屬性型別。
7 NMTOKEN 它類似於CDATA,屬性值由有效的XML名稱組成。 它是一個標記化的屬性型別。
8 NMTOKENS 它類似於CDATA,屬性值包含有效XML名稱列表。 它是一個標記化的屬性型別。
9 NOTATION 元素將參照DTD文件中宣告的表示法,它是列舉屬性型別。
10 Enumeration 它允許定義其中一個值必須匹配的特定值列表。 它是列舉屬性型別。

2. 屬性值宣告

在每個屬性宣告中,必須指定值在文件中的顯示方式。可以指定屬性為 -

  • 有一個預設值
  • 有固定的值
  • 是必需的
  • 是隱含的

2.1. 預設值
它包含預設值。 值可以用單引號(‘)或雙引號(「)括起來。

語法

以下是指定值的語法 -

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

其中default-value是定義的屬性值。

範例

以下是使用預設值的屬性宣告的簡單範例 -

<?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>

在這個例子中,有一個name元素,屬性id的預設值為0。預設值包含在雙引號中。

2.2. 固定值

如果要指定屬性值是常數且無法更改,則使用#FIXED關鍵字後跟固定值。 固定屬性的常見用途是指定版本號。

語法

以下是固定值的語法 -

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

其中#FIXED是定義的屬性值。

範例

以下是具有FIXED值的屬性宣告的範例 -

<?xml version = "1.0"?>

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

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

在這個例子中,使用了關鍵字#FIXED,它表示"hiyizhi"值是元素<company>的屬性名稱的唯一值。 如果嘗試更改屬性值,則會出錯。

以下是無效的DTD -

<?xml version = "1.0"?>

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

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

2.3. 必需值

只要想要指定需要屬性,可使用#REQUIRED關鍵字。

語法

以下是#REQUIRED的語法 -

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

其中#REQUIRED是定義的屬性型別。

範例

以下是使用#REQUIRED關鍵字進行DTD屬性宣告的範例 -

<?xml version = "1.0"?>

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

<address>
   <name id = "123">
      Max Su
   </name>
</address>

在此範例中,使用#REQUIRED關鍵字指定必須為name元素提供屬性id

2.4. 隱含值

宣告屬性時,必須始終指定值宣告。 如果宣告的屬性沒有預設值,沒有固定值,並且不是必需的,那麼必須宣告該屬性是隱含的。 關鍵字#IMPLIED用於將屬性指定為隱含。

語法

以下是#IMPLIED的語法 -

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

其中#IMPLIED是定義的屬性型別。

範例

以下是#IMPLIED的一個簡單範例

<?xml version = "1.0"?>

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

<address>
   <name />
</address>

在此範例中,使用了#IMPLIED關鍵字,因為我們不希望指定要包含在元素名稱中的任何屬性。 它是可選的。