在配置文件、数据交换和持续集成脚本里,XML和YAML都是常见的文本格式。它们都能表达层级数据,但语法设计和阅读体验差别明显。弄清楚这些差别,有助于在项目中做出合理选择。

一、基本语法结构差异
XML使用标签对来包裹数据,每一个元素都有明确的开始和结束标记。这种写法让机器解析非常稳定,因为无论怎样换行,标签边界都清晰。但代价是文件里大量字符花在标签名重复上,人眼阅读时容易被尖括号干扰。
YAML则依靠缩进表达层级,不使用闭合标签。它用冒号表示键值,用短横线表示列表项。由于去除了包裹符号,同样的信息量下YAML行数更少,视觉上更干净。下面的例子展示同一份数据的两种写法。
<server>
<host>127.0.0.1</host>
<port>8080</port>
<roles>
<role>admin</role>
<role>user</role>
</roles>
</server>
server:
host: 127.0.0.1
port: 8080
roles:
- admin
- user
从上面代码能直接看出,YAML版本少了一半左右的字符。对需要经常手动改配置的人,少打字、少看符号就是直观的可读性提升。但YAML要求缩进严格一致,一般用两个空格,混用制表符就会报错。
二、注释与数据类型表达
XML本身标准不定义注释以外的轻量标注,但可以通过<!-- 注释 -->写说明,只是注释不能像数据一样被程序随意忽略处理,且写起来笨重。YAML用井号开头写注释,可以紧跟在值后面,对维护者很友好。
在数据类型上,XML所有内容默认都是文本,数字和布尔要程序自己转换。YAML能自动识别字符串、数字、布尔、空值,甚至支持多行文本块。这让它在脚本配置里更省心,不用写额外解析逻辑。
# 数据库开关,直接被解析为布尔 debug: true timeout: 30 note: | 这是一段 多行说明
这种内建类型系统减少了转换代码,也降低了因类型误判产生的bug。不过要注意,YAML里某些词如 yes、no 在特定解析器中被当作布尔,可能引发意料外行为,写的时候最好加引号明确字符串。
三、可读性好坏要看使用场景
如果文件主要由人写、人改、人读,比如应用里的 application.yml,YAML明显更顺手。它的缩进结构像大纲,新人也能快速看懂配置含义。这也是为什么Spring Boot等框架默认推YAML。
但在需要复杂校验、跨语言强契约交换时,XML配合XSD能严格定义结构和类型,很多旧银行、电信系统仍离不开它。此时可读性让位于可靠性和工具链成熟,XML标签虽啰嗦却不容易因空格出错。
| 对比维度 | XML | YAML |
|---|---|---|
| 冗余符号 | 多 | 少 |
| 缩进敏感 | 否 | 是 |
| 人工修改友好度 | 一般 | 高 |
| 严格结构校验 | 强(XSD) | 弱 |
综合来看,单纯比可读性,YAML在大多数现代开发场景里胜出。但若团队工具基于XML生态,或配置极少手工改,那么XML也未必难读。选格式时先想清楚谁来看、谁来改,再决定用哪个。
四、解析成本与常见坑
XML解析库几乎每种语言都有成熟实现,DOM和SAX两种模式覆盖内存和流式需求。YAML解析稍复杂,因为缩进和类型推断增加了解析器负担,某些语言里加载大YAML会比XML慢。
实际用YAML常踩的坑是复制粘贴时缩进错乱,以及把密码写成未引号化的看起来像数字或布尔的值。下面这段有问题的YAML就可能导致配置错误。
server: port: 08080 # 本意字符串,却被转成数字失前导零 enabled: off # 某些解析器当布尔false
改成加引号就能避免:
server: port: "08080" enabled: "off"
XML虽没有缩进坑,但手写长标签易漏写结束符,导致整段解析失败。两种格式各有易错点,可读性高不代表不会写错,配合格式校验工具才是稳妥做法。