XML的简单认识
一、初识XML
1.1 XML和HTML的对比
1.1.1 用途方面
XML主要用于数据存储、传输、配置文件;HTML主要用于页面展示。
(一开始XML想替换HTML,后来失败了就转数据存储应用了。)
1.1.2 标签扩展性方面
Extensible Markup Language:可扩展标记语言
- XML可扩展:标签不用提前定义,可以自行定义,只要符合规范即可
- HTML不可扩展:标签都是定义好的
1.2 HTML和XML的关系?
HTML和XML都是w3c公司的产品。
- w3c:万维网联盟,制定各种网络标准,比如js、html、css都是他们制定的。
- html先出现在市场,但是各个厂商版本的浏览器为了展示自己功能的强大,有些就不遵循html的标准,当然也能实现页面的正常展示。例子如下:
<html>
<head></head>
<body>
<font color="red">这是font</font>
</body>
</html>
<font color="red">这是font</font>
上述二者皆可正常展示。
XML语法非常严格,必须遵循规范,否则解析不出来。结果发现没人用,因为习惯用HTML,二者语法功能也一样,相比XML语法更严格,所以就没人用。XML退出幕后,常用于数据存储,在java中用作配置文件也比较多。
Java中properties 配置文件举例:
.properties(扁平)
姓名:张三
年龄:18
性别:男
Xml配置文件有层次,所以用作配置文件很合适
<人>
<姓名>张三</姓名>
……
</人>
二、XML的作用
2.1 存储(数据库)
<students>
<student>
<name>as</name>
<age>12</age>
</student>
<student>
<name>as</name>
<age>12</age>
</student>
<student>
<name>as</name>
<age>12</age>
</student>
</students>
利用XML解析工具可以对上面的文件进行增删改查的操作
2.2 数据传输
XML可以作为两个系统之间传输信息的载体
一个由C语言写的系统,一个由Java语言写的系统,二者之间进行数据交流需要双方都认可的数据格式才行,这种需要提前约定好XML格式。不同系统之间怎么约定XML的数据格式?可以用xml的约束来规定,约束需要提前约定,具体约束方式后面会有。
2.3 配置文件
所有的应用几乎都有配置文件,配置文件是用来定义应用的一些属性信息的。例如qq、微信,应用的打开界面和尺寸都是提前规定好的,可以把这些信息写在程序中(把程序写死了,程序和配置耦合到一起了),也可以把这些配置信息写在配置文件中,在启动程序的时候读取这些配置文件即可(程序和配置分开了,程序变得更灵活)。
<config>
<color>red</color>
</config>
三、xml文件的书写要求
1、 xml的文件后缀是.xml
2、 xml的第一行必须定义为文档声明
3、 xml文档中有且仅有一个根标签
4、 属性值必须使用引号(单双都行)引起来
5、 标签必须正确关闭
6、 xml的标签名称区分大小写
<?xml version="1.0"?>
<students>
<student>
<name>as</name>
<age>18</age>
<gender value="female"/>
<sex>female</sex>
</student>
</students>
四、xml的组成部分
4.1 文档声明
格式:
属性列表:
version:版本号,必须的属性,只有两个1.0或者1.1,1.1版本不兼容1.0的,所以用的很少。
encoding:默认是iso-8859-1,告诉浏览器以这个编码去解析,但是这个编码不包含中文。注意:这个地方的值要和存储文件的时候的编码值保持一致。
Standalone:是否独立。值:yes或no,就是说当前文件是否需要依赖外部文件。经过实践发现,无论什么值,都可依赖外部文件,写不写都没用。
4.2 指令
控制xml去做什么事情,(了解,用的很少)
例如:指挥浏览器怎么解析当前xml文件:
当前路径提前建立sytle.css样式文件
name{
color:red;
}
4.3 标签
标签名称自定义
规则:
- 名称可以包含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字母xml(或者XML、Xml等等)开始
- 名称不能包含空格
4.4 属性
id属性值唯一,id是唯一标识值
4.5文本
CDATA区:在该区域中的数据会被原样展示
格式: <![CDATA[ 数据 ]]>
<![CDATA[内容]]>
五、Xml的DTD约束和Schema约束
5.1 什么是约束
规定xml文档的书写规则。
5.2 为什么xml需要约束
举例:A系统用c语言写的,B系统用java语言写的,系统之间进行数据交流,就可以用xml进行交流,但是不能随意定义标签,需要提前规定xml的数据样式和数据规则,标签代表什么含义等。
<content>
<message>你好</message>
<data>today</data>
</content>
5.3 约束的种类
- DTD:一种简单的约束技术(Document Type Definition),比较简单。
- Schema(大纲):一种复杂的约束技术。
约束在开发中的应用场景:
框架(booststrap)(半成品的软件/项目)+需要很多的配置(xml文件)+由开发者进行配置,配置文件不能乱配置,要按照框架给出的约束去配置。
5.3.1 XML的DTD约束
DTD的三种引入方式:
- 内部dtd:将约束规则定义在xml文档中
- 本地dtd:
- 网络dtd:
方式一:内部dtd
方式二:本地dtd
方式三:网络dtd
5.3.2 XML的schema约束
Schema约束文件的后缀名是xsd,本质上还是个xml文件。
XSD内部文件的格式:
XML约束文件的引用格式:
六、XML文件的解析
6.1 什么叫xml的解析
指的就是操作XML文档,将文档中的数据读取到内存中,或者是把内存中的数据写到xml文件中去。
- 解析(读取):将文档中的数据读取到内存中
- 将内存中的数据保存到xml文档中,持久化的存储
6.2 解析xml的两种思想
6.2.1 DOM(Document Object Model)
将标记语言文档一次性加载进内存,在内存中形成一颗dom树。
- 优点:操作方便,可以对文档进行CURD的所有操作
- 缺点:占内存
6.2.2 SAM(Simple API for XML)
SAM:逐行读取,基于事件驱动的。
逐行读取(逐个元素读取):读到下一行的内容的时候,把上一行的内容丢掉,在内存中永远只有一行数据。
事件驱动:读到根标签要作什么,读到属性节点要做什么,读到文本标签要做什么,读到结束标签要做什么,代码要自己写,所以比较复杂。
- 优点:不占内存
- 缺点:只能读取,不能增删改
6.3 Xml常见的解析器
- JAXP:sun公司提供的解析器,支持dom和sam两种思想。不需要导入第三方jar包,因为JAXP就是sun公司的产品,已经在jdk中了。但是没人用,因为效率低。
- DOM4J:一款非常优秀的解析器(dom+sam),市面上用的也比较多。
- Jsoup:简单高效,jsoup是一款JAVA的HTML解析器,可直接解析某个URL地址,HTML文本内容。它提供了一套非常省力的API,可通过DOM,css以及类似jQuery的操作方法来取出和操作数据。
- PULL:Android操作系统内置的解析器,sam方式的。手机内存小,所以就是sam方式,但是在服务器端一般就采用dom解析方式。