什么是 XML
# 00.什么是 XML
XML 是传输数据的一种重要的格式
# 在 XML 出现之前
在互联网中,我们经常需要传输数据。例如,我们自己的系统要给另一个系统传输用户信息,包含用户姓名,年龄,性别……等数据,那么怎么约定数据呢?
我们可以用约定好数据的先后顺序(例如姓名是第一个,年龄第二个),然后用 csv 的格式(csv 就是用逗号分割各个数据项)传送:
晓林,18,男……
看上去好像也没什么问题,可以正常使用。但实际上当数据多起来后:
晓林,18,男,唱跳rap篮球music,薯条,雷姆,计算机……
看着上面的数据,你是否不知道后面几个数据的含义?这样传送数据缺点如下:
- 当数据项多了,光看数据很难知道每个数据项的含义,得对着约定好的顺序来看
- 当要增加和删除某个数据项,都得修改相应的代码,数据项多了也容易改漏之类的
- 其他系统可能不知道你这个约定,例如换一个系统,它就不知道你这个约定了,如果要接受数据,还得重新开发代码来按照你的约定来解析这个数据。
有没什么办法可以让数据看起来更方便,并且能在各个系统之间传输呢?
有的,为了解决“让大家都明白这是什么数据”的问题,1986 年国际标准化组织发布了一个信息管理方面的国际标准(ISO 8879:1986 信息处理),也就是标准通用标记语言,Standard Generalized Markup language,简称 SGML,就是计算机的文本结构和描述内容的国际标准语言。
字面意思其实就可以理解:标记语言是标准通用的,只要你按照这个标准,甭管是哪台计算机,都遵循一个规范,这样就“听”得懂你说的啥,也就能顺利解析该数据了
XML 就是实现了这个标准的一种语言,并且在早期非常流行
# 什么是 XML
XML 全称可扩展标记语言(eXtensible Markup Language),被设计用来显示、传输和存储数据。我们来看一个最简单的 XML 例子:
<username>晓林</username>
<age>18</age>
<sex>男</sex>
<hobby>唱跳rap篮球music</hobby>
<food>薯条</food>
<wife>雷姆</wife>
<study>计算机</study>
2
3
4
5
6
7
XML 是一种语言,所以是基于文本的(不是通过二进制的格式来处理数据)
XML 是标记语言,什么是标记呢?就是我们可以给一个数据,做个标记,例如我们用 <username>
这个标签,来说明后面的数据线 晓林
是用户名(username 的中文)。
就好比我们读书的时候,对于重点部分可以用笔画一个下划线,这也是一种打标记。
# XML 的结构
XML 有固定的结构:
- 首行必定是
<?xml version="1.0"?>
,可以加上可选的编码。 - 紧接着,如果以类似
<!DOCTYPE note SYSTEM "book.dtd">
声明的是文档定义类型(DTD:Document Type Definition),DTD 是可选的。后续会详细讲解。 - 接下来是 XML 的文档内容,一个 XML 文档有且仅有一个根元素,根元素可以包含任意个子元素。
- 元素可以包含属性,例如,
<isbn lang="CN">1234567</isbn>
包含一个属性lang="CN"
, - 如果是空元素,可以用
<tag/>
表示。
例如,这是一个 XML 的例子:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE note SYSTEM "book.dtd">
<book id="1">
<name>Java核心技术</name>
<author>Cay S. Horstmann</author>
<isbn lang="CN">1234567</isbn>
<tags>
<tag>Java</tag>
<tag>Network</tag>
</tags>
<pubDate/>
</book>
2
3
4
5
6
7
8
9
10
11
12
由于使用了 <
、>
以及引号等标识符,如果内容出现了特殊符号,则需要转义。例如,Java<tm>
必须写成:
<name>Java<tm></name>
常见的特殊字符如下:
字符 | 转义表示 |
---|---|
< | < |
> | > |
& | & |
" | " |
' | &apos |
XML 有几个特点:一是纯文本,默认使用 UTF-8 编码,二是可嵌套,适合表示结构化数据。如果把 XML 内容存为文件,那么它就是一个 XML 文件,例如 book.xml
。
# DTD
DTD,全称 Document Type Definition,我们可以认为里面定义了很多规则,而 XML 文件必须遵守这些规则。例如,DTD 制订了如下规则:
- 根元素必须是
book
book
元素必须包含name
,author
等指定元素isbn
元素必须包含属性lang
- ...............
这个规则是数据的发送方和使用方都会遵守的规则,如果我们没有按照 DTD 的规则来书写 XML 文件,那么就有可能会发生错误,例如发送方写错了一个标签名,导致接收方解析不了。
例如,我们后续学习 JavaWeb 开发的时候,有一个 web.xml 文件:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
</web-app>
2
3
4
5
6
7
可以看到其定义了一个 dtd,其部分内容如下:
可以看到其有一个元素叫做 servlet-mapping
,也就是说我们可以在 web.xml 里写这个标签,而且里面应该包含标签 url-pattern