DTD

一、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:任何字符数据(经本人测试,'<'符合不能这样写而是:“&lt;”;'&'符号不能这样写,而要写成“&amp;”;除此之外,比如:&gt;&lt;&quot;&apos;),但是不能包含任何子元素;如下:
   <name>
       张三"$#@!*"^`~|\/?'"&amp;&gt;&lt;》()[]{}9()+=-
   </name>
3、ANY = #PCDATA + 任何在DTD中定义的元素内容(元素出现次数和顺序无关);如下:
   <name>
       张三<age>1</age><sex>男</sex><sex>女</sex>"$#@!*"^`~|\/?'"&amp;&gt;&lt;》()[]{}9()+=-
   </name>
4、纯元素类型:只包含子元素(子元素必须声明),再也容不下其它内容,比如文本;如下:
   <worker>
       <name>张三</name>
   </worker>
5、混合类型:既可以包含文本又可以包含子元素,它小于或等于ANY类型;如下:
   定义:<!ELMENT name (#PCDATA | age)*>
   <name>
       张三<age>1</age>+=-
   </name>

元素修饰符:

192040_zVZ0_2587829.png

 注意:元素的修饰符只能出现在纯元素类型中,也即是对根元素的声明,当然也可以是对子元素的声明。

属性的定义规则

  • 语法:<!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>

实体

  • 预定义

    190232_xLcW_2587829.png

  • 自定义

    192501_YXhM_2587829.png

  • 语法

1)、普通实体
     1.1:内部
              语法:<!ENTITY 实体名称 "实体值">,示例:
                      <!ENTITY copyright "Copyright W3C@TLD">
                      <project>&copyright;</project>
     1.2:外部
              语法:<!ENTITY 实体名称 SYSTEM "URI/URL">,示例:
                      <!ENTITY copyright SYSTEM "http://www.test.com/xml/worker.xml[dtd]">
                      <project>&copyright;</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中引用;

转载于:https://my.oschina.net/u/2587829/blog/552249

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值