XML学习笔记2——DTD

  在上一篇笔记中,将文档类型分类时,曾经根据文档是否使用并遵守了DTD或Schema来区分为格式良好的XML和有效的XML,那么什么是DTD和Schema呢?DTD和Schema都是用来规范XML文档的,对XML文档进行语义约束的,DTD简单易用,Schema则功能强大。在这篇笔记中,首先学习一下DTD(Document Type Definition,文档类型定义)。

1、在XML文档中怎么使用DTD

导入方式语法格式说明
内部DTD
<!DOCTYPE 根元素名[
     元素描述
]>

将DTD定义放在XML文档内部,紧跟在XML声明和处理指令后面

如:<!DOCTYPE 模型列表[

     <!ELEMENT 模型列表(模型)*>

     ]>

外部DTD
<!DOCTYPE 根元素名 SYSTEM "外部DTD的URI">

将DTD单独定义在一个文件内,然后通过关键字SYSTEM导入DTD

如:<!DOCTYPE 模型列表 SYSTEM "模型列表DTD文件的相对路径或绝对路径">

公用DTD
<!DOCTYPE 根元素名 PUBLIC "DTD的标识名" "公用DTD的URI">

公用DTD,这种DTD一般是由某个权威机构指定,供特定行业或公众使用,通过关键字PUBLIC导入

如:<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

2、 DTD的结构

DTD文档本身不是XML文档,而只是为XML定义语义约束的文档,DTD文档的语法非常简单,大致有如下结构:

(1)第一行是DTD文档的声明,语法和XML的声明相同

(2)0到多个注释部分,DTD注释与XML注释语法相同

(3)0到多个<!ELEMENT...>定义,每个<!ELEMENT...>定义一个XML元素

(4)0到多个<!ATTLIST...>定义,每个<!ATTLIST...>为XML元素定义一个属性

(5)0到多个<!ENTITY...>定义,每个<!ENTITY...>定义一个实体

(6)0到多个<!NOTATION...>定义,每个<!NOTATION...>定义一个符号

其中<!ELEMENT...>、<!ATTLIST...>、<!ENTITY...>、<!NOTATION...>4个定义彼此完全独立,无须互相嵌套,下面就逐一说明这四种定义。

3、定义元素

(1)元素类型定义,Element Type Definition,简称ETD

(2) 元素类型

元素类型定义格式说明
任意类型<!ELEMENT 元素名称 ANY>元素可以是字符串,可以是空元素,也可以包含子元素
字符串值<!ELEMENT 元素名称 (#PCDATA)>元素值只能是字符串,不可以是空元素,也不能包含子元素
空元素<!ELEMENT 元素名称 EMPTY> 
包含子元素 比较复杂,需要详细定义子元素之间的顺序以及子元素出现的次数等
混合类型<!ELEMENT 元素名称 (#PCDATA|子元素1|子元素2|...)*>指定值只能是几个确定的类型,比任意类型有更强的约束,但功能相当,应尽量使用混合类型

关于混合类型的定义,说明几点:

A:#PCDATA必须放在最前面

B:#PCDATA和各子元素之间只能用竖线(|)分隔,不要使用逗号分隔

C:不要在子元素之后使用?、*、+等表示频率的修饰符

(3)定义子元素

定义子元素的语法说明子元素的出现频率修饰词说明
(子元素1,子元素2,...)使用英文逗号定义有序的子元素默认(没有修饰词)出现一次,且只能出现一次
(子元素1|子元素2|...)使用竖线定义互斥的子元素?出现0或1次
((子元素1,子元素2)|(子元素3,子元素4))使用括号将子元素分组+出现1或多次
(子元素1|子元素2|...)+使用竖线互斥,然后使用频率修饰实现定义无序的子元素*出现0或多次

4、定义属性

在XML中,属性不能单独存在,因此定义属性时必须指定属于哪个元素。定义属性的语法格式如下:

<!ATTLIST 属性所属的元素名称  属性名称  属性类型  [元素对属性的约束]  [默认值]>

(1)属性类型

类型说明
CDATA该属性值只能是字符串数据
(en1|en2|en3)该属性值必须是一系列枚举值之一
ID该属性值必须是有些的标识符,且该属性值可用于标识该元素,因此必须在此XML文档中唯一
IDREF该属性值必须是引用另一个已有的ID类型的属性值
IDREFS该属性值必须是引用已有的一个或多个ID类型的属性值,多个ID类型的属性值之间使用空格分隔
NMTOKEN该属性值必须是合法的XML名称,必须是字符串数据,比CDATA约束更强,只能由字母、数字、下划线、中划线,点号和冒号组成
NMTOKENS该属性值必须是一个或多个NMTOKEN类型的属性值,多个使用空格分隔
ENTITY该属性值是一个外部实体,比如图片
ENTITIES该属性值是一个或多个ENTITY类型的属性值,多个使用空格分隔
NOTATION该属性值是在DTD中声明过的符号(NOTATION),这是个将要过期的规范,尽量避免使用
xml:该属性值是一个预定义的XML值

(2)元素对属性的约束与默认值的关系

元素对属性的约束说明默认值
未指定 必须指定默认值
#REQUIRED必须的属性,必须为相应元素提供该属性不能指定默认值
#IMPLIED该属性可有可无不能指定默认值
#FIXED该属性值是固定的,定义时必须指定固定值必须指定默认值

5、定义实体

实体引用就是用一个字符串代替另一个字符串,类似于C语言中的宏,上一篇笔记中已经提到过XML中内置的5个实体引用,在这里接着看看怎么自定义实体引用。

实体类型使用场所定义语法使用语法说明
普通实体XML<!ENTITY 实体名 "实体值">&实体名; 
参数实体DTD<!ENTITY % 实体名 "实体值">%实体名;必须在使用前先定义
外部实体XML<!ENTITY 实体名 SYSTEM "实体值所在文件的URI">&实体名;这里外部文件必须是满足XML文档结构的文本文档
公用外部实体XML<!ENTITY 实体名 PUBLIC "公用实体标识名" "实体值所在文件的URI">&实体名; 
外部参数实体DTD<!ENTITY % 实体名 SYSTEM "实体值所在文件的URI">%实体名; 
公用外部参数实体DTD<!ENTITY % 实体名 PUBLIC "公用实体标识名" "实体值所在文件的URI">%实体名; 
未解析实体XML<!ENTITY % 实体名 SYSTEM "实体值所在文件的URI" NDATA 符号名>需要通过ENTITY等类型的属性调用未解析实体不能由XML文档解析,而需要根据相应的符号名去解析
公用未解析实体XML<!ENTITY % 实体名 PUBLIC "公用实体标识名" "实体值所在文件的URI" NDATA 符号名>

6、定义符号

定义符号也有两种语法格式,分别定义普通符号和公用符号:

符号类型定义语法
普通符号<!NONATION 符号名 SYSTEM "符号值">
公用符号<!NONATION 符号名 PUBLIC "公用符号标识名" "符号值">

符号值通常有两种形式:

(1)MIME:通用MIME类型的文件总是由相应的程序负责处理

(2)外部程序所在路径:直接指定某个外部程序负责处理XML文档中的外部数据

符号通常有两种用途:

(1)如上,符号可以用来定义未解析实体

(2)符号可以作为ENTITY或ENTITIES类型的属性值

(3)符号还可以作为NOTATION类型的属性的值,定义NOTATION类型的属性时,语法如下:

<!ATTLIST 属性所属的元素 属性名 NOTATION  (值1|值2|...) 约束 默认值>

比一般的属性定义多一个值的列表。

 

转载于:https://www.cnblogs.com/linjisong/p/3297630.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
XML 映射文件中,可以使用 DTD(Document Type Definition)来定义 XML 文档的结构。 DTD 是一种 XML 文档类型定义语言,它可以定义 XML 文档中元素的类型、属性和顺序等信息。在 XML 映射文件中使用 DTD 可以确保 XML 文档的结构符合规范,同时也方便解析器对 XML 文档进行验证。 下面是一个简单的 DTD 示例: ```xml <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> ``` 在这个示例中,<!DOCTYPE> 指令定义了 DTD 的声明。其中,PUBLIC 表示这个 DTD 是公共的,可以被其他文档引用;"-//mybatis.org//DTD Mapper 3.0//EN" 是 DTD 的标识符,用于唯一标识这个 DTD;"http://mybatis.org/dtd/mybatis-3-mapper.dtd" 是 DTD 文件的 URL,用于指定 DTD 文件的位置。 在使用 DTD 定义 XML 文档结构时,可以在 XML 文档中引用 DTD 文件,也可以直接在 XML 文档中嵌入 DTD 定义。例如: ```xml <!DOCTYPE mapper [ <!ELEMENT mapper (select|insert|update|delete)*> <!ELEMENT select (include? , parameter*, (if|choose|when)*, trim*, foreach*, bind*, sql, selectKey?, include*, comment*)> <!ELEMENT insert (selectKey?, parameter*, (if|choose|when)*, trim*, foreach*, bind*, values, selectKey?, include*, comment*)> <!ELEMENT update (selectKey?, parameter*, (if|choose|when)*, trim*, foreach*, bind*, set*, selectKey?, include*, comment*)> <!ELEMENT delete (selectKey?, parameter*, (if|choose|when)*, trim*, foreach*, bind*, include*, comment*)> <!ELEMENT sql (#PCDATA)> <!ELEMENT include (#PCDATA)> <!ELEMENT bind (#PCDATA)> <!ELEMENT trim ((#PCDATA) | trim)*> <!ELEMENT set (#PCDATA)> <!ELEMENT values (#PCDATA)> <!ELEMENT foreach ((#PCDATA) | trim)*> <!ELEMENT if (#PCDATA)> <!ELEMENT choose ((when | otherwise)+)> <!ELEMENT when (#PCDATA)> <!ELEMENT otherwise (#PCDATA)> <!ELEMENT selectKey (#PCDATA)> <!ELEMENT parameter (#PCDATA)> <!ATTLIST mapper namespace CDATA #IMPLIED> <!ATTLIST select id CDATA #REQUIRED parameterType CDATA #IMPLIED resultMap CDATA #IMPLIED fetchSize CDATA #IMPLIED flushCache (true|false) "false" statementType (STATEMENT | PREPARED | CALLABLE) "PREPARED" resultSetType (FORWARD_ONLY | SCROLL_INSENSITIVE | SCROLL_SENSITIVE) "FORWARD_ONLY" timeout CDATA #IMPLIED useCache (true|false) "true" resultOrdered (true|false) "false"> <!ATTLIST insert id CDATA #REQUIRED parameterType CDATA #IMPLIED flushCache (true|false) "false" statementType (STATEMENT | PREPARED | CALLABLE) "PREPARED" timeout CDATA #IMPLIED useGeneratedKeys (false|true) "false" keyProperty CDATA #IMPLIED keyColumn CDATA #IMPLIED selectKey CDATA #IMPLIED> <!ATTLIST update id CDATA #REQUIRED parameterType CDATA #IMPLIED flushCache (true|false) "false" statementType (STATEMENT | PREPARED | CALLABLE) "PREPARED" timeout CDATA #IMPLIED> <!ATTLIST delete id CDATA #REQUIRED parameterType CDATA #IMPLIED flushCache (true|false) "false" statementType (STATEMENT | PREPARED | CALLABLE) "PREPARED" timeout CDATA #IMPLIED> <!ATTLIST sql id CDATA #IMPLIED> <!ATTLIST include refid CDATA #IMPLIED> <!ATTLIST bind name CDATA #REQUIRED value CDATA #REQUIRED> <!ATTLIST trim prefix CDATA #IMPLIED suffix CDATA #IMPLIED suffixOverrides CDATA #IMPLIED prefixOverrides CDATA #IMPLIED> <!ATTLIST set prepend CDATA #IMPLIED suffix CDATA #IMPLIED suffixOverrides CDATA #IMPLIED prefixOverrides CDATA #IMPLIED> <!ATTLIST values nullValue CDATA #IMPLIED> <!ATTLIST foreach collection CDATA #REQUIRED item CDATA #IMPLIED index CDATA #IMPLIED open CDATA #IMPLIED close CDATA #IMPLIED separator CDATA #IMPLIED> <!ATTLIST if test CDATA #REQUIRED> <!ATTLIST when test CDATA #REQUIRED> <!ATTLIST selectKey keyProperty CDATA #IMPLIED resultType CDATA #IMPLIED order CDATA #IMPLIED> <!ATTLIST parameter property CDATA #IMPLIED javaType CDATA #IMPLIED jdbcType CDATA #IMPLIED mode CDATA #IMPLIED resultMap CDATA #IMPLIED numericScale CDATA #IMPLIED typeHandler CDATA #IMPLIED> ]> ``` 在这个示例中,DST 声明了一个名为 mapper 的元素,它包含 0 个或多个 select、insert、update、delete 元素,且这些元素可以以任意顺序出现。同时,还定义了这些元素的属性和属性值,如 select 元素必须包含 id 属性,而 insert 元素可以包含 useGeneratedKeys 和 selectKey 属性等。 通过 DTD,我们可以定义出符合规范XML 文档结构,并对 XML 文档进行验证,从而确保数据的正确性和完整性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值