XML之DTD文档

本博客内容参考《深入体验Java Web开发内幕--核心基础

DTD


目录

DTD

前言

一 定义

二 初识

三 在xml文档中引入外部 dtd 文件

四 在XML中嵌入 DTD 定义语句

五 DTD语法细节

六 属性定义



前言

在大家学习使用Spring的时候,一定发现了相关xml文件上面总有一段代码

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

虽然平时的开发不需要更改上面的这一行代码,了解一下上面这一段话的内容和 .dtd 文件是干什么的总是有所益处的,让你更加了解整个框架的工作机制以及原理。下面将一点一点的讲述上面这段代码的每一个字段的含义。

 

一 定义

    文档类型定义 DTD (Document Type Definition) 是早期出现的一种 XML 约束模式语言,按照 DTD 语法创建的文件称为 DTD 文件。 通过比较 XML 文档和 DTD 文件,就可以判断XML文档是否符合某种约束规范,以及其中的元素和标签使用是否正确。

 

二 初识

    一个 DTD 文件中可以包含元素和元素之间的关系的定义,元素的属性定义,以及实体和符号的定义。 DTD 文件时文本格式的文件没后缀名通常为 .dtd 。下面展示一段数据的 XMLDTD 文件两种形式

Human.xml

<?xml version="1.0"?>
<人类>
    <人>
        <名字>张三</名字>
        <性别>男</性别>
        <年龄>20</年龄>
    </人>
    <人>
        <名字>李四</名字>
        <性别>女</性别>
        <年龄>18</年龄>
    </人>
</人类>

相等形式的 DTD 约束文件:

Human.dtd

<!ELEMENT 人类 (人+)>
<!ELEMENT 人 (名字,性别,年龄)>
<!ELEMENT 名字 (#PCDATA)>
<!ELEMENT 性别 (#PCDATA)>
<!ELEMENT 年龄 (#PCDATA)>

通用语法格式: <!ELEMENT 元素名称 使用规则>

【解释】

              人+ :“+”用于表示他修饰的成分必须出现一次或者多次

             (#PCDATA):用于表示元素中桥套的内容时普通文本字符

            (名字,性别,年龄):表示元素中要嵌套的名字,性别,年龄等元素,并且这些子元素要按顺序依次出现,

            DTD文件应该使用UTF-8Unicode编码。如果DTD文件中的文本内容全部是英文字符,它们本身就符合UTF-8编码,不需要进行特殊的转换;如果DTD文件中的文本内容包含中文字符,那么就需要将它们转换成UTF-8编码后保存。

 

三 在xml文档中引入外部 dtd 文件

两种引入方式:

  1.  <!DOCTYPE 文档类型名称 SYSTEM "DTD 文件的URL">

  2. <!DOCTYPE 文档类型名称 PUBLIC "DTD 名称" "DTD 文件的URL">

示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

【解释】

  • 文档类型名称:由XML文档编写者自己定义,一个通用的习惯是使用XML文档的根元素名称来作为文档类型名称
  • 关键字 SYSTEM:表明 XML 文件所遵循的是一个本地或组织内部所编写和使用的 DTD 文件;
  • 关键字 PUBLIC:表明 XML 所遵循的是一个由权威机构制定的、公开提供给特定行业或者公众使用的 DTD 文件,而不是某个组织内部的规范文件
  • "DTD 名称":用于指定该 DTD 文件的标识名称,它只再使用关键字 PUBLICDOCTYPE 声明语句中出现。DTD 标识名称需要用双引号 (") 括起来。例如用于 Java Web 应用程序的配置文件的 DTD 文件的标识名称为 "-//Sun Microsystems,Inc ./DTD Web Application 2.3//EN"。DTD 标识名称应符合一些标准的规定,对于ISO 标准的 DTD 以 “ISO”三个字母开头;被改进的非 ISO 标准的 DTD 以加号 "+" 开头:未被改进的非ISO 标准的 DTD 以减号 “-”开头。紧跟着开始部分后的DTD 所描述文件的说明,最后在双斜杠“//”之后是语言的类种,虽然标识名称看上去比较复杂,但这完全时由DTD 文件发布者去考虑的事情,XML 文件的编写者只要把 DTD 文件发布者事先定义好的DTD 标识名称复制到相应的位置就可以了。

看完这解释,不难看出上面这段代码的出处和每段代码的意义了:

  1. 文档类型为 mapper 文件
  2. PUBLIC 使用的dtd文件是权威机构指定的、公开提供给特定行业或者公众使用的 DTD 文件
  3. - :未被改进的非 Sun 标准的 DTD
  4. mybatis.org 标准
  5. Mapper 用于Mapper的配置文件 3.0为版本号
  6. //EN 使用的语种是英语
  7. DTD文件的URL为:http://mybatis.org/dtd/mybatis-3-mapper.dtd

如果像明确要求解析器程序必须对XML文档进行邮箱行验证时,XML 声明语句中的 standalone 属性应设置为“no" ,已说明这个 XML 文档不是自成一体的,必须和其他文件(这里指DTD文件) 一起使用。

示例:将Human.dtd 引入 Human.xml

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<! DOCTYPE 人类 SYSTEM "Human.dtd">
<人类>
    <人>
        <名字>张三</名字>
        <性别>男</性别>
        <年龄>20</年龄>
    </人>
    <人>
        <名字>李四</名字>
        <性别>女</性别>
        <年龄>18</年龄>
    </人>
</人类>

 

四 在XML中嵌入 DTD 定义语句

XML 文档中,还可以使用另外一种形式的 DOCTYPE 声明语句来直接包含 DTD 定义语句,格式:

<?xml version="1.0 encoding="utf-8" standalone="yes">
<!DOCTYPE 人类[
    <!ELEMENT 人类 (人+)>
    <!ELEMENT 人 (名字,性别,年龄)>
    <!ELEMENT 名字 (#PCDATA)>
    <!ELEMENT 性别 (#PCDATA)>
    <!ELEMENT 年龄 (#PCDATA)>
]>​
<人类>
    <人>
        <名字>张三</名字>
        <性别>男</性别>
        <年龄>20</年龄>
    </人>
    <人>
        <名字>李四</名字>
        <性别>女</性别>
        <年龄>18</年龄>
    </人>
</人类>

在使用 DOCTYPE 声明语句引入一个外部的 DTD 文件的同时,还可以在这个 DOCTYPE 声明语句中嵌入 DTD 定义语句

<!DOCTYPE Web-app
    PUBLIC ""-//Sun Microsystems, Inc .//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/Web-app_2_3.dtd"
    [
        !ENTITY copyright STSTEM "http://www.dcpnet.cn/copyright.xml"
    ]>

 

五 DTD语法细节

在 DTD 元素定义规则中,可以有下一些形式

先放入样例代码

<!ELEMENT 人类 (人+)>
<!ELEMENT 人 (名字,性别,年龄)>
<!ELEMENT 名字 (#PCDATA)>
<!ELEMENT 性别 (#PCDATA)>
<!ELEMENT 年龄 (#PCDATA)>
  • (#PCDATA)表示元素中更穷套的内容是普通的文本字符串,其中,关键字 PCDATAParsed Charater Data (被解析的字符数据) 的简写美因茨妈在元素内容中出现的特助字符需要用相应的预定义实体表示
  • 用一对圆括号 () 将元素中要桥套的一组子元素括起来,例如,(姓名,性别,售价)表示元素中要嵌套姓名、性别、年龄等子元素
  • 元素中也可以嵌套文本字符串与其他子元素的混合,例如:(姓名,#PCDATA)
  • 关键字 EMPTY 表示元素中不包含任何子元素和普通文本字符串,这种i情况用于定义XML 文件中的空元素,例如 <!ELEMENT 手机号码 EMPTY> 表示在XML文件中所定义的元素形式为<手机号码/>
  • 关键字 ANY 表示元素中可以有任何类型的子元素和普通文本字符串,以及他们的混合,还可以不包含任何内容。<!ELEMENT 爱好 ANY>语句表示在XML文件中定义的<爱好>中可以嵌套任何形式的内容。除了根元素外,在定义其他元素是,使用ANY 都是不好的习惯,这样就失去了 DTDXML 文档的约束效果。

 

六 属性定义

在 XML 文档中可以为元素这只属性每一个元素到底可以具有怎样的属性设置,这也需要在DTD 文件中进行定义,语法格式:

<!ATTLIST 元素名
    属性名1 属性类型 设置说明
    属性名2 属性类型 设置说明
    ......
>

示例:

<!ATTLIST 人类
    姓名 CDATA #REQUIRED
    性别 CDATA #IMPLIED
    食物链定位 CDATA #FIXED ”顶端“
>

使用:<人类 姓名="Dcpent" 性别="男">...</人类>

【属性说明】

  • #REQUIRED :必须设置该属性

  • #IMPLIED:设置可选,设置与否

  • #FIXED:该属性的取值固定为一个默认值,在XML 文件中不能将该属性设置为其他值。使用 #FICXED 关键字时,还需要为该属性提供一个默认值

在定义元素的属性时,可以将属性这是为10种类型

  1. CDATA  表示普通文本字符串。出现特殊字符时也学要使用转义字符序列来表示。
  2. ENUMERATED (枚举类型)属性值只能是这个列表中的某个值。
  3. ID 表示设置值将用于唯一表示一个XML 文件中的某个元素,这种ID类型的属性通常由XML 文件的解析处理程序或脚本语言使用
<?xml version="1.0 encoding="utf-8" standalone="yes">
<!DOCTYPE 人类[
    <!ELEMENT 人类 (人+)>
    <!ELEMENT 人 (名字,性别,年龄)>
    <!ELEMENT 名字 (#PCDATA)>
    <!ELEMENT 性别 (#PCDATA)>
    <!ELEMENT 年龄 (#PCDATA)>
    <!ATTLIST 人类 编号 ID #REQUIRED>
]>​
<人类>
    <人 编号="1">
        <名字>张三</名字>
        <性别>男</性别>
        <年龄>20</年龄>
    </人>
    <人 编号="2">
        <名字>李四</名字>
        <性别>女</性别>
        <年龄>18</年龄>
    </人>
</人类>

    4.IDREF 和 IDEREFS  一个元素的 IDREF 类型的属性设置值僵尸同一个 XML 文件中的另一个元素的ID 类型的属性的设置值。

<?xml version="1.0 encoding="utf-8" standalone="yes">
<!DOCTYPE 人类[
    <!ELEMENT 人类 (人+)>
    <!ELEMENT 人 (名字,性别,年龄)>
    <!ELEMENT 名字 (#PCDATA)>
    <!ELEMENT 性别 (#PCDATA)>
    <!ELEMENT 年龄 (#PCDATA)>
    <!ATTLIST 人类 编号 ID #REQUIRED>
    <!ATTLIST 人类 父亲 IDREF #IMPLIED>
]>​
<人类>
    <人 编号="1">
        <名字>张三</名字>
        <性别>男</性别>
        <年龄>20</年龄>
    </人>
    <人 编号="2" 父亲="1">
        <名字>李四</名字>
        <性别>女</性别>
        <年龄>18</年龄>
    </人>
</人类>

IDREFS关键字用于表示IDREF的列表类型,一个元素的IDREFS类型的属性设置值可以是同一个XML文件中的另外多个元素的ID类型的属性的设置值,每个ID属性值之间用空格分隔。

5.NMTOKEN 和 NMTOKENS

6.NOTATION

7.ENTITY 和 ENTITIES

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值