目录
什么是DTD?
文档类型定义(约束)
什么是XML?
- HTML:超文本标记语言 a/b/c/z
- XML:可扩展标记语言(可任意定义标签,所以没有约束)
XML的作用
- 数据交换
- 做配置
XML的两种文档约束
- DTD: DTD来约束XML的文档类型定义(要求XML按照要求定义标签)
- Schema
XML格式要求(合法XML)
- 有且只有一个根节点 例如:下面的<persons></persons>
- 由开始标签和结束标签组成(包含空标签),中间叫做标签体 eg:<a></a> <br/><hr/>
- XML标签正确区分大小写(大小写对应)
- 正确嵌套标签
- 正确使用结束标签
- 定义有效的属性
<persons>
<person pid="p01" paddr="123" psex="男">
<name>张三</name>
<age>22</age>
<contact>
<phone>select * from t_book where price>200 and price<300</phone>
</contact>
<br/>
</person>
<person pid="p02">
<name>李四</name>
<age>23</age>
<contact>
<mail>123@qq.com</mail>
</contact>
</person>
</persons>
DTD申明
- 内部申明:<!DOCTYPE 根节点[]>
<!-- 内部申明 -->
<!DOCTYPE persons[
...
]>
- 外部申明:<!DOCTYPE 根节点SYSTEM "DTD外部文件路径">
<!-- 外部申明 -->
<!DOCTYPE persons SYSTEM "test.dtd">
元素定义
- 语法:<!ELEMENT 元素名称元素类型>
<!ELEMENT persons (person+)>
- 类型:
- 空元素 EMPTY
<!ELEMENT br EMPTY>
-
- 文本元素:(#PCDATA)--标签里面包含的是标签体,而非子标签
<!ELEMENT name (#PCDATA)>
-
- 混合元素:(e1,e2,e3,...)--标签里面包含很多子标签
<!ELEMENT person (name,age,contact,br?)>
- 限制:
- , 代表:元素出现的顺序
- | 代表:多选一
<!ELEMENT contact (phone|mail)>
-
- ? 代表:元素出现0次或者1次(可有可无)
- * 代表:元素出现0次或者N次
- + 代表:元素出现1次或者N次
属性定义
- 语法:<!ATTLIST 元素名称 属性名称 属性类型 设置说明>
- 类型:
- ID:唯一,不能以/或者数字开头
- CDATA:文本
- 枚举:多选一,例如:(男|女|妖)
不需要设置说明,枚举一般设默认约束,默认约束说明该属性有值
- 设置说明:
- 必须:#REQUIRED
- 可选:#IMPLIED
<!ATTLIST person
pid ID #REQUIRED
paddr CDATA #IMPLIED
psex (男|女|妖) "男"
>
特殊字符转义
- >(大于) >
- <(小于) <
- & &
- '(单引号) '
- "(双引号) "
DTD对元素/属性的限制案例
- person.xml
<!-- 内部申明 -->
<!DOCTYPE persons[
<!ELEMENT persons (person+)>
<!ELEMENT person (name,age,contact,br?)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT contact (phone|mail)>
<!ELEMENT phone (#PCDATA)>
<!ELEMENT mail (#PCDATA)>
<!ELEMENT br EMPTY>
<!ATTLIST person
pid ID #REQUIRED
paddr CDATA #IMPLIED
psex (男|女|妖) "男"
>
]>
<persons>
<person pid="p01" paddr="123" psex="男">
<name>张三</name>
<age>22</age>
<contact>
<phone>select * from t_book where price>200 and price<300</phone>
</contact>
<br/>
</person>
<person pid="p02">
<name>李四</name>
<age>23</age>
<contact>
<mail>123@qq.com</mail>
</contact>
</person>
</persons>
<!-- 外部申明 -->
<!DOCTYPE persons SYSTEM "test.dtd">
<persons>
<person pid="p01" paddr="123" psex="男">
<name>张三</name>
<age>22</age>
<contact>
<phone>select * from t_book where price>200 and price<300</phone>
</contact>
<br/>
</person>
<person pid="p02">
<name>李四</name>
<age>23</age>
<contact>
<mail>123@qq.com</mail>
</contact>
</person>
</persons>
test.dtd:
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT persons (person+)>
<!ELEMENT person (name,age,contact,br?)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT contact (phone|mail)>
<!ELEMENT phone (#PCDATA)>
<!ELEMENT mail (#PCDATA)>
<!ELEMENT br EMPTY>
<!ATTLIST person
pid ID #REQUIRED
paddr CDATA #IMPLIED
psex (男|女|妖) "男"
>
- servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE servlet[
<!ELEMENT servlets (servlet-class,servlet-name+)>
<!ELEMENT servlet-class (#PCDATA)>
<!ELEMENT servlet-name (#PCDATA)>
]>
<servlets>
<servlet-class>com.zking.IndexServlet</servlet-class>
<servlet-name>index</servlet-name>
</servlets>
- config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
config标签:可以包含0~N个action标签
-->
<!-- 外部申明 -->
<!DOCTYPE persons SYSTEM "config.dtd">
<config>
<!--
action标签:可以饱含0~N个forward标签
path:以/开头的字符串,并且值必须唯一 非空
type:字符串,非空
-->
<action path="/regAction" type="test.RegAction">
<!--
forward标签:没有子标签;
name:字符串,同一action标签下的forward标签name值不能相同 ;
path:以/开头的字符串
redirect:只能是false|true,允许空,默认值为false
-->
<forward name="failed" path="/reg.jsp" redirect="false" />
<forward name="success" path="/login.jsp" redirect="true" />
</action>
<action path="/loginAction" type="test.LoginAction">
<forward name="failed" path="/login.jsp" redirect="false" />
<forward name="success" path="/main.jsp" redirect="true" />
</action>
</config>
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT config (action*)>
<!ELEMENT action (forward*)>
<!ATTLIST action
path CDATA #REQUIRED
type CDATA #REQUIRED
>
<!ATTLIST forward
name CDATA #REQUIRED
path CDATA #REQUIRED
redirect (true|false) "false"
>