一、DTD定义
DTD的全称是Document Type Definition, 即文档类型定义。它跟SCHEMA是兄弟,都是用来描述XML文档的结构的。但它与XML文档实例却是类与对象、数据库的表结构与数据记录的关系。说白了,就是对XML的一种规范或者说定义标准。
二、编写DTD
-
DTD文档的声明
内部DTD文档(私有、不推荐使用):<!DOCTYPE 根元素 [定义内容]>,比如:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE worker [
<!ELEMENT worker (name, age, sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
]>
<worker>
<name>张三</name>
<age>45</age>
<sex>男</sex>
</worker>
外部DTD文档(私有、不推荐使用):<!DOCTYPE 根元素 SYSTEM "DTD文件路径">,比如:
C:\\worker.dtd:
<?xml version="1.0" encoding="UTF-8" ?>
<!ELEMENT worker (name, age, sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
xml实例:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><!--注意:如果是外部DTD文档, standalone值为no,这个属性不写也没关系,xml解释器会自动识别;否则值为yes,默认值为yes;-->
<!DOCTYPE worker SYSTEM "C:\\worker.dtd">
<worker>
<name>张三</name>
<age>45</age>
<sex>男</sex>
</worker>
内外结合DTD文档(私有、不推荐使用):<!DOCTYPE 根元素 SYSTEM "DTD文件路径" [定义内容]>,比如:
C:\\worker.dtd:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!ELEMENT worker (name, age, sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
xml实例:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><!--注意:如果是这种内外结合情况,standalone的值既可以是yes,也可以是no,要是大家不信的话,不妨自个试试看,反正我是试过了-->
<!DOCTYPE worker SYSTEM "C:\\worker.dtd" [
<!ELEMENT sex (#PCDATA)>
]>
<worker>
<name>张三</name>
<age>45</age>
<sex>男</sex>
</worker>
公有DTD文档(推荐使用):<!DOCTYPE 根元素 PUBLIC "DTD的名称" "DTD文件路径" [定义内容]>,比如:
Ibatis的配置:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://www.mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hobby.dao.AppOptionDao">
<resultMap id="appOptionBasicResultMap" type="AppOption">
<id property="id" column="a_id" javaType="long" />
<result property="lbdm" column="a_lbdm" javaType="string" />
<result property="lbmc" column="a_lbmc" javaType="string" />
<result property="dm" column="a_dm" javaType="string" />
<result property="pdm" column="pdm" javaType="string" />
<result property="mc" column="a_mc" javaType="string" />
<result property="cs" column="a_cs" javaType="string" />
<result property="bz" column="a_bz" javaType="string" />
<result property="yxbz" column="a_yxbz" javaType="string" />
<result property="gxsj" column="a_gxsj" javaType="date" />
<result property="xtlb" column="a_xtlb" javaType="string" />
</resultMap>
<sql id="appOptionCol">
a.id as a_id,
a.lbdm as a_lbdm,
a.lbmc as a_lbmc,
a.dm as a_dm,
a.pdm,
a.mc as a_mc,
a.cs as a_cs,
a.bz as a_bz,
a.yxbz as a_yxbz,
a.gxsj as a_gxsj,
a.xtlb as a_xtlb
</sql>
<!-- select -->
<select id="findAppOptions" resultMap="appOptionBasicResultMap">
select
<include refid="appOptionCol" />
from APP_OPTION a
order by a.lbdm,a.dm
</select>
<select id="findAppOptionById" resultMap="appOptionBasicResultMap">
select
<include refid="appOptionCol" />
from APP_OPTION a
where a.id=#{id}
</select>
</mapper>
注意:公开DTD文档的名称(如上面的例子"-//mybatis.org//DTD Mapper 3.0//EN")有一定的规则,首先说一下开头:
-
-
以"-" 开头表示非标准组织制定;
以"ISO"开头表示是ISO标准化组织批准的;
以"+"开头表示不是ISO的标准化组织批准的;
-
其次//mybatis.org表示DTD的所有者, 其后是//DTD Mapper 3.0 表示DTD描述的文档类型以及版本,最后是//EN表示ISO 639语言标识符;
元素的定义规则
语法:<!ELEMENT 元素名称 元素类型>,比如:
1、纯元素类型(该元素类型常出现在根元素中):
<!ELMENT worker (name, age, sex)>
2、#PCDATA 类型:
<!ELEMENT name (#PCDATA)>
3、ANY 类型:
<!ELEMENT name ANY>
4、EMPTY 类型:
<!ELEMENT name EMPTY>
5、混合类型:
<!ELMENT name (#PCDATA | age)*> (注意:*号比不可少)
类型:
1、EMPTY:空元素类型,不能包含子元素和文本,但可以有属性;如下:
<name id="1"/>
2、#PCDATA:任何字符数据(经本人测试,'<'符合不能这样写而是:“<”;'&'符号不能这样写,而要写成“&”;除此之外,比如:><"'),但是不能包含任何子元素;如下:
<name>
张三"$#@!*"^`~|\/?'"&><》()[]{}9()+=-
</name>
3、ANY = #PCDATA + 任何在DTD中定义的元素内容(元素出现次数和顺序无关);如下:
<name>
张三<age>1</age><sex>男</sex><sex>女</sex>"$#@!*"^`~|\/?'"&><》()[]{}9()+=-
</name>
4、纯元素类型:只包含子元素(子元素必须声明),再也容不下其它内容,比如文本;如下:
<worker>
<name>张三</name>
</worker>
5、混合类型:既可以包含文本又可以包含子元素,它小于或等于ANY类型;如下:
定义:<!ELMENT name (#PCDATA | age)*>
<name>
张三<age>1</age>+=-
</name>
元素修饰符:
属性的定义规则
语法:<!ATTLIST 元素名称 属性名称 类型 属性特点>,示例:
<!ATTLIST worker
id ID #REQUIRED
sex CDATA #REQUIRED
>
<worker id="1" sex="男">
<name>张三</name>
<age>52</age>
</worker>
类型:
1、CDATA:与#PCDATA一样, 一个是元素类型的声明, 一个是属性类型的声明;
<!ATTLIST worker sex CDATA #REQUIRED>
2、ID:取值必须唯一,只能包含字母、数字、下划线以及空格,但空格只能出现在值的两端;可以以字母、下划线、空格开头,其它字符皆不可;
<!ATTLIST worker id ID #REQUIRED>
3、IDREF/IDREFS:引用文档中其它地方声明的ID类型的值;引用单个则用IDREF,引用多个则用IDREFS中间用空格分开;
<!ATTLIST worker parentID IDREF/IDREFS #IMPLIED>
4、Enumerated:枚举
<!ATTLIST worker sex (男|女) #REQUIRED>
特点:
1、#REQUIRED:属性值是必须的
<!ATTLIST worker id ID #REQUIRED>
<worker id="s1">
<name>张三</name>
</worker>
但不可以是
<worker>
<name>张三</name>
</worker>
2、#IMPLIED:属性值是可选的
<!ATTLIST worker phone CDATA #IMPLIED>
<worker phone="000-123456">
<name>张三</name>
</worker>
也可以是
<worker>
<name>张三</name>
</worker>
3、#FIXED:属性值为固定值
<!ATTLIST worker belongsTo CDATA #FIXED "建工集团">
<worker belongsTo="建工集团">
<name>张三</name>
</worker>
不能是
<worker belongsTo="海尔集团">
<name>张三</name>
</worker>
4、DEFAULT VALUE:属性默认值
<!ATTLIST worker sex (男|女) "女">
<worker sex="女">
<name>张三</name>
</worker>
实体
预定义
自定义
语法
1)、普通实体
1.1:内部
语法:<!ENTITY 实体名称 "实体值">,示例:
<!ENTITY copyright "Copyright W3C@TLD">
<project>©right;</project>
1.2:外部
语法:<!ENTITY 实体名称 SYSTEM "URI/URL">,示例:
<!ENTITY copyright SYSTEM "http://www.test.com/xml/worker.xml[dtd]">
<project>©right;</project>
2)、参数实体
2.1:内部
语法:<!ENTITY % 实体名称 "实体值">,示例:
<!ENTITY % hobby "羽毛球,乒乓球">
<!ELEMENT worker (name, age, %hobby;)>
2.2:外部
语法:<!ENTITY % 实体名称 SYSTEM "URI/URL">,示例:
<!ENTITY % hobby SYSTEM "http://www.test.com/xml/worker.xml">
<!ELEMENT worker (name, age, %hobby;)>
区别
1、普通实体只能在xml实例中引用;
2、参数实体只能在DTD中引用;