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关键字,因为我们不希望指定要包含在元素名称中的任何属性。 它是可选的。