由于在现代开发过程中,不需要开发人员手动解析XML文档,因此本次课程的主要目的是了解xml文档以及,xml约束文档的内容
XML编程语言
- 可扩展编程语言
- 两个特点:
- 在编写命令上,以标签为单位
- 实现就固定好的指令
- 历史:诞生于1996年,在2004年进行一次更新。语法版本号升级1.1,现在用的是1.0
- xml文档的作用:最初xml文档是作为【网页】来使用的,后来被所有浏览器厂商抛弃,就因为可扩展的问题,不同的人写的可能有不同的用处,没办法解析;现在在Java程序中使用,使用xml文档来代替properities作为配置文件
XML语法
- HTML 是从XML演化出来的一种编程语言。二者是父子关系
- HTML绝大多数语法都来自XML
- 一个XML文档必须以一个根目录标签为开始,其他的标签都必须作为【根目录标签】的直接子标签或间接子标签
<school>
<student>
<member name="zains"></member>
</student>
</school>
为什么会被Java捡起来呢?比如说要存放多个数据库的配置信息,这样就可以判断出哪个数据是在哪个数据库里的,所属关系非常清晰。
4. HTML对英文字母的大小写是不区分的,但是XML是区分的,必须保持一致。
5. 在HTML中属性内容可以用双引号“”包含,也可以不用;XML的属性内容必须在一对双引号或者单引号中
XML文档读取方式
- SAX读取方式:根据开发人员需要,一次将当前文档中若干个满足需要的标签加载到内存中
- 优点:节省内存
- 缺点:如果需要读取大量标签信息的时候运行效率比较低,因为每次都读取一个标签,可读取较小的xml文档
- DOM读取方式:一次性将所有xml文档内容加载到内存中
- 优点:读取大量标签信息的时候,此时由于是在内存中进行定位
- 缺点:浪费内存
- 实际都使用DOM方式读取
XML约束文档
- XML文档约束文档的作用:
设置可以在当前XML文档中声明的【标签类型名】
设置可以在标签中出现的【属性名】
设置标签之间父子关系和兄弟关系 - xml约束文档分类
(1) DTD约束文档【.dtd】:简单约束文档(也是一种xml文档)
定义了哪些标签可以在当前文档中使用,定义了可以使用的属性,怎么绑定呢?
<!DOCTYPE name SYSTEM "name">
把这个放在需要这个约束的xml文档中即可。
如何去看约束?
<!ELEMENT>
- <!ELEMENT 标签类型名(括号里面显示的是可以在当前标签内部出现的子标签)>:标签类型名称,可以声明当前的xml文档中可以声明的标签名称
- <!ELEMENT 标签类型名 (子标签名+)>:当前子标签必须出现在父标签内部,并且可以出现多次
- <!ELEMENT 标签类型名 (子标签名?)>:表示当前的子标签可以出现在父标签内部也可以不出现/而且如果出现只能出现一次
- <!ELEMENT 标签类型名 (#PCDATA)>:表示当前标签没有子标签【一般在这种标签当中填充文字内容】
- <!ELEMENT 标签类型名 (子标签名*)>:表示当前的子标签可以出现在父标签内部也可以不出现/如果出现的话可以出现多次
- <!ELEMENT 标签类型名 (子标签名)>:表示这个子标签必须出现在父标签内部/且只能保存一次
- <!ELEMENT 标签类型名 ((子标签名|子标签名2))>:这两个子标签必须出现在父标签中,但是不能同时出现
- <!ELEMENT 标签类型名 (子标签名1,子标签名2)>:子标签1和子标签2的顺序必须保持声明的时候的顺序
<!ATTLIST>
<!ATTLIST 标签类型名 属性名>:声明可以在当前标签内部可以使用的属性名称(2)SCHEMA约束文档【.xsd】:高级约束文档
以标签的形式来进行约束,最大的特点是支持前缀名,导入之前把xsd文件的前面注释部分直接copy到要约束的xml文件中即可。
⚠️在同一个文档中不能有两种xml约束文档
SCHEMA和DTD的区别
- dtd文档如果两个文档对同一个xml文件进行约束的时候如果其中有两个相同的名字的标签的话,会出现问题。
- 但是在SCHEMA文档中支持前缀名
<one:body>. <two:body>
,这样就可以进行区分 - 但是其实一个xml文档都是只有一个xml文档约束,而且大多数都用SCHEMA