xml的约束
为什么需要约束?比如现在定义一个person的xml文件,只想要这个文件里面保存人的信息,比如name,age等,但是如果在xml文件中写了一个标签<猫>,发现可以正常显示,因为符合语法规范,但是猫肯定不是人的信息,xml的标签是自定义的,需要技术来规定xml中只能出现的元素,这个时候需要约束。
Xml的约束的技术:dtd的约束 和 schema约束
dtd的快速入门
- 创建一个文件,后缀名为 .dtd
步骤:
1) 看xml中有多少个元素,有几个元素,在dtd文件中写几个<!ELEMENT
>,判断元素是简单元素还是复杂元素。
复杂元素:有子元素的元素
<!ELEMENT 元素名称(子元素)>
简单元素,没有子元素
<!ELEMENT 元素名称(#PCDATA)>
2) 需要在xml文件中引入dtd文件
<!DOCTYPE 根元素名称 SYSTEM “dtd文件的路径”>
3) 打开xml文件使用浏览器打开的,浏览器只负责校验xml的语法,不负责检查约束。
如果想要校验xml的约束,需要使用工具(myeclipse工具)
打开myeclipse工具,创建一个项目day5,在day5的src目录下面创建一个xml文件和一个dtd文件,当xml中引入dtd文件之后,比如只能出现name age,多写了一个a,会提示报错。
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文件。
使用dtd定义元素
语法:<!ELEMENT 元素名称 约束
>
- 简单元素:没有子元素的元素
1) <!ELEMENT age (#PCDATA)
>
2) #PCDATA:约束name是字符串类型
3) EMPTY:元素为空(没有内容)
4) ANY:任意
- 复杂元素:
1) <!ELEMENT person (name,age)
>子元素只能出现一次
2) 表示子元素出现的次数:
+:表示一次或者多次
?:表示零次或者一次
*:表示零次或者多次
3) 子元素直接使用逗号进行隔开,表示元素出现的顺序。
4) 子元素直接使用|隔开 表示元素只能出现其中的任意一个。
使用dtd定义属性
<!ATTLIST 元素名称 属性类型 属性的约束>
属性类型:
- -CDATA:字符串
<!ATTLIST birthday ID1 CDATA #REQUIRED
>
- 枚举:
表示只能在一定的范围内出现值,但是只能每次出现其中的一个
红绿灯效果(aa|bb|cc)
<!AATLIST age ID2 (AA|BB|CC) #REQUIRED
>
- ID:
ID值只能是字母或者下划线开头
<!AALIST name ID3 ID #REQUIRED
>
属性的约束:
- REQUIRED :属性必须存在
- IMPLTED:属性可有可无
- FIXED:表示一个固定值
- 直接值:不写属性,直接使用直接值,写了属性,直接使用设置的值
定义属性实例:
<!ATTLIST 页面作者
姓名 CDATA #IMPLIED
年龄 CDATA #IMPLIED
联系信息 CDATA #REQUIED
网站职务 CDATA #FIXED “页面作者”
个人爱好 CDATA “上网”
>
实体的定义:
<!ENTITY TEST "HAHAHAHAH"
>
引用方式:&TEST;
代码实例:
<?xml version="1.0" encoding="UTF-8"?>
<!--直接引入dtd方式-->
<!DOCTYPE person [
<!ELEMENT person (name+,age?,sex*,school,birth)>
<!ELEMENT name (#PCDATA)>
<!ATTLIST name
ID1 CDATA #REQUIRED
>
<!ELEMENT age (#PCDATA)>
<!ATTLIST age
ID2 (18|19|20) #IMPLIED
>
<!ELEMENT sex EMPTY>
<!ATTLIST sex
ID3 ID #FIXED "nan"
>
<!ELEMENT school ANY>
<!ATTLIST school
ID3 ID "mmm"
>
<!ELEMENT birth (#PCDATA)>
<!ENTITY TEST "HAHAHAHAH">
]>
<person>
<name ID1="aaa">&TEST;</name>
<age ID2="18">18</age>
<sex ID3="nan"></sex>
<school>ddd</school>
<birth>2000</birth>
</person>
“`