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>
相关推荐
摇滚侠23 分钟前
Spring Boot3零基础教程,SpringApplication 自定义 banner,笔记54
java·spring boot·笔记
青云交26 分钟前
Java 大视界 -- Java 大数据机器学习模型在游戏用户行为分析与游戏平衡优化中的应用
java·大数据·机器学习·数据存储·模型构建·游戏用户行为分析·游戏平衡优化
暗武逢天3 小时前
Java导出写入固定Excel模板数据
java·导出数据·easyexcel·excel固定模板导出
摇滚侠3 小时前
Spring Boot3零基础教程,KafkaTemplate 发送消息,笔记77
java·spring boot·笔记·后端·kafka
namekong83 小时前
清理谷歌浏览器垃圾文件 Chrome “User Data”
前端·chrome
开发者小天4 小时前
调整为 dart-sass 支持的语法,将深度选择器/deep/调整为::v-deep
开发语言·前端·javascript·vue.js·uni-app·sass·1024程序员节
fat house cat_6 小时前
【netty】基于主从Reactor多线程模型|如何解决粘包拆包问题|零拷贝
java·服务器·网络·netty
青云交7 小时前
Java 大视界 -- Java 大数据在智能教育学习社区互动模式创新与用户活跃度提升中的应用(426)
java·大数据·学习·flink 实时计算·智能教育社区·互动模式创新·用户活跃度
李少兄7 小时前
HTML 表单控件
前端·microsoft·html
神奇的海马体7 小时前
Tomcat隐藏版本号
java·tomcat