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

本文详细解释了DTD在XML和HTML文档中的角色,包括元素、属性、实体、PCDATA和CDATA的概念,以及如何通过DTD声明元素结构、属性类型和约束条件。还介绍了内部和外部DOCTYPE声明的使用方法。
摘要由CSDN通过智能技术生成

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 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
<!ELEMENT book (id,name,author)>
<!ELEMENT id (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
  • resources/demo.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book SYSTEM "book.dtd">
<book>
    <id>1</id>
    <name>《这是书名》</name>
    <author>张三</author>
</book>

简要运用

<?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
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丨Anna丨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值