一、XML约束
1.作用:
约束xml文档的写法;对xml进行校验。
2.分类
1)DTD
1.注意:
默认DTD约束在浏览器中是关闭的,可以另外写一个html执行JavaScript脚本开启约束验证。
2.DTD语法:
1)如何在xml中引入DTD
1.外部引入:
可以将DTD的约束内容写在外置DTD文件中,这个文件的后缀必须为.dtd而文件保存必须用utf-8编码保存,再在xml文件中使用。
<!DOCTYPE 根元素名称 SYSTEM 文件的位置>
如果写的是SYSTEM表明当前引入DTD在当前文件系统中,后面指定的文件位置是当前硬盘中的位置。
<!DOCTYPE 文档根结点 PUBLIC "DTD名称" "DTD文件的URL">
如果写的是PUBLIC表明当前引入DTD在当前网络公共位置中,后面要指明DTD的名字和DTD所在网络位置URL地址。
2.内部引入:
直接在xml中书写DTD
<!DOCTYPE 根元素名称 [
dtd约束.....
]>
2)DTD语法 --了解
1.元素
<!ELEMENT 元素名称 元素约束>
1)元素约束:
1.存放类型:ANY/EMPTY
2.元素:子元素的列表,将可以包含的子元素用小括号括起来。
3.子元素之间可以使用逗号进行分割,表明子元素必须按照顺序出现。
4.子元素之间可以使用竖线进行分割,表明子元素只能出现其中之一。
#PCDATA 表明包含标签体
+ 表示一次或多次
* 0次或多次
? 0次或1次
可以使用小括号表示组的操作。
2.属性
<!ATTLIST 元素名
属性名1 属性类型 属性约束
属性名2 属性类型 属性约束
.......
>
1)属性类型:
CDATA:表示属性的值是一个普通字符串
ENUMERATED:属性的值是一个枚举列表中的值
ID:表明属性的值必须在整个文档中都是唯一的,如有重复的ID则校验不通过 ,ID属性的值只能由字母,下划线开始,不能使用数字开始,不能出现空白字符
2)属性约束:
#REQUIRED --表明当前属性是一个必须存在属性,如果这样的属性不存在则校验时会报错。
#IMPLIED --表明当前属性是一个可选的属性,可以有也可以没有。
#FIXED '固定值' --表明当前属性有一个固定值,这样的属性不需要进行赋值,自动就会取这个固定值为值,如果这样的属性指定了一个不是固定值的值,则校验报错。
'默认值' --表明当前属性具有一个默认值,如果给了其他的值就用其他值,如果没有给值则取这个默认值。
3.ENTITY(实体)
<!ENTITY > 就是对于一大段内容的引用,可以简化代码的复用
1)引用实体:在xml中引用的实体叫做引用实体
<!ENTITY 实体名称 "实体内容">
&实体名称;
2)参数实体:在DTD中引用的实体叫做参数实体
<!ENTITY % 实体名称 "实体内容">
&实体名称;
二、XML编程:利用java程序去增删改查(CRUD)xml中的数据
1.dom解析:
过程:形成一颗树,利用Node接口进行操作,树中对象都实现过Node接口
优点:
1)十分便于进行增删改查的操作
2)只需解析一次拿到dom对象后可以重复使用此对象,减少解析的次数
缺点:
1)首次解析过程比较慢,需要将整个文档都解析完成后才能进行操作
2)需要将整个树的内容都加载到内存中来,比较耗费内存,当文档过大时,这种解析方式对内存的损耗非常的严重
2.sax解析:
过程:解析器逐级解析文档,遇到元素触发事件处理器中的函数
优点:
1)不需要等待整个xml加载到内存,当解析到某一部分时自动触发到对应的方法去做处理,处理的效率比较高
2)不需要将整个文档加载到内存中,对内存的损耗比较少,无论多大的xml项目理论上都可以计算
缺点:
1)每次解析都只能处理一次,下次再想处理还要重新解析
2)只能进行查询不能进行增删改的操作
3.解析思想:
dom解析
sax解析
基于这两种解析思想市面上就有了很多的解析api:
sun jaxp 既有dom方式也有sax方式,并且这套解析api已经加入到j2se的规范中,意味着不需要导入任何第三方开发包就可以直接使用这种解析方式,但是这种解析方式效率低下。
dom4j 可以使用dom方式高效的解析xml
4.dom4j
导入开发包,一般只需要核心包,若需其它则再导入
流程:
标签:xml,约束,解析,假期,Day02,元素,DTD,大二,属性 From: https://www.cnblogs.com/sodamate/p/17034632.html