一:XML约束概述
在XML技术中,可以编写一个文档约束一个XML文档的书写规范,这称之为XML约束。
二:常见的XML约束
- DTD约束:
DTD文件的后缀名为 .dtd
DTD文件有自己独立的语法规范 - Scheam约束
Scheam文件的后缀名是 .xsd
Scheam 文件符合XML语法规范
xml 有良构性和有效性两个特性:
1.良构性:良构的xml文件,表示这个xml文件的内容,完全按照xml语言要求的语法进 行的编写符合语法,符合基本的规范要求,那么就是良构的xml
2.有效性:在良构的基础之上,那么这个xml同时还要满足DTD或者Schame文件的约束,那么这个xml文件就是有效的
注意:良构的xml文件不一定有效,有效的xml文件一定良构
三:如何在xml文件中引入约束
①:外部引入
可以将dtd的约束内容写在外置的dtd文件中,这个文件后缀必须为.dtd,而文件保存时必须用utf-8编码保存,再在xml文件中使用:
①<!DOCTYPE 根元素名称 SYSTEM 文件的位置>
如果写的是SYSTEM表明当前引入的dtd在当前文件系统中,后面制定的文件位置是当前硬盘中的位置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE books SYSTEM "book.dtd">
<books>
<book>
<name>map集合</name>
<price>15</price>
</book>
<book>
<name>set集合</name>
<price>18</price>
<author>阿虎</author>
</book>
</books>
文件:book.dtd
<!ELEMENT books (book+)>
<!ELEMENT nook (name,price,author?)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT author (#PCDATA)>
②<!DOCTYPE 文档根节点 PUBLIC "DTD名称" "DTD文件的URL">
如果写的是PUBLIC表明当前引入的dtd在网络公共位置中,后面要指明dtd的名字和dtd所在网络位置URL地址,如:
<!DOCTYPE web-app PUBLIC
"-//Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.com/dtd/web-app_2.dtd">
②:内部引入
直接在xml中书写dtd约束
<!DOCTYPE 根元素名称[
dtd约束....
]>
-
案例:Student.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE students [
<!ELEMENT students (student*)>
<!ELEMENT student (name,age,concat,br?)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT concat (email|phone)>
<!ELEMENT br EMPTY>
<!ELEMENT email (#PCDATA)>
<!ELEMENT phone (#PCDATA)>
]>
<students>
<student>
<name>小明</name>
<age>17</age>
<concat>
<email>123@qq.com</email>
</concat>
<br/>
</student>
<student>
<name>小黑</name>
<age>17</age>
<concat>
<phone>1438438</phone>
</concat>
</student>
</students>
四:dtd语法解读
(一):元素
<!ELEMENT 元素名称 元素约束>
a、元素约束:
存放类型:ANY/EMPTY (存放任意类型/不能存放任何类型)
b、元素约束:子元素的列表,将可以包含的子元素用小括号括起来
①子元素之间可以使用逗号进行分割,表明子元素必须按照顺序出现 :
- <!ELEMENT student (name,age)>
- <!ELEMENT student (name|age)>
- <!ELEMENT age (#PCDATA)>
④ + : 一次或多次:
- <!ELEMENT students (student+)>
⑤ ? : 0次或一次:
- <!ELEMENT students (student?)>
⑥ * : 0次或多次:
- <!ELEMENT students (student*)>
⑦也可以使用小括号进行组的操作:
- <!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>
(ATTLIST:attribute [ə'trɪbjuːt](属性)list简写)
<!ATTLIST 元素名
属性名1 属性类型 属性约束
属性名2 属性类型 属性约束
.....
>
<!ATTLIST forward
name CDATA #IMPLIED
path CDATA #IMPLIED
redirect (true|false) 'true'
>
1:属性类型
①CDATA:表示属性的值是一个普通字符串
②ENUMERATED : 属性的值是一个枚举列表中的值。属性的类型可以是一组取值的列表,在 XML 文件中设置的属性值只能是这个列表中的某个值(枚举)。
③ID: 表明属性的值必须在整个文档中都是唯一的,如果有重复的id则校验不通过,ID 属性的值只能由字母,下划线开始,数字不能打头,不能出现空白字符
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE config [
<!ELEMENT config (action*)>
<!ELEMENT action (forward*)>
<!ELEMENT forward EMPTY>
<!ATTLIST action
path CDATA #IMPLIED
type CDATA #IMPLIED
>
<!ATTLIST forward
name CDATA #IMPLIED
path CDATA #IMPLIED
redirect (true|false) 'true'
>
]>
<!--
config标签:可以包含0~N个action标签
-->
<config>
<!--
action标签:可以饱含0~N个forward标签
path: 以/开头的字符串,并且值必须唯一非空 ,子控制器对应的路径
type:字符串,非空,子控制器的完整类名
-->
<action path="/registerAction" type="test.action.RegisterAction">
<forward name="success" path="/index.jsp" redirect="true" />
<forward name="failed" path="/register.jsp" redirect="false" />
</action>
<action path="/loginAction" type="test.action.LoginAction">
<forward name="a" path="/index.jsp" redirect="false" />
<forward name="b" path="/welcome.jsp" redirect="true" />
</action>
</config>
①#REQUIRED --- 表明当前属性是一个必须存在的属性,如果这样的属性不存在则在校验时会报错。
②#IMPLIED --- (imply 隐含)表明当前属性是一个可选的属性,可以有也可以没有。
③#FIXED '固定值' --- 表明当前属性具有一个固定值,这样的属性不需要进行赋值,自动就会取这个固定值为值。如果这样的属性指定了一个不是固定值的值则校验报错。
④'默认值' --- 表明当前属性具有一个默认值,如果给了其他的值就用其他值,如果没有给值则取这个默认值。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE students [
<!ELEMENT students (student*)>
<!ELEMENT student (name,age,concat,br?)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT concat (email|phone)>
<!ELEMENT br EMPTY>
<!ELEMENT email (#PCDATA)>
<!ELEMENT phone (#PCDATA)>
]>
<students>
<student>
<name>小明</name>
<age>17</age>
<concat>
<email>123@qq.com</email>
</concat>
<br/>
</student>
<student>
<name>小黑</name>
<age>17</age>
<concat>
<phone>1438438</phone>
</concat>
</student>
</students>
Al