用DTD约束XML详解及示例
文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。
dtd的三种引入方式
(1)引入外部的dtd文件
<!DOCTYPE 根元素名称 SYSTEM "dtd路径">
(2)使用内部的dtd文件
<!DOCTYPE 根元素名称 [ <!ELEMENT person (name,age)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> ]>
(3)使用外部的dtd文件(网络上的dtd文件)
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">
例如 struts2 框架配置文件 使用 外部的dtd文件
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
使用dtd定义元素
简单元素:没有子元素的元素 <!ELEMENT 元素名 约束> 如:<!ELEMENT name (#PCDATA)>
约束: (#PCDATA): 约束name是字符串类型
EMPTY : 元素为空(没有内容)
ANY:任意类型
复杂元素:有子元素的元素 <!ELEMENT 元素名称 (子元素)> 如:<!ELEMENT person (name+,age?,sex*,school)>
子元素后面的符号表示子元素出现的次数 + :表示一次或者多次
? :表示零次或者一次
* :表示零次或者多次
无 :子元素只能出现一次
子元素直接使用逗号进行隔开 ,表示元素出现的顺序
子元素直接使用|隔开,表示元素只能出现其中的任意一个
使用dtd定义属性
语法: <!ATTLIST 元素名称 属性名称 属性类型 属性的约束>
属性类型:CDATA: 字符串 如:<!ATTLIST birthday ATT CDATA #REQUIRED>
枚举 : 表示只能在一定的范围内出现值,但是只能每次出现其中的一个 。如<!ATTLIST age ATT2 (AA|BB|CC) #REQUIRED>
ID: 值只能是字母或者下划线开头 <!ATTLIST name ATT3 ID #REQUIRED>
属性的约束: #REQUIRED:属性必须存在
#IMPLIED:属性可有可无
#FIXED: 表示一个固定值 <!ATTLIST sex ATT4 CDATA #FIXED "ABC">
直接值:不写属性,使用直接值,写了属性,使用设置那个值 <!ATTLIST school ATT5 CDATA "WWW">
实体的定义
语法: <!ENTITY 实体名称 "实体的值"> 如:<!ENTITY TEST "HAHAHEHE">
使用实体: &实体名称; 比如 &TEST;(注:定义实体需要写在内部dtd里面,如果写在外部的dtd里面,有某些浏览器下,内容得不到)
实例:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE person [ <!ELEMENT person (name+,age?,sex*,school,birthday)> <!ELEMENT name (#PCDATA)> <!ATTLIST name ATT ID #REQUIRED > <!ELEMENT age (#PCDATA)> <!ATTLIST age ATT2 (AA|BB|CC) #REQUIRED > <!ELEMENT sex (#PCDATA)> <!ATTLIST sex ATT4 CDATA #FIXED "ABC" > <!ELEMENT school (#PCDATA)> <!ATTLIST school ATT5 CDATA "WWW"> <!ELEMENT birthday (#PCDATA)> <!ATTLIST birthday ATT1 CDATA #IMPLIED > <!ENTITY TEST "HAHAHEHE"> ]> <person> <name ATT="A1">&TEST;</name> <age ATT2="CC">20</age> <sex ATT4="ABC">111</sex> <school>1111</school> <birthday>2015</birthday> </person>
显示结果: