DTD - 属性



本章将讨论 DTD 属性。属性提供了关于元素的更多信息,更准确地说,它定义了元素的一个属性。XML 属性始终采用名称-值对的形式。一个元素可以拥有任意数量的唯一属性。

属性声明在许多方面都非常类似于元素声明,只有一个例外;您声明的是每个元素允许的属性列表,而不是声明元素允许的内容。这些列表称为 ATTLIST 声明。

语法

DTD 属性声明的基本语法如下:

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

在上文的语法中:

  • 如果元素包含属性,则 DTD 属性以 <!ATTLIST 关键字开头。

  • 元素名称指定应用属性的元素的名称。

  • 属性名称指定包含在元素名称中的属性的名称。

  • 属性类型定义属性的类型。我们将在以下部分详细讨论这一点。

  • 属性值采用属性必须定义的固定值。我们将在以下部分详细讨论这一点。

示例

以下是 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 头之后的是文档类型声明,通常称为 DOCTYPE,如下所示:

    DOCTYPE 告知解析器此 XML 文档与一个 DTD 关联。DOCTYPE 声明的元素名称开头有一个感叹号 (!) 。

<!DOCTYPE address [
  • 以下是 DTD 的主体。这里我们声明了元素和属性:

<!ELEMENT address ( name )>
<!ELEMENT name ( #PCDATA )>
  • 元素 name 的属性 id 定义如下:

    这里的属性类型是 CDATA,其值为 #REQUIRED

<!ATTLIST name id CDATA #REQUIRED>

属性声明规则

  • XML 文档中使用的所有属性都必须使用属性列表声明在文档类型定义 (DTD) 中声明。

  • 属性只能出现在开始标记或空标记中。

  • 关键字 ATTLIST 必须大写。

  • 对于给定的元素,属性列表中不允许出现重复的属性名称。

属性类型

声明属性时,您可以指定处理器如何处理值中出现的数据。我们可以将属性类型分为三大类:

  • 字符串类型

  • 标记化类型

  • 枚举类型

下表总结了不同的属性类型:

序号 类型和描述
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

枚举

它允许定义一个特定值的列表,其中必须匹配其中一个值。它是一种 枚举属性类型

属性值声明

在每个属性声明中,您必须指定值在文档中将如何出现。您可以指定属性:

  • 可以具有默认值

  • 可以具有固定值

  • 是必需的

  • 是隐含的

默认值

它包含默认值。值可以包含在单引号 (') 或双引号 (") 中。

语法

以下是值的语法:

<!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。默认值包含在双引号中。

固定值

当您想指定属性值是常量且不能更改时,使用 #FIXED 关键字后跟固定值。固定属性的一个常见用途是指定版本号。

语法

以下是固定值的语法:

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

其中 #FIXED 是定义的属性值。

示例

以下是一个带有固定值的属性声明的简单示例:

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

在这个例子中,我们使用了 #FIXED 关键字,它表示 "tutorialspoint" 是元素 <company> 的属性 name 的唯一值。如果我们尝试更改属性值,则会报错。

以下是一个无效的 DTD:

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

必需值

当您想指定属性是必需时,使用 #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">
      Tanmay Patil
   </name>
</address>

在这个例子中,我们使用了 #REQUIRED 关键字来指定必须为元素名称 name 提供属性 id

隐含值

声明属性时,您必须始终指定一个值声明。如果要声明的属性没有默认值、没有固定值且不是必需的,则必须将属性声明为 隐含的。关键字 #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 关键字,因为我们不想指定任何要包含在元素 name 中的属性。它是可选的。

广告