XML 这玩意儿其实没多复杂,说穿了就一句话 —— 它是一种用来存数据和传数据的纯文本格式。你把它理解成一个带标签的记事本就行。
例如:使用 XML 描述一本书的名称、作者和价格。
<book>
<name>Python</name>
<author>John Doe</author>
<price>29.99</price>
</book>注意,上面 XML 中的 book、name、author 标签名都是我们自己定义的,你可以根据自己的喜好进行修改。
很多人第一次听到 XML 会想到 HTML,确实长得有点像,但它俩干的活儿完全不一样:HTML 负责把页面画出来给人看,XML 只管把数据整理清楚,不关心好不好看。也正因为这样,不管是人还是程序,读 XML 都很轻松。
聊几个 XML 最突出的地方,知道这些你就能理解为什么这么多年它一直没被淘汰:
XML 不像 HTML 那样规定死了只能用 <div>、<p>、<span> 这些标签。你想叫 <student>、<order>、<product> 都行,完全按业务需求来。这意味着你可以用最贴近业务的语言去描述数据,不用迁就一套固定的标签体系。
标签一层套一层,自然形成父子关系,特别适合表达那种“一个东西下面有好几个子项”的数据。比如一个班级下面有若干学生,每个学生有姓名和成绩 —— 这种层级关系用 XML 写出来一目了然。
XML 不依赖任何特定的操作系统或编程语言。你可以在 Windows 上生成一个 XML 文件,传到 Linux 服务器上解析,或者用 Java、Python、C# 随便哪种语言去读写它,完全没问题。
这是 XML 和 HTML 差别最大的地方之一。XML 不允许任何语法错误 —— 标签没闭合、大小写不一致、嵌套交叉了,解析器直接报错,不跟你商量。看起来很苛刻,但换个角度想,这也意味着数据格式不会模棱两可,出问题了一查就知道。
看一个最简单的例子就能搞懂 XML 长什么样:
<root>
<student id="101">
<name>张三</name>
<age>20</age>
</student>
</root>这里面只有三种东西:
标签(Tag):<student>、<name>、<age> 这些用尖括号包起来的就是标签,用来圈定数据的边界。
属性(Attribute):id="101" 这种写在标签里面的键值对,用来给标签附加额外信息。
文本(Text):夹在标签中间的内容,比如 "张三"、"20",这才是真正要传递的数据。
还有一个概念叫根节点,就是最外面那层 <root>。
注意:一份 XML 文件必须只有一个根节点,所有其他内容全得放在它里面。
写 XML 的时候记住这几条就够了:
第一行写声明:<?xml version="1.0" encoding="UTF-8"?> 告诉解析器这是 XML 文件、用什么编码。
只能有一个根标签:所有内容都得包在这个唯一的根标签里。
标签必须成对:<name>张三</name>,有开头就必须有结尾。如果标签没有内容,可以简写成 <tag/>。
大小写是两回事:<User> 和 <user> 在 XML 眼里是完全不同的两个标签,写错了直接报错。
嵌套不能交叉:<a><b></a></b>这种写法不行,必须规规矩矩地 <a><b></b></a>。
属性值必须加引号:id="101"或 id='101'都行,但不能写成 id=101。
把上面的规则串起来,写一个完整的 XML:
<?xml version="1.0" encoding="UTF-8"?>
<user>
<id>1001</id>
<name>张三</name>
<age>28</age>
<address province="四川">成都</address>
</user>详细说明:
第一行是 XML 声明,告诉程序 "我是 XML,用 UTF-8 编码"。
<user>是根节点,下面挂着 id、name、age、address 四个子节点。
province="四川"是 address 标签的属性,用来补充说明这个地址属于哪个省。
下表从四个维度对 XML 和 HTML 进行比较:
| 对比项 | XML | HTML |
| 核心职责 | 存储和传输数据 | 展示网页内容 |
| 标签来源 | 完全自定义 | 固定的标签集(div、p、a...) |
| 语法要求 | 极其严格,错一点就报错 | 比较宽松,浏览器会尽量容错 |
| 样式渲染 | 不管,没这个概念 | 负责布局、颜色、视觉效果 |
一句话总结:HTML 关心 "看起来怎么样",XML 关心 "数据是什么"。
XML 在真实项目中主要出现在这几个场景:
项目配置文件:很多框架和软件用 XML 来写配置,比如 Java 的 Maven(pom.xml)、Android 的布局文件、.NET 的 web.config,打开一看全是 XML。
跨系统数据交互:两个不同语言写的系统要传数据,XML 就是个通用中介。A 系统生成 XML,B 系统解析 XML,谁都不用管对方用什么技术栈。
文档格式标准:早期的电子书(epub 里面就有 XML)、Office 文档(docx、xlsx 本质上是压缩包里面装 XML)、自定义报表,底层很多都是 XML。
数据格式校验:可以配合 DTD 或 XML Schema 定义一套规则,规定哪些标签能出现、什么类型、什么顺序,不符合规则的数据直接拒绝。
XML 本身只负责写数据,真正干活的时候一般还会搭配下面这几样东西:
这两个东西的作用是一样的:给你的 XML 定规矩。比如规定 <user>下面必须有 <name>,<age>的值必须是数字,<address>可以有 province 属性等等。数据发过来,先用 Schema 校验一下合不合规,不合规的直接打回去。
一种路径表达式,用来在 XML 里面定位节点。你可以把它理解成 XML 的"文件路径" —— 比如 /user/address 就表示找到 user 下面的 address 节点。配合程序使用,可以精准地提取你需要的某一块数据。
用来做格式转换的工具。它可以把 XML 转换成 HTML、纯文本,甚至另一种结构的 XML。比如你想把一份 XML 数据渲染成网页表格,写一个 XSLT 模板就能搞定。
更多 XML 相关知识将在单独的教程中详细介绍。