XML 与 YAML 对比
本章定位 :对比 XML 和 YAML——标签语法 vs 缩进语法,锚点/引用机制,配置文件场景的优势,理解两种格式的互补关系。
定义与作用
YAML (YAML Ain't Markup Language)是一种人类友好的数据序列化格式,使用缩进表示层级,语法极简。最初设计为比 XML 更易读写的配置格式,如今广泛用于 Kubernetes/Docker Compose/Ansible/Spring Boot 等工具的配置文件。
XML 和 YAML 是互补关系而非竞争关系:XML 擅长"机器验证机器交换"的数据场景,YAML 擅长"人写人读"的配置场景。
核心原理:缩进 vs 标签
图解释 :XML 用标签包裹表达层次,YAML 用缩进(类似 Python)。YAML 的精简换来易读性;XML 的冗余换来结构确定性——你不会因为少打了一个空格而改变数据含义。
语法/结构要点
相同数据:三种格式对比
XML:
<student id="S001">
<name>小崔</name>
<gpa>3.8</gpa>
<courses>
<course>XML技术</course>
<course>Java高级</course>
</courses>
<contact>
<email>xiaocui@learnto.cn</email>
<phone>138-0000-0001</phone>
</contact>
</student>
JSON:
{"student":{"id":"S001","name":"小崔","gpa":3.8,"courses":["XML技术","Java高级"],"contact":{"email":"xiaocui@learnto.cn","phone":"138-0000-0001"}}}
YAML:
student:
id: S001
name: 小崔
gpa: 3.8
courses:
- XML技术
- Java高级
contact:
email: xiaocui@learnto.cn
phone: 138-0000-0001
YAML 独有特性
| 特性 | 语法 | 用途 |
|---|---|---|
| 锚点 & 引用 | &anchor *anchor | 复用配置片段 |
| 合并键 | <<: *anchor | 继承默认配置 |
| 多行字符串 | ` | (保留换行)>` (折叠换行) |
| 类型标注 | !!str !!int | 强制类型 |
| 多文档 | --- 分隔 | 一个文件多个文档 |
锚点示例
defaults: &defaults
timeout: 30
retries: 3
service_a:
<<: *defaults # 继承 defaults
host: a.learnto.cn
timeout: 60 # 覆盖 timeout
service_b:
<<: *defaults
host: b.learnto.cn
完整示例:大翔用 YAML 管理微服务配置
场景说明
飞翔科技的运维 大翔 要把原先散落在 XML 中的 50 个微服务配置整合为 Docker Compose 和 Spring Boot 的 YAML 格式。
操作前:XML 配置(冗长)
<datasource>
<url>jdbc:mysql://db:3306/edu</url>
<username>edu_app</username>
<password>secret</password>
<pool>
<maxSize>20</maxSize>
<minIdle>5</minIdle>
<timeout>30000</timeout>
</pool>
</datasource>
操作后:YAML 配置(简洁)
# application.yml — Spring Boot 配置
spring:
datasource:
url: jdbc:mysql://db:3306/edu
username: edu_app
password: ${DB_PASSWORD}
# 连接池(HikariCP)
hikari:
maximum-pool-size: 20
minimum-idle: 5
connection-timeout: 30000
# Docker Compose
version: '3.8'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_DATABASE: edu
volumes:
- mysql_data:/var/lib/mysql
app:
build: .
ports:
- "8080:8080"
depends_on:
- mysql
environment:
DB_PASSWORD: ${DB_PASSWORD}
volumes:
mysql_data:
操作结果
原本 12 行的 XML 配置缩减为 6 行 YAML。更关键的是:YAML 的缩进层级让配置结构一目了然,不需要数标签嵌套。
大翔利用 Docker Compose 把整个技术栈(MySQL + App)声明在一个 YAML 文件中,docker-compose up 一键启动。
选型建议
| 场景 | 推荐 | 原因 |
|---|---|---|
| 跨系统数据交换 | XML | Schema 验证、命名空间、XSLT 转换 |
| 文档标记 | XML | 混合内容、属性、注释 |
| REST API | JSON | JavaScript 原生、Web 标准 |
| 应用配置文件 | YAML | 简洁、支持锚点复用、Spring Boot 原生 |
| 微服务编排 | YAML | Docker Compose / K8s 标准 |
| CI/CD 流水线 | YAML | GitHub Actions / GitLab CI 标准 |
易错场景
错误一:YAML 缩进用 Tab
YAML 严格要求 空格 缩进(不能用 Tab 字符)。Python 程序员特别容易踩这个坑。
错误二:YAML 的隐式类型转换
# NO 被解析为布尔 false(挪威的国家代码)!
country: NO
# 正确:加引号
country: "NO"
YAML 1.1 有隐式类型转换(yes/no/true/false/on/off 转布尔,012 转八进制)。始终为可能歧义的字符串加引号。
面试考点
| 考点 | 参考答案要点 |
|---|---|
| XML 对比 YAML 的核心优势? | Schema 验证(DTD/XSD)、XPath/XSLT 查询转换、命名空间、文档标记(混合内容+属性)、ID/IDREF 关联 |
| YAML 相比 XML 的优势? | 人类可读写性强(缩进代替标签)、配置文件极简、锚点引用支持片段复用、多文档支持(---分隔) |
| YAML 的锚点和合并键的作用? | 锚点(&name *name)复用 YAML 片段;合并键(<< : *name)继承默认配置并允许覆盖特定字段 |