01-XML-02XML DTD定义文档结构

DTD

DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。 它使用一系列的合法元素来定义文档结构。

XML 构建模块

所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:

  • 元素 元素是 XML 以及 HTML 文档的主要构建模块。

    HTML 元素的例子是 "body" 和 "table"。XML 元素的例子是 "note" 和 "message" 。

    元素可包含文本、其他元素或者是空的。空的 HTML 元素的例子是 "hr"、"br" 以及 "img"。

  • 属性 属性可提供有关元素的额外信息。 属性总是被置于某元素的开始标签中。

    属性总是以名称/值的形式成对出现的。下面的 "img" 元素拥有关于源文件的额外信息:

    <img src="computer.gif" />

    元素的名称是 "img"。属性的名称是 "src"。属性的值是 "computer.gif"。由于元素本身为空,它被一个 " /" 关闭。

  • 实体 实体是用来定义普通文本的变量。实体引用是对实体的引用。

    大多数同学都了解这个 HTML 实体引用:" "。这个"无折行空格"实体在 HTML 中被用于在某个文档中插入一个额外的空格。

    当文档被 XML 解析器解析时,实体就会被展开。

    EG: &lt; <

  • PCDATA PCDATA 的意思是被解析的字符数据(parsed character data)。

    可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。

    PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。

    文本中的标签会被当作标记来处理,而实体会被展开。

    不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &amp;、&lt; 以及 &gt;实体来分别替换它们。

  • CDATA CDATA 的意思是字符数据(character data)。

    CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。

语法

声明元素

语法
<!ELEMENT 元素名称 元素内容>
示例

DTD 实例:<!ELEMENT br EMPTY>

XML 实例:<br/>

说明 语法 示例 描述
空元素 <!ELEMENT 元素名称 EMPTY> <!ELEMENT br EMPTY> 空元素通过类别关键词EMPTY进行声明
只有 PCDATA 的元素 <!ELEMENT 元素名称 (#PCDATA)> <!ELEMENT book (#PCDATA)> 只有 PCDATA 的元素通过圆括号中的 #PCDATA 进行声明
带有任何内容的元素 <!ELEMENT 元素名称 ANY> <!ELEMENT book ANY> 通过类别关键词 ANY 声明的元素,可包含任何可解析数据的组合
带有子元素(序列)的元素 <!ELEMENT 元素名称 (元素[,元素,元素...])> <!ELEMENT book (id,name,author)> 带有一个或多个子元素的元素通过圆括号中的子元素名进行声明

包含指定的子元素以及文本内容的元素时,必须将 #PCDATA 放在最前面,必须用号结尾,必须用"|"分隔。
语法:
<!ELEMENT element-name (#PCDATA | child1 | child2 | ...)*>
局限性:
只可约束子表记的类型,而不可约束其出现的次数及顺序
约束条件中不能出现限制符号
例如:(#PCDATA|子标记+|子标记
)是错误的

声明属性

语法
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
示例

DTD 实例:<!ATTLIST booktype type (java|vue) "java">

XML 实例:<booktype type="java"/>

属性类型的选项
类型 描述
CDATA 值为字符数据 (character data)
ID 值为唯一的 id
IDREF 值为另外一个元素的 id
IDREFS 值为其他 id 的列表
NMTOKEN 值为合法的 XML 名称
NMTOKENS 值为合法的 XML 名称的列表
ENTITY 值是一个实体
ENTITIES 值是一个实体列表
NOTATION 此值是符号的名称
xml: 值是一个预定义的 XML 值
默认值参数的选项
解释
#REQUIRED 属性值是必需的
#IMPLIED 属性不是必需的
#FIXED value 属性值是固定的
属性的默认值

数量词

用于描述元素出现次数

符号 描述
+ 至少出现一次
? 出现0次或1次
* 出现任意次数

示例

声明最少出现一次的元素```<!ELEMENT books (book+)>``

引用方式

内部的DOCTYPE声明

语法
<!DOCTYPE 根元素 [元素声明]>
示例
xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!-- 内部的DOCTYPE声明
【语法】
  <!DOCTYPE 根元素 [元素声明]>
【示例】
    book:根节点
    ELEMENT 定义元素
-->
<!DOCTYPE book[
        <!ELEMENT book (id,name,author)>
        <!ELEMENT id (#PCDATA)>
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT author (#PCDATA)>
        ]>
<book>
    <id>2</id>
    <name>《这是书名》</name>
    <author>张三</author>
</book>

外部文档声明

语法
<!DOCTYPE 根元素 [元素声明]>
示例
  • resources/book.dtd
dtd 复制代码
<!ELEMENT book (id,name,author)>
<!ELEMENT id (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
  • resources/demo.xml
xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book SYSTEM "book.dtd">
<book>
    <id>1</id>
    <name>《这是书名》</name>
    <author>张三</author>
</book>

简要运用

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE books[
        <!ELEMENT books (book)+>
        <!ELEMENT book (id,name,author)>
        <!ELEMENT id (#PCDATA)>
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT author (#PCDATA)>
        <!ATTLIST author type (man|woman) "man">
        <!ATTLIST author age CDATA #REQUIRED>
        ]>
<books>
    <!-- book至少出现一次 -->
    <book>
        <!-- id -->
        <id>1</id>
        <!-- 书名 -->
        <name>《JAVA从入门到放弃》</name>
        <!-- 作者 
            属性type:可选(man|woman)默认值 "man"
            属性age:必填属性
             -->
        <author type="man" age="23">张三</author>
    </book>
    <book>
        <id>2</id>
        <name>《这是一本书》</name>
        <author type="man" age="32">李四</author>
    </book>
</books>
r type="man" age="23">张三</author>
    </book>
    <book>
        <id>2</id>
        <name>《这是一本书》</name>
        <author type="man" age="32">李四</author>
    </book>
</books>
相关推荐
白墨阳2 分钟前
vue3:瀑布流
前端·javascript·vue.js
码老白3 分钟前
【老白学 Java】Warshipv2.0(二)
java·网络
苹果酱05674 分钟前
前端面试vue篇:Vue2 和 Vue3 在设计和性能上有显著区别
java·spring boot·毕业设计·layui·课程设计
万琛16 分钟前
【java-Neo4j 5开发入门篇】-最新Java开发Neo4j
java·neo4j
霍先生的虚拟宇宙网络31 分钟前
webp 网页如何录屏?
开发语言·前端·javascript
Bald Baby34 分钟前
JWT的使用
java·笔记·学习·servlet
魔道不误砍柴功40 分钟前
实际开发中的协变与逆变案例:数据处理流水线
java·开发语言
jessezappy1 小时前
jQuery-Word-Export 使用记录及完整修正文件下载 jquery.wordexport.js
前端·word·jquery·filesaver·word-export
dj24429457071 小时前
JAVA中的Lamda表达式
java·开发语言