XML的约束
约束技术:dtd约束, schema约束
dtd约束技术
创建一个文件,后缀.dtd
步骤:
1.看xml中有多少个元素,就在dtd文件中写几个<!ELEMENT>
2.判断元素是简单元素(没有子元素)还是复杂元素(有子元素)
简单元素:<!ELEMENT 元素名称 (#PCDATE)>
复杂元素:<!ELEMENT 元素名称 (子元素,子元素)>
3.在xml中引入dtd文件
<!DOCTYPE 根元素名称 SYSTEM "dtd文件路径">
浏览器只校验语法,不校验约束,因此需要用工具(如eclipse等)
三种dtd引入方式
1.引入外部的dtd
<!DOCTYPE 根元素名称 SYSTEM "dtd文件路径">
2.引入内部的dtd
<!DOCTYPE 根元素名称 [dtd内容]>
3.使用外部(网络上)的dtd文件
<!DOCTYPE 根元素名称 PUBLIC "dtd名称" "dtd文档的url">
使用dtd定义元素
语法:<!ELEMENT 元素名 约束>
简单元素:<!ELEMENT name (#PCDATA)>
(#PCDATA):约束name是字符串类型
EMPTY:元素为空
ANY:任意
复杂元素:<!ELEMENT person(name+,sex?,age*)>
子元素只能出现一次
+:表示一次或者多次
?:表示出现0次或者1次
*:表示出现0次或者多次
用逗号,子元素顺序必须相同。用竖线隔开,子元素只能出现其中任意一个。
使用dtd定义属性
语法:
!ATTLIST 元素名称
属性名称 属性类型 属性的约束
>
类型:
CDATA:字符串
枚举:表示只能在一定的范围内出现值,但是每次只能出现一个(aa|bb|cc)
ID:值只能是字母或者下划线开头
约束:
#REQUIRED:属性必须要存在
#IMPLIED:属性可有可无
#FIXED:表示一个固定值 #FIXED "a"
直接值:不写属性,直接使用直接值,写了属性,使用设置的值
使用dtd定义实体
<!ENTITY 实体名称 "实体的值">
使用实体: &实体名称;
定义实体需要卸载内部dtd里面,如果写在外部的dtd,某些浏览器取不到内容。
schema约束技术
符合xml的语法,xml语句
dtd与schema比较
一个xml中只能有一个dtd,但是可以有多个schema,多个schema使用名称空间区分(类似于Java包名)
dtd里面有PCDATA类型,但是在schema里面可以支持更多的数据类型
schema语法更加复杂,因此不能替代dtd
schema文件
创建一个schema文件,后缀.xsd
根节点是<schema>
在一个schema文件中,有属性:
xmlns=“http://www.w3.org/2001/XMLSchema”,表示当前xml文件是一个约束文件;
targetNamespace=“http://www/itcast.cn/0219”:使用schema约束文件,直接通过这个地址引入约束文件;
elementFormDefault=“qualified”
步骤:
1.看xml中有多少个元素
2.看简单元素和复杂元素
如果复杂元素
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www/itcast.cn/0219"
elementFormDefault="qualified">
<element name="person">
<complexType>
<sequence>
子元素
</sequence>
</complexType>
</element>
3.简单元素写在复杂元素的sequence中
<element name="person">
<complexType>
<sequence>
<element name="name" type="string"></element>
<element name="age" type="int"></element>
</sequence>
</complexType>
</element>
4.在被约束文件里面引入约束文件
在根元素上
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www/itcast.cn/0219"
xsi:schemaLocation="http://www/itcast.cn/0219 1.xsd">
<name>zhang</name>
<age>13</age>
</person>
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"表示xml是一个被约束文件
xmlns="http://www/itcast.cn/0219"是约束文档里面targetNamespace
xsi:schemaLocation="http://www/itcast.cn/0219 1.xsd"是targetNamespace 空格 约束文档地址
sequence:表示元素的出现的顺序
all:表示属性只能出现一次
choice:表示只能出现其中的一个
maxOccurs="unbounded"表示元素的出现的次数
<any></any>
表示任意元素
可以约束属性,写在复杂元素里面</complexType>
之前<attribute name="id1" type="int" use="required"></attribute>
,name属性名称,type属性类型int\string,use属性是否必须出现
复杂的schema约束
引入多个schema文件,可以给每个schema起一个别名
<company xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dept="http://www.example.org/department"
xmlns="http://www.example.org/company"
xsi:schemaLocation="http://www.example.org/company company.xsd http://www.example.org/department department.xsd">
<employee>
<dept:name>a</dept:name>
<name>zhang</name>
</employee>
</company>