引言:
XML的约束:
为什么要使用约束?
比如现在哟啊定义一个Person的文件,只想要这个文件里保存人的信息,比如name age 等,但是如果在XML文件中写了一个标签<猫>,发现这个可以正常显示,因为符合语法规范,但是猫肯定不是人的信息,xml的标签是自定义的,需要技术来规定xml中只能出现的元素,这个时候需要约束。
xml的约束的技术:dtd约束和schema约束
一:dtd的快速入门
准备:创建一个文件 后缀名 .dtd
步骤:
- 看xml中有多少个元素,有几个元素在dtd文件中写几个<!ELEMENT>
- 判断元素是简单元素还是复杂元素
简单元素:没有子元素
<!ELEMENT 元素名称 (#PCDATA)>
复杂元素:有子元素
<!ELEMENT 元素名称 (子元素)> - 需要在xml文件中引入dtd文件
例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person SYSTEM "a.dtd">
<person>
<name>张三</name>
<age>20</age>
</person>
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
but但是浏览器对这个没有约束,在Eclipse中编辑才会有效果
二:dtd的三种引入方式
1.引入外部的dtd文件
<!DOCTYPE 根元素名称 SYSTEM"dtd文件的路径">
2.引入内部的dtd文件(直接在xml中引用)
<!DOCTYPE person [
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
3.使用外部的额dtd文件(网络上的dtd文件)
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的url">
三:使用dtd定义元素
语法: <!ELEMENT 元素名 约束>
- 简单元素: 没有子元素的元素 <!ELEMENT name (#PCDATA)>
(#PCDATA):约束name时字符串类型
EMPTY:元素必须为空(没有内容)
ANY:元素可以为任意值
- 复杂元素:
子元素只能出现一次
表示子元素出现的次数:
+:表示一次或者多次
?:表示零次或者一次
*:表示零次或者多次
- 子元素直接用逗号进行隔开,表示元素出现的次序
-子元素直接用|隔开表示元素只能出现其中的任意一个
<!ELEMENT person (name+|age?|sex*|school)>
四:使用dtd定义属性
-
语法:<!ELEMENT 元素名称 属性名称 属性类型 属性的约束 >
-
属性类型:
-
CDATA:字符串
<!ATTLIST birthday
ID1 CDATA #REQUIRED
>
- 枚举:表示只能在 一定范围内出现值,但是只能每次出现其中的一个
<!ATTLIST age
ID2 (AA|BB|CC) #REQUIRED
>
- ID:值只能是字母或者下划线开头
<!ATTLIST name
ID3 ID #REQUIRED
>
- 属性的约束:
- #REQUIRED:属性必须存在
- #IMPLIED:属性可有可无
- #FIXED :表示一个固定值,属性的值必须是这个固定值
<!ATTLIST school
ID4 CDATA #FIXED "你好"
>
- 直接值:不写属性使用直接值,写了属性,使用设置值
<!ATTLIST sex
ID5 CDATA "女"
>
实体的定义:
<!ENTITY 实体名称 “实体的值”><!ENTITY TEST "你好啊陌生人">
<name ID3="u">&TEST;</name>
定义实体需要写在内部dtd里面,如果写在外部dtd,某些页面会得不到