XML 文档仅是格式良好还不够,其中的内容还必须满足某些条件的约束限制。在这些条件下,需要定义一套规则来对 XML 文档中的内容作出限制,这套定义的规则就是 XML 文档
的约束模式。
约束模式定义了 XML 文档中允许出现的元素名,元素中的属性,内容的类型,以及元素之间的嵌套关系和出现顺序
1 XML 的约束模式语言
1)XML DTD 2)XML Schema 满足正确的语法并不代表XML是有效的,只能说是正确的。如果使XML有效必须依赖于DTD或是Schema
1.1 XML DTD(Document Type Definition)
a)用来描述文档的结构:
1) 元素(ELEMENT)的定义规则
2)元素与元素之间的关系
3)属性(ATTLIST)的定义规则
4)可使用的实体(ENTITY)或是可使用的符号(NOTATION)规则
b)XML与DTD之间的关系:
1)类与对象之间的关系
2)数据库表与数据记录的关系
3)有了DTD每个XML文件可以有属于自己的格式
4)有了DTD不同的XML文件可以使用同一种格式
5)有了DTD可以校验一个外部的XML文件是否符合格式
c)DTD文档的声明与引用
1) 内部DTD
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE book [ <!ELEMENT book (author,content)> <!ELEMENT author (#PCDATA)> <!ELEMENT content (#PCDATA)> ]> <book> <author>ivan</author> <content>hello everyone</content> </book>
2) 外部DTD(推荐这种)
<!ELEMENT book (author,content)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT content (#PCDATA)>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE book SYSTEM "dtd_1.dtd"> <book> <author>ivan</author> <content>hello everyone</content> </book>
3)内部外部DTD
d)元素的语法:
<!ELEMENT name type>Type可选项:
1) EMPTY 该元素不能包含子元素和文本,但可以有属性(空元素)
2) ANY 该元素可以包含任何在DTD中定义的元素内容(非常少用没啥实际意义)
3) #PCDATA parsed character data可解析的字符数据(使用最多)
4)纯元素类型 只包含子元素并且这些元素外没有文本(使用最多)
5)混合类型 包含子元素和文本的混合体(很少用)
例:
<!ELEMENT person EMPTY>
<person id=”1”/> 正确的
<person>ivan</person> 错误的
<!ELEMENT person ANY>
<person><user>ivan</user></person> 正确
<person>ivan</person> 正确
c)修饰符号:
1) () 用来给元素分组
2) | 在列出的对象中选择一个
3) + 该对象至少出现一次,可以出现多次(即1次或是多次)
4) * 该对象允许出现零次,也可以出现多次(即0次或是多次)
5) ? 该对象可以出现,但只能出现一次(即0次或是1次)
6) , 该对象必须按指定顺序出现
<!ELEMENT book ((id|author),content)>
注:给book里的元素进行分成两组,第一组id和author只能选择一下
<!ELEMENT book ((id+|author),content)>
Id可以出现1次或是多次
<!ELEMENT book ((id*|author),content)>
Id可以不出现,也可以出次1次
<!ELEMENT book ((id?|author),content)>
Id可以不出现,出现只能出现1次地
e)属性的语法
<!ATTLIST 元素名称 属性名称 属性类型 属性特征>
例:
<!ELEMENT title (#PCDATA)>
<!ATTLIST title name CDATA #required>
定义title元素的属性name为必须填写,值为任意字符串
属性类型:
1)CDATA character data字符数据(常用)
2)ID 表示该属性的取值必须是唯一的(常用)<!ATTLIST title id ID #required>
3)IDREF 属性的值指向文档中其它地方声明的值
<!ATTLIST title id ID #required>
<!ATTLIST title id1 IDREF #required>
<title id="dd" id1="dd">dd</title>
4) IDREFS 同IDREF。区别在于可以用空格分隔来引用多个。
5) NMTOKEN 是CDATA的一个子集。表示属性必须是英文字母、数字、句号、破折号、下划线、冒号、属性值不能有空格
6) NMTOKENS 属性值可以有空格
7) ENUMERATED
2)#IMPLIED 可以有
3)#FIXED 属性的值必须是指定的固定值
<!ATTLIST users company CDATA #FIXED "IBM">
<users company=”IBM”/>这里的值只能是IBM
4)为属性提供一个默认值
<!ATTLIST users company CDATA "IBM">
<!ATTLIST users sex (M|F) #required>
f)实体的语法
1)普通实体:
a)内部实体<!ENTITY 实体名 “值”> 单一的值
b)外部实体<!ENTITY 实体名 SYSTEM “值”> 文件里的值
<!ENTITY writer "ivan"> <content>&writer;</content>2)参数实体:
<!ENTITY % address "country,city"> <!ELEMENT book (author,content,%address;)> <!ELEMENT author (#PCDATA)> <!ELEMENT content (#PCDATA)> <!ELEMENT country (#PCDATA)> <!ELEMENT city (#PCDATA)> <book> <author>ivan</author> <content>hello everyone</content> <country>china</country> <city>beijing</city> </book>DTD 的局限性
1)DTD不遵守XML语法(写XML文档实例时候用一种语法,写DTD的时候用另外一种语法)
2)DTD数据类型有限(与数据库数据类型不一致)
3) DTD不可扩展
4) DTD不支持命名空间(命名冲突)