XML约束
DTD
DTD(Document Type Define),dtd文件中描述并规定了元素、属性和其他内容在xml文档中的使用规则。DTD文件的后缀名为 .dtd
语法
描述元素的语法格式:
<!ELEMENT元素名 (内容模式)>
- EMPTY:元素不能包含子元素和文本(空元素)
- (#PCDATA):可以包含任何字符数据,但是不能在其中包含任何子元素
- ANY:元素内容为任意的,主要是使用在元素内容不确定的情况下
- 修饰符:() | + * ? ,
- () 用来给元素分用组
- | 在列出的元素中选择一个
- +表示该元素最少出现一次,可以出现多次 (1或n次)
- *表示该元素允许出现零次到任意多次(0到n次)
- ?表示该元素可以出现,但只能出现一次 (0到1次)
- ,对象必须按指定的顺序出现
<!ELEMENTstudents (stu*)>
<!ELEMENTstu (id|name|age)*>
说明,
- 根元素students里面可以出现
- stu子元素0到n次stu元素中的属性有id、name、age子元素
- id、name、age子元素出现的顺序没有要求
- id、name、age子元素都可以出现0~n次
描述属性的语法格式:
<!ATTLIST 元素名称
属性名称 属性类型 属性特点
属性名称 属性类型 属性特点
>
属性类型:
- CDATA:属性值可以是任何字符(包括数字和中文)
- ID:属性值必须唯一,属性值必须满足xml命名规则
- IDREF:属性的值指向文档中其它地方声明的ID类型的值。
- IDREFS:同IDREF,但是可以具有由空格分开的多个引用。
- enumerated:(枚举值1|枚举值2|枚举值3...),属性值必须在枚举值中
属性特点:
-
REQUIRED:元素的所有示例都必须有该属性
-
IMPLIED :属性可以不出现
- default-value:属性可以不出现,但是会有默认值
-
FIXED :属性可以不出现,但是如果出现的话必须是指定的属性值
<!ELEMENT students (student+)>
<!ELEMENT student (name,age?,score*)>
<!ATTLIST student id CDATA #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ATTLIST name firstName CDATA #IMPLIED>
<!ELEMENT age (#PCDATA)><!ATTLIST age xuAge CDATA #FIXED "20">
<!ELEMENT score (#PCDATA)>
<!ATTLIST score sel (60|80|100) #REQUIRED>
引入
内部的DTD,DTD和xml文档在同一个文件中。(不常用)
<?xml version="1.0" encoding="UTF-8"?>
<!-- 内部DTD -->
<!DOCTYPE students[
<!ELEMENT students (stu)>
<!ELEMENT stu (id,name,age)>
<!ELEMENT id (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
<students>
<stu>
<id>1</id>
<name>tom</name>
<age>20</age>
</stu>
</students>
外部的DTD,DTD和xml文档不在同一个文件中。(常用)
<?xml version="1.0" encoding="UTF-8"?>
<!-- 外部DTD -->
<!DOCTYPE students SYSTEM "dtd/students.dtd">
<students>
<stu>
<id>1</id>
<name>tom</name>
<age>20</age>
</stu>
</students>
在XML中,引入外部的一个DTD文件的方式,有俩种:
1.本地DTD文件引入,这种方式一般都是自己编写DTD,然后自己使用。
<!DOCTYPE 根元素 SYSTEM "DTD文件的路径">
2.公共DTD文件引入,这种方式可以让很多人使用共同的一个DTD文件。
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">
使用
DTD在使用的时候,分为俩种情况
- 本地DTD
- 公共DTD
本地DTD的引入:
<?xmlversion="1.0" encoding="UTF-8"?>
<!DOCTYPE students SYSTEM "dtd/students.dtd">
注意,只有DTD验证通过了,XML文件才是有效的,Eclipse中就不会报错了。
如果是公共DTD的引入:
这里使用hibernate框架的XML配置文件和DTD文件:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
</hibernate-configuration>
其中,这里的重点是XML文件中的头部声明:
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
说明,
- Eclipse默认会根据第一个双引号中的内容,查找对应的DTD所在位置
- 如果有DTD文件,那么就读取并验证,同时可以根据DTD的内容给出自动提示的信息(Alt+/)
- 如果没有DTD文件,那么就根据第二个双引号中的内容(URL地址),去网络中下载并读取、验证
如果有网的情况下,Eclipse会自动给我们下载xml文档,但是没有网的情况下,需要我们自己手动在Eclipse中进行配置,配置的目的,就是将这个XML,和其对应的DTD文件进行关联,以便让Eclipse可以通过第一个双引号中的内容,找到它关联的DTD文件,然后读取并验证
赋值XML头部声明中第一个双引号中间的内容,这个内容作为key,要去配置的value就是DTD的存放位置:
-//Hibernate/Hibernate Configuration DTD 3.0//EN
然后再Window-》Preferences中,搜索xml,并选择XML Catalog:
image-20200909191152079.png
点击Add按钮,将上面复制的内容粘贴到key的位置,key type选择public ID,然后选择到DTD存放的位置:
image-20200909191251202.png
最后,保存关闭即可。这时候,在XML中,按提示快捷键(alt+/),就可以看到Eclipse给我们提示的内容了,这个内容就是hibernate框架官方要求我们在配置文件中编写的内容!
Schema
Schema文件也可以用来对XML文件内容进行约束、验证,Eclipse也可以根据schema验证进行自动提示
Schema本身单词的含义就是:提要,纲要
Schema和DTD区别
- DTD文件中是DTD的专用语法,Schema文件中就是正常的XML语法,所以Schema文件其实也是个XML文件
- DTD文件的后缀是.dtd,Schema文件的后缀是.xsd,xsd的意思为XML Schema Definition
- DTD文件中的约束条件相对简单,Schema文件中的约束条件更加详细、复杂
- Schema的出现是为了替代DTD文件,但是平时的使用中,俩者都会见到
例如XML文件中的头部声明:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
说明
- xmlns,指定了当前XML中,标签所属的默认命名空间地址
- xmlns:context,指定了当前XML中,context作为前缀开头的标签所属的命名空间地址
- xmlns:xsi,指定了当前XML中,所使用的schema实例的命名空间地址,xsi(XMLSchema-instance)
- xsi:schemaLocation,指定了当前XML中,所使用的schema文件都有哪些,已经分别对应的URL地址
和DTD类似,这里已经有了schema文件具体的URL地址,在联网的情况下,Eclipse也会默认去下载、读取、验证的。但如果由于其他未知原因,下载失败了,我们仍然需要自己在Eclipse中进行手动配置。
Window-》Preferences中,搜索xml,并选择XML Catalog:
先复制该schema文件的URL地址:
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
image-20200909192753096.png
网友评论