DTD - 元素

XML 元素可以定义为 XML 文档的构建块。元素可以充当容器,用于保存文本、元素、属性、媒体对象或所有这些的混合。

DTD 元素通过 ELEMENT 声明进行声明。当 XML 文件通过 DTD 进行验证时,解析器首先检查根元素,然后验证子元素。

语法

所有 DTD 元素声明都具有此通用形式 −

<!ELEMENT elementname (content)>
  • ELEMENT 声明用于向解析器指示您即将定义一个元素。

  • elementname 是您正在定义的元素名称(也称为通用标识符)。

  • content 定义元素内可以包含哪些内容(如果有)。

元素内容类型

DTD 中元素声明的内容可分为以下类别 −

  • 空内容

  • 元素内容

  • 混合内容

  • 任何内容

空内容

这是元素声明的一个特殊情况。此元素声明不包含任何内容。这些内容用关键字 EMPTY 声明。

语法

以下是空元素声明 − 的语法

<!ELEMENT elementname EMPTY >

在上述语法中 −

  • ELEMENT 是类别 EMPTY

  • 的元素声明
  • elementname 是空元素的名称。

示例

以下是演示空元素声明的简单示例 −

<?xml version = "1.0"?>

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

在此示例中,address 被声明为空元素。address 元素的标记将显示为 <address />。

元素内容

在带有元素内容的元素声明中,内容将是括号内的允许元素。我们还可以包含多个元素。

语法

以下是带有元素内容 − 的元素声明的语法

<!ELEMENT elementname (child1, child2...)>
  • ELEMENT 是元素声明标签

  • elementname 是元素的名称。

  • child1、child2.. 是元素,每个元素在 DTD 中都必须有自己的定义。

示例

以下示例演示了带有元素内容的元素声明的简单示例 −

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

在上面的例子中,address是父元素,namecompanyphone_no是其子元素。

运算符和语法规则列表

下表显示了可用于定义子元素 − 的运算符和语法规则列表。

运算符 语法 描述 示例
+ <!ELEMENT element-name (child1+)> 表示子元素可以在父元素中出现一次或多次。

<!ELEMENT address (name+)>

子元素 name 可以在元素名称 address 中出现一次或多次。

* <!ELEMENT element-name (child1*)> 表示子元素可以出现零次或更多次出现在父元素内。

<!ELEMENT address (name*)>

子元素 name 可以在元素名称 address 内出现零次或更多次。

p>
? <!ELEMENT element-name (child1?)> 它表示子元素可以在父元素中出现零次或一次。

<!ELEMENT address (name?)>

子元素 name 可以在元素名称 address 中出现零次或一次。

, <!ELEMENT element-name (child1, child2)> 它给出以逗号分隔的子元素序列,这些子元素必须包含在 element-name 中。

<!ELEMENT address (name, company)>

子元素 namecompany 的序列,它们必须在元素名称中以相同的顺序出现元素名称 address

| <!ELEMENT element-name (child1 | child2)> 它允许在子元素中进行选择。

<!ELEMENT address (name | company)>

它允许您选择子元素,即 namecompany,它们必须出现在元素名称 address 内。

规则

如果元素内容不止一个,我们需要遵循某些规则 −

  • 序列 − 通常,DTD 文档中的元素必须以不同的顺序出现。如果是这种情况,则使用序列定义内容。

    声明表明 <address> 元素必须恰好有三个子元素 - <name>、<company> 和 <phone> - 并且它们必须按此顺序出现。例如 −

<!ELEMENT address (name,company,phone)>
  • 选择 −假设您需要允许一个元素或另一个元素,但不能同时允许两者。在这种情况下,您必须使用竖线 (|) 字符。竖线用作排他或。例如 −

<!ELEMENT address (mobile | landline)>

混合元素内容

这是 (#PCDATA) 和子元素的组合。PCDATA 代表解析的字符数据,即非标记的文本。在混合内容模型中,文本可以单独出现,也可以散布在元素之间。混合内容模型的规则类似于上一节中讨论的元素内容。

语法

以下是混合元素内容的通用语法 −

<!ELEMENT elementname (#PCDATA|child1|child2)*>
  • ELEMENT 是元素声明标记。

  • elementname 是元素的名称。

  • PCDATA 是非标记的文本。#PCDATA 必须在混合内容声明中排在第一位。

  • child1、child2.. 是元素,每个元素在 DTD 中都必须有自己的定义。

  • 如果包含子元素,则运算符 (*) 必须跟在混合内容声明之后

  • (#PCDATA) 和子元素声明必须由 (|) 运算符分隔。

示例

以下是一个简单的示例,演示了 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>

ANY 元素内容

您可以在内容中使用 ANY 关键字声明元素。它通常被称为混合类别元素。当您尚未决定元素的允许内容时,ANY 很有用。

语法

以下是使用 ANY 内容声明元素的语法 −

<!ELEMENT elementname ANY>

此处,ANY 关键字表示文本 (PCDATA) 和/或 DTD 中声明的任何元素都可以在 <elementname> 元素的内容中使用。它们可以按任意顺序使用任意次数。但是,ANY 关键字不允许您包含未在​​ DTD 中声明的元素。

示例

以下是一个简单的示例,演示了使用 ANY 内容的元素声明 −

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

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

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