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头之后是文档类型声明,通常称为
DOCTYPE
,DOCTYPE
通知解析器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
关键字,因为我们不希望指定要包含在元素名称中的任何属性。 它是可选的。