乐途乐途
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
  • 学习路径
  • XML 基础语法

    • XML 概述
    • XML 文档结构
    • XML 元素
    • XML 属性
    • XML 语法规则
    • XML 命名空间
    • XML 注释与处理指令
  • DTD 与文档验证

    • DTD 概述
    • DTD 元素声明
    • DTD 属性声明
    • DTD 实体声明
    • DTD 元素与属性对比
    • DTD 完整示例
  • XML Schema 定义

    • XML Schema 概述
    • XSD 简单类型
    • XSD 复杂类型
    • XSD 命名空间与引用
  • XPath 节点定位

    • XPath 概述
    • XPath 路径表达式
    • XPath 谓词与函数
  • XSLT 转换

    • XSLT 概述
    • XSLT 模板与匹配
    • XSLT 控制结构
    • XSLT 输出控制
  • XML 解析技术

    • XML 解析概述
    • DOM 解析
    • SAX 解析
    • StAX 解析
    • XML 与 Java — JAXP
  • XML 在 Java 中的应用

    • Spring XML 配置
    • MyBatis XML 映射
    • pom.xml 与 Maven
    • web.xml 配置详解
  • 现代数据格式对比

    • XML 与 JSON 对比
    • XML 与 YAML 对比
  • XML 显示与浏览器集成

    • XML 在浏览器中的显示
    • XMLHttpRequest 与 AJAX
    • 服务器端 XML 处理
  • XML 进阶查询与链接

    • XQuery 查询语言
    • XLink 超链接
    • XML 验证工具使用
  • XML Web 服务(选读)

    • XML Web 服务概述
    • SOAP 协议详解
    • WSDL 服务描述
    • RSS 内容聚合
    • RDF 资源描述框架

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 一键启动。

选型建议

场景推荐原因
跨系统数据交换XMLSchema 验证、命名空间、XSLT 转换
文档标记XML混合内容、属性、注释
REST APIJSONJavaScript 原生、Web 标准
应用配置文件YAML简洁、支持锚点复用、Spring Boot 原生
微服务编排YAMLDocker Compose / K8s 标准
CI/CD 流水线YAMLGitHub 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)继承默认配置并允许覆盖特定字段
上一页
XML 与 JSON 对比