作者:埃菲尔的天空有什么 | 来源:互联网 | 2023-06-14 04:12
前面介绍了XML的作用和基本的格式,今天我给大家分享的是关于XML的约束。废话不多说,我们直接来正题!一、DTD简介1.1、DTD概述DTD(DocumentTypeDefinition,文档
前面介绍了XML的作用和基本的格式,今天我给大家分享的是关于XML的约束。废话不多说,我们直接来正题!
一、DTD简介
1.1、DTD概述
DTD(Document Type Definition,文档类型定义)
1)DTD是一套关于标记符的语法规则。它是XML1.0版规格的一部分,是XML文件的验证机制,属于XML文件组成的一部分。
2)XML文件提供应用程序一个数据交换的格式,DTD正是让XML文件能够成为数据交换的标准,因为不同的公司只需定义好标准的DTD,
各公司都能够依照DTD建立XML文件,并且进行验证,如此就可以轻易的建立标准和交换数据,这样满足了网络共享和数据交互。
4)DTD中的所有约束都是针对 与某个标签的子标签进行约束的
注意:除了DTD约束,其实还有其他的约束。Schema(模式)约束:用xml写的文件,然后用来约束xml文件
1.2、DTD的目的
验证XML文档是不是一个有效的XML文档。
有效:如果一个良构的XML文档满足了dtd的声明,就是一个有效的XML文档。
有效一定良构,良构不一定有效。
1.3、XML文档引入DTD的方式
1)引入内部DTD
DOCTYPE 根元素[
DTD验证规则
/
实体定义...
]>
2)引入外部DTD
当引用的文件在本地时:
当引用文件是一个公共文件(DTD文件存在于远程服务器上)时:
1.4、DTD约束原理
注:通过DTD约束,XML就能在DTD的约束下进行自定义了,不过DTD有个缺点,那就是不能对数据进行数值约束这种范围约束。
二、DTD的分类
2.1、内部DTD
DTD代码与XML代码在同一个文件中
例如:带有DTD的XML文档实例
"
1.0"?>
DOCTYPE note [
from,heading,body)>
from (#PCDATA)>
]>
Tove
<from>Janifrom>
Reminder
Don't forget me this weekend
View Code
分析:
!DOCTYPE note (第二行)定义此文档是 note 类型的文档。
!ELEMENT note (第三行)定义 note 元素有四个元素:"to、from、heading,、body"
!ELEMENT to (第四行)定义 to 元素为 "#PCDATA" 类型
!ELEMENT from (第五行)定义 frome 元素为 "#PCDATA" 类型
!ELEMENT heading (第六行)定义 heading 元素为 "#PCDATA" 类型
!ELEMENT body (第七行)定义 body 元素为 "#PCDATA" 类型
2.2、外部DTD
DTD约束与xml文档不在同一个文件中,XML文档需引入外部DTD文件
例如:外部DTD实例,需要将DTD文件引入到XML文件中
"
1.0"?>
"note.dtd">
Tove
<from>Janifrom>
Reminder
Don't forget me this weekend!
View Code
note.dtd文件的内容
from
,heading,body)>
from (#PCDATA)>
View Code
2.3、混合DTD
既有外部DTD,又有内部DTD
三、DTD在元素中的声明
3.1、元素约束
格式: 同一元素不允许出现两次声明
1)内容模式:可以对元素内容进行约束也可以对元素中的子元素进行约束,大小写敏感,内容模式的括号有意义
1.1)(#PCDATA) :元素内容为任何字符或者空,但不允许有子元素, 不可省略()
1.2)EMPTY :元素内容为空,不允许有任何文本数据(包括空格换行)与子元素,可以有属性,不可加()
1.3)ANY :元素可以包含任何数据,包括文本数据和子元素,不可加()
View Code
1.4)(childElements) 由内容模式部件指定:“, | ? + *”
对内部子元素进行约束,均不能添加其他子元素以及文本(可以空格换行)
“,”:表示指定子元素必须顺序出现,不多不少
例如:
解读:
“|”:表示在指定的多个子元素中选择出现1个,只能1次
例如:
解读:
“ ”:元素必须且只能出现一次
例如:
解读:
“?”:指定元素要出现0次或1次
例如:
解读:
“+”:指定元素要出现1次或多次
例如:
解读:
“*”:指定元素要出现0次或多次
例如:
解读:
2)混合模式(Mixed)
元素中既可有文本数据又可有子元素
表示元素中即可以有字符又可以有指定元素,字符数据与指定元素可以出现任意次数,顺序不限。
注意:优先写#PCDATA,如(#PCDATA|a)*正确,(a|#PCDATA)*错误。
浏览器是非验证解析器,不会校验xml文档的有效性。
3.2、属性约束
1)语法:
ATTLIST 元素名 属性名 属性类型 属性默认值
属性名 属性类型 属性默认值
......
>
2)属性类型
ID 属性值唯一,且属性值必须符合命名规则——不能以数字开头
(v1|v2|v3)枚举,属性值从中选择一个
CDATA属性值为字符
3)属性默认值
#REQUIRED 属性必须出现,属性值没有限制
#IMPLIED属性值可以出现可以不出现
attribute_vlaue属性类型后跟属性值,表示属性如果不出现,则属性值为默认的attribute_value
#FIXED value #FIXED value表示属性可出现可不出现,显示出现则属性值必须为指定的value,不出现,则值默认value
注:ID属性类型只能使用#REQUIRED或#IMPLIED;枚举类型后跟默认值必须为匹配值之一
四、DTD文档的实例
4.1、内嵌
DOCTYPE 根元素[
"实体内容">
属性特点
属性名 属性类型 属性默认值/
属性特点
...
>
]>
View Code
4.2、外部引用
"
dtd文件路径">
"dtd文件的描述信息" "dtd的url">
View Code
4.3、内嵌与外部引用同时使用
"
dtd文件路径" [
"实体内容">
ATTLIST 元素名 属性名 属性类型 属性默认值
属性名 属性类型 属性默认值
...
>
]>
View Code
一个实例:班级约束
XMLClass.dtd
"
男|女">
ATTLIST 班级
班次 CDATA "1班"
编号 ID #REQUIRED
>
ATTLIST 学生
地址 CDATA #IMPLIED
授课方式 CDATA #FIXED
"面授"
学号 ID #REQUIRED
班级编号 IDREF #REQUIRED
朋友 IDREFS #IMPLIED
性别 (%
sex;) #REQUIRED
>
XMLClass.dtd
XMLtest.xml
"
1.0" encoding="UTF-8"?>
"XMLClass.dtd"
["
Switch">]>
<班级 编号=
"C1" 班次=
"1班">
<学生 地址=
"湖南" 授课方式=
"面授" 学号=
"n1" 班级编号=
"C1" 朋友=
"n2" 性别=
"男">
<名字>张三名字>
<年龄>
20年龄>
<介绍>不错介绍>
学生>
<学生 授课方式=
"面授" 学号=
"n2" 班级编号=
"C1" 朋友=
"n1 n3" 性别=
"女">
<名字>李四名字>
<年龄>
18年龄>
<介绍>很好介绍>
学生>
<学生 授课方式=
"面授" 学号=
"n3" 班级编号=
"C1" 朋友=
"n2" 性别=
"男">
<名字>王五名字>
<年龄>
22年龄>
<介绍>非常好介绍>
学生>
<作者>&writer;作者>
班级>
View Code
觉得不错的点个推荐“”哦!