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>
相关推荐
启山智软12 小时前
【中大企业选择源码部署商城系统】
java·spring·商城开发
我真的是大笨蛋12 小时前
深度解析InnoDB如何保障Buffer与磁盘数据一致性
java·数据库·sql·mysql·性能优化
怪兽源码12 小时前
基于SpringBoot的选课调查系统
java·spring boot·后端·选课调查系统
恒悦sunsite12 小时前
Redis之配置只读账号
java·redis·bootstrap
梦里小白龙12 小时前
java 通过Minio上传文件
java·开发语言
人道领域12 小时前
javaWeb从入门到进阶(SpringBoot事务管理及AOP)
java·数据库·mysql
sheji526113 小时前
JSP基于信息安全的读书网站79f9s--程序+源码+数据库+调试部署+开发环境
java·开发语言·数据库·算法
毕设源码-邱学长13 小时前
【开题答辩全过程】以 基于Java Web的电子商务网站的用户行为分析与个性化推荐系统为例,包含答辩的问题和答案
java·开发语言
摇滚侠13 小时前
Java项目教程《尚庭公寓》java项目从开发到部署,技术储备,MybatisPlus、MybatisX
java·开发语言
€81113 小时前
Java入门级教程24——Vert.x的学习
java·开发语言·学习·thymeleaf·数据库操作·vert.x的路由处理机制·datadex实战