前言
- 在学习java web中经常会配置xml文件,而在后面的框架学习中也会遇到xml,所以先来对xml简单学习一下,后面遇到关于xml新的应用再来补充,本文长期更新。
- 参考文章:java3y的从零开始学习xml
- 参考视频:黑马程序员的xml学习https://www.bilibili.com/video/BV1P7411F7Wr
一 什么是xml
- xml是可扩展标记语言(
Extensible Markup Language
)。可扩展指的是它的标签是自定义的 。 - 它的功能主要是用来做配置文件
二 xml的历史
- gml(1969)->sgml(1985)->html(1993)->xml(1998)
- 1969 gml(通用标记语言),主要目的是要在不同的机器之间进行通信的数据规范
- 1985 sgml(标准通用标记语言)
- 1993 html(超文本标记语言,www网)
- 1998 xml extensiable markup language 可扩展标记语言
xml最初是用来替代HTML的,因为HTML的代码规范性很弱(写代码时可以省略很多代码,而浏览器的引擎会自动补全。但不同浏览器之间没有统一规范,造成代码的混乱),由于市场等原因没有成功,后来便倾向于取代代码的配置文件properties (properties是配置文件,主要的作用是通过修改配置文件可以方便的修改代码中的参数,实现不用改文件即可灵活变更参数)
xml具有比properties更好的效果,被广泛用在配置文件中。
三 为什么要使用xml
- 正如前面所说,用在项目的配置文件中。
- 贴一个回答
- 但也有其他方面的作用。例如程序间数据的传输,充当小型数据库。
- 程序间数据的传输: QQ之间的数据传送,用XML格式来传送数据,具有良好的可读性,可维护性
- 充当小型数据库: 我们程序中可能用到一些经常要人工配置的数据,如果放在数据库中读取不合适(因为这会增加维护数据库的工作),则可以考虑直接用XML来做小型数据库。这种方式直接读取文件显然要比读数据库快。比如msn中保存用户聊天记录就是用XML文件。
四 xml与HTML的区别
xml和和HTML很相似,都是标记语言,使用起来也有很多共同点,但也有很多差异。差异如下。
- xml标签都是自定义的,HTML的标签都是预定义的。
- xml语法严格,HTML语法松散(代码可以省略,残缺)。
- xml是存储数据的,HTML是展示数据的。
- HTML相比,xml什么也不做,它是用来结构化,存储和传递信息的(从上面的xml配置文件,小型数据库等可看出)
五 xml的语法
1.文档声明
- 格式:<?xml 属性列表 ?>
- xml声明放在xml的第一行
- 属性列表
- version :版本号,必填的属性,一般为1.0。
- encoding:编码方式。告知解析引擎当前文档使用的字符集,默认值 ISO-8859-1,一般使用utf-8或者GBK
- standalone:是否独立。取值为yes 或者 no ,表示xml文档是否依赖其他文件,但现在的xml文件不用这个属性了。
- 正确的文档属性
<?xml version="1.0" encoding="UTF-8"?>
2. 元素
- 每个xml文档必须有且只有一个根元素。
根元素是一个包括文档中其他所有元素的元素
根元素的起始标记要放在所有其他元素的起始标记之前
根元素的结束标记要放在所有其他元素的结束标记之后
- XML元素中的出现的空格和换行都会被当做元素内容进行处理
<stu>xiaoming</stu>
上面的代码和下面的代码表示的意义不相同
<stu>
xiaoming
</stu>
- 元素必须闭合
- 大小写敏感
- 不能以数字开头
- 不能交叉嵌套
这里的注意点有点多,但并不需要全部记忆,只要知道xml语法是规范的,不能随意乱写就行!
3. 属性
- 属性是xml元素的一部分。(id就是属性值)
<student id="100">
<name>Tom</name>
</student>
- 这里要注意:
属性值用双引号(”)或单引号(’)分隔,如果属性值中有单引号,则用双引号分隔;如果有双引号,则用单引号分隔。那么如果属性值中既有单引号还有双引号怎么办?这种要使用实体(转义字符,类似于html中的空格符),XML有5个预定义的实体字符
- 五个预定义的xml实体字符
4. 注释
- 和HTML一样的注释
<!-- 注释内容-->
5. 处理指令
- 可以用css文件修饰xml文档,然后用浏览器打开xml文件后会看到被修饰的效果,但一般不用。使用时要引入css文件。
<?xml-stylesheet type="text/css" href="a.css" ?>
6. CDATA
- 在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理。遇到此种情况,可以把这些内容放在CDATA区里,对于CDATA区域内的内容,XML解析程序不会处理,而是直接原封不动的输出
- 语法
<![CDATA[
...内容
]]>
六 xml的约束与使用
- 由于xml是一种可以自定义的语言,所以在多人协调使用时会显得很混乱,所以我们要对它进行约束,人为的规定它的书写规则。
- 约束方式分为两种。
- DTD:一种简单的约束技术(存在缺陷,无法对xml文档准确约束)
- Schema:一种复杂的约束技术(主要使用这个)
-
DTD:
1. 引入DTD文档到xml文档中 内部dtd:将约束文档定义在xml文档中。
<!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">
外部dtd:将约束规则定义在外部的dtd文件中
<!DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件的位置URL">
2. dtd约束的一些规则
-
Schema
引入文档(开发中编辑器自动会引入)1. 填写xml文档的根元素(以下操作都是在根元素内部完成,添加属性) 2. 引入xsi 前缀: (有很多取值)
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3.引入xsd 命名空间:(student.std 表示xml的Schema约束文档)
xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
4.为每一个xsd约束声明一个前缀,作为标识:(下面的标识为无 在xmlns后等号前声明)
xmlns="http://www.itcast.cn/xml"
七 xml的解析
- 因为xml被设计为“什么都不做”,XML只用于组织、存储数据,除此之外的数据生成、读取、传送等等的操作都与XML本身无关。所以需要专门的技术来解析使用它。
- xml的解析方式有两种。
- DOM: 将标记语言一次加载进内存,在内存中形成一颗dom树
--------- 优点: 操作方便,可以对文档进行CRUD的所有操作
----------缺点: 占内存- SAX:逐行读取,基于事件驱动的。
----------优点:不占内存。
---------- 缺点:只能读取,不能增删改
- 在xml解析中,除了解析方式外还要有解析器,通过解析器采用特定的解析方式来获取xml文档中的数据。
- 常见的xml解析器有JAXP , DOM4j ,Jsoup,PULL。
- JAXP:sun公司提供的解析器,支持dom和sax两种思想,jdk自带,但使用效果不佳。
- DOM4J:一款非常优秀的解析器
- Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本 内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
- PULL:Android操作系统内置的解析器,sax方式的。
- xml文档的解析过程:要使用xml文档的应用程序不是直接对xml文档进行操作的,它要通过xml解析器执行SAX/DOM 解析方式来获取到xml的内容。