打卡自己的第三篇JavaWeb基础博客
这些代码是看网上的视频自学敲出来的(如有雷同,不是巧合)
Day05——12~18
1、xml的约束简介
为什么需要约束?
比如现在定义一个person的xml文件,只想要这个文件里面保存人的信息,比如name age等,但是如果在xml文件中
写了一个标签<猫>,发现可以正常显示,因为符合语法规范。但是猫肯定不是人的信息,xml的标签是自定义的,需要技术来
规定xml中只能出现的元素,这个时候需要约束。
<?xml version="1.0" encoding="UTF-8"?>
<person>
<name>张三</name>
<age>20</age>
<猫>100000</猫>
</person>
xml的约束的技术 : dtd约束 和 schema约束
2、dtd约束
创建一个文件 后缀名 .dtd
步骤:
1、看xml中有多少个元素 ,有几个元素,在dtd文件中写几个<!ELEMENT>
2、判断元素是简单元素还是复杂元素
- 复杂元素:有子元素的元素
<!ELEMENT 元素名称 (子元素)>
- 简单元素:没有子元素
<!ELEMENT 元素名称 (#PCDATA)>
3、需要在xml文件中引入dtd文件<!DOCTYPE 根元素名称 SYSTEM "dtd文件的路径">
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person SYSTEM "01.dtd">
<person>
<name>张三</name>
<age>20</age>
</person>
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
- 打开xml文件使用浏览器打开的,浏览器只负责校验xml的语法,不负责校验约束(在xml文件加入
<a></a>
也可以,没有约束)- 如果想要校验xml的约束,需要使用工具(eclipse工具)
加入注释的快捷键"ctrl+shift+/"
3、dtd的三种引入方式
-
引入外部的dtd文件
<!DOCTYPE 根元素名称 SYSTEM "dtd路径">
-
使用内部的dtd文件
<!DOCTYPE 根元素名称 [
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
<?xml version="1.0" encoding="UTF-8"?>
<!-- <!DOCTYPE person SYSTEM "1.dtd"> -->
<!DOCTYPE person[
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
<person> //报错
<name>张三</name>
<age>20</age>
<a>111</a>
</person>
- 使用外部的dtd文件(网络上的dtd文件)
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">
- 后面学到框架 struts2 使用配置文件 使用 外部的dtd文件
eg: <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
4、使用dtd定义元素
语法: <!ELEMENT 元素名 约束>
1、 简单元素:没有子元素的元素
<!ELEMENT name (#PCDATA)>
(#PCDATA): 约束name是字符串类型
EMPTY : 元素为空(没有内容)
ANY:任意
<?xml version="1.0" encoding="UTF-8"?>
<!-- <!DOCTYPE person SYSTEM "1.dtd"> -->
<!DOCTYPE person[
<!ELEMENT person (name,age,sex,school)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex EMPTY>
<!ELEMENT school ANY>
]>
<person>
<name>张三</name>
<age>20</age>
<!-- <a>111</a> -->
<sex></sex>
<school>xuydcg</school>
</person>
2、复杂元素:
<!ELEMENT person (name,age,sex,school)>
这样子写子元素只能出现一次
<!ELEMENT 元素名称 (子元素)>
想让子元素可以出现多次
表示子元素出现的次数
+ : 表示一次或者多次
? :表示零次或者一次
* :表示零次或者多次
子元素直接使用逗号进行隔开 ,
表示元素出现的顺序
子元素直接使用 | 隔开
表示元素只能出现其中的任意一个
eg:<!ELEMENT person (name+,age,sex*|school)>
5、使用dtd定义属性
语法格式:
<!ATTLIST 元素名称
属性名称 属性类型 属性的约束
>
1、 属性类型
(1) CDATA: 字符串
<!ATTLIST birthday
ID1 CDATA #REQUIRED//约束:必须出现
>
eg:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person[
<!ELEMENT person (birthday)>
<!ELEMENT birthday (#PCDATA)>
<!ATTLIST birthday
ID1 CDATA #REQUIRED
>
]>
<person>
<birthday ID1="AAA">2017-05-18</birthday>
</person>
(2)枚举 : 表示只能在一定的范围内出现值,但是只能每次出现其中的一个
<!ATTLIST age
ID2 (AA|BB|CC) #REQUIRED
>
eg:红绿灯效果(aa|bb|cc)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person[
<!ELEMENT person (age)>
<!ELEMENT age (#PCDATA)>
<!ATTLIST age
ID2 (aa|bb|cc) #REQUIRED
>
]>
<person>
<age ID2="aa">20</age>
</person>
(3) ID: 值只能是字母或者下划线开头
<!ATTLIST name
ID3 ID #REQUIRED
>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person[
<!ELEMENT person (name+)>
<!ELEMENT name (#PCDATA)>
<!ATTLIST name
ID3 ID #REQUIRED
>
]>
<person>
<name ID3="A1">张三</name>
<name ID3="_4">lisi</name>
</person>
2、属性的约束
1、 #REQUIRED:属性必须存在
2、 #IMPLIED:属性可有可无
3、#FIXED: 表示一个固定值 #FIXED “AAA”
*属性的值必须是设置的这个固定值
<!ATTLIST sex
ID4 CDATA #FIXED "ABC"
>
4、 直接值
*不写属性,使用直接值 ,即"WWW"
* 写了属性,使用设置那个值 ,"WWW"变成设置的那个值
<!ATTLIST school
ID5 CDATA "WWW"
>
6、定义实体
语法: <!ENTITY 实体名称 "实体的值">
<?xml version="1.0" encoding="UTF-8"?>
<!-- <!DOCTYPE person SYSTEM "1.dtd"> -->
<!DOCTYPE person[
<!ELEMENT person (name+)>
<!ELEMENT name (#PCDATA)>
<!ATTLIST name
ID3 ID #REQUIRED
>
<!ENTITY TEST "haha">//想在name里面显示实体名称
]>
<person>
<name ID3="A1">张三&TEST;</name>
</person>
注意:
定义实体需要写在内部dtd里面,如果写在外部的dtd里面,有某些浏览器下,内容得不到.