XML约束之DTD
一、概念:类是对象的约束,DTD是对XML文件的约束
二、编写DTD约束的两种方式:
一】将DTD和XML文件分离
1>引用本地文件时:SYSTEM---个人或组织,小范围内使用
格式:<!DOCTYPE 文档根节点 SYSTEM "DTD文件的URL">
code: <!DOCTYPE root SYSTEM "class.dtd">
2>引用公共文件时:PUBLIC----大范围内使用,例如:structs框架
格式:<!DOCTYPE 文档根节点 PUBLIC "DTD名称" "DTD文件的URL">
eg:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
二】XML中嵌入DTD
格式:<!DOCTYPE 文档根节点 [dtd文档内容]>
eg:
<!DOCTYPE root[ <!ELEMENT root (student+)> <!ELEMENT student (name, age)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> ]>
三、DTD语法
一】声明XML的元素
1>格式:<!ELEMENT 元素名称 (元素类型或者元素类型)>
EMPTY:用于定义单个标签元素,例如<br/> <hr/>
eg:
<!ELEMENT alias EMPTY>
||
<alias />
ANY:用于表示元素内容为任意类型。【建议少用】
2>语法细节:!!!
a.在DTD中,必须要将所有的标签全部都声明完
b.内容用“,”分隔,要求XML中的元素顺序必须与此内容相同
c.内容中的“|”,代表XML文件内容可以是其中之一
d.约束对应内容出现的次数:
+:一次或多次
?:0次或1次
*:0次或多次
没有符号标识:有且只能出现一次。
e.也可使用圆括号( )批量设置,例:
<!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>
3>code:
<!DOCTYPE root[ <!ELEMENT root (student+)> <!ELEMENT student (name, age)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> ]> <root> <student> <name>张三</name> <age>30</age> </student> <student> <name>李四</name> <age>31</age> </student> </root>
二】声明XML的属性
1>格式:
<!ATTLIST 元素名
属性名1 属性值类型 设置说明
属性名2 属性值类型 设置说明
属性名3 属性值类型 设置说明
...
>
2>常用的属性值类型
a)CDATA:规定属性值类型为普通文本字符串
<!ATTLIST 商品
类别 CDATA #REQUIRED
>
b)ENUMERATED:是一组取值的列表,在 XML 文件中设置的属性值只能是这个列表中的某个值
eg:
<!ATTLIST 肉
品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉"
>
c)ID:只能以字母和下划线开头
eg:
<!ATTLIST 联系人
编号 ID #REQUIRED
>
d)ENTITY:实体类型:为一段内容创建一个别名
3>属性值设置说明的四种情况
a.#REQURIED:该属性必须出现
b.#IMPLIED:该属性可有可无
c.#FIEXD "固定值":该属性可有可无,但当有该属性的时候,属性值是一个不可改变的固定值,在XML中需要为添加这个属性, 并设为此固定值。
d.直接使用默认值:该属性值一个可变的默认值,在XML中可以设置去改变此属性,也可以不设置此属性,自动使用此默认值。
code:
!DOCTYPE root[ <!ELEMENT root (桌子+)> <!ELEMENT 桌子 EMPTY> <!ATTLIST 桌子 id ID #REQUIRED width CDATA #REQUIRED height (50|60|70) "60" make CDATA #IMPLIED color CDATA #FIXED "白色" weight CDATA "20" > ]> <root> <桌子 id="t2011100901" width="60" height="70" color="白色" /> </root> <!-- 结果: 桌子 id="t2011100901" width="60" height="70" color="白色" weight="20" /> -->
三】实体的定义
1>引用实体【需要内嵌才有效】
---当web页面出现多个相同的字符串时,在XML中引用
a.格式
定义: <!ENTITY 实体名称 "实体内容">
引用: &实体名称;
eg:
<!DOCTYPE root[ <!ELEMENT root (电视台+)> <!ELEMENT 电视台 (#PCDATA)> <!ENTITY CCTV "中国中央电视台"> ]> <root> <电视台> &CCTV; </电视台> <电视台> &CCTV; </电视台> </root>
2>参数实体【注意:此时需要将DTD与XML文件分开才有效】
---当web页面出现多个相同子元素的时,在DTD中引用
a.格式:
定义: <!ENTITY % 实体名称 "实体内容">
引用: %实体名称;
eg:
<!ENTITY % TIP "姓名"> <!ELEMENT root (客户,员工)> <!ELEMENT 客户 (%TIP;)> <!ELEMENT 员工 (%TIP;)> <!ELEMENT %TIP; (#PCDATA)>
四、总结:【重点】
1》浏览器会对XML和DTD进行语法的检测,但浏览器不会检测XML是否符合DTD规则。
2》正确的XML文件和有效的XML文件
正确的XML文件:语法正确的文件
有效的XML文件:语法和约束都正确的文件
3》检测是否有效需要利用:validate.html的中JS脚本。【工具里面】