xml——02(dtd约束)

打卡自己的第三篇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+/"

出现dtd约束

dtd文件

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里面,有某些浏览器下,内容得不到.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值