YAML 转 XML 实战:把易读配置喂给老系统和 SOAP
讲清楚 YAML 转 XML 的核心规则:key 怎么变标签、嵌套怎么变层级、列表怎么重复、@ 前缀怎么变属性,附一段真实输入输出例子。
YAML 转 XML 实战:把易读配置喂给老系统和 SOAP
我维护过一个内部服务,代码里所有配置都写成 YAML,因为缩进清楚、还能写注释,改起来不费眼。可有个老合作方的接口只认 SOAP,信封必须是 XML。我第一次手工把 YAML 抄成 XML,漏了一个闭合标签,联调卡了一下午。后来我把这套转换规则彻底理顺,才发现 YAML 转 XML 没那么玄,关键就是搞懂四件事:key 怎么变标签、嵌套怎么变层级、列表怎么处理、属性怎么写。
为什么要把 YAML 转成 XML
YAML 适合人读,XML 适合老系统读。Spring 的 beans 配置、老的 .NET app.config、Tomcat 的 server.xml、Android 的 res/values,这些到今天还在吃 XML。SOAP 信封、RSS 和 Atom 源也都是 XML。与其在两套格式之间来回手抄,不如把 YAML 当唯一源头,部署或发请求前转一次。这样你既保住了 YAML 干净 diff、能写注释的好处,又能产出老系统认的 XML。
key 变标签,嵌套变层级
这是最核心的一条规则:映射里的每个 key 直接变成 XML 元素名,值变成元素的内容。name: Toolora 就是 <name>Toolora</name>。
嵌套呢?YAML 靠缩进表示父子关系,XML 靠标签套标签。两者一一对应。一个映射嵌套一个映射,外层 key 就是父元素,内层 key 就是子元素,可以一直递归到任意深度。比如:
server:
host: localhost
port: 8080
转出来就是:
<server>
<host>localhost</host>
<port>8080</port>
</server>
子元素 host 和 port 自然嵌在 server 里。你写 YAML 时缩进多深,XML 就套多深。理解了这个映射,剩下的都是细节。
列表怎么处理
XML 没有数组类型,这是很多人第一次转换时踩的坑。YAML 里的序列(也就是用 - 开头的列表)在 XML 里靠把同一个元素重复一遍来表达。给定:
book:
- title: A
- title: B
key book 就是元素名,得到 <book><title>A</title></book><book><title>B</title></book>。同一个 <book> 出现两次,这正是 RSS 里 <item> 重复、Atom 里 <entry> 重复的标准写法。空列表会变成自闭合的 <book/>,不会留下歧义。
好处是这个过程能往返:如果你之后想把 XML 读回 YAML,XML 转 YAML 工具 会把同名的兄弟元素合并回一个列表,结构不丢。
属性:让 key 变成 @ 而不是元素
XML 有元素也有属性,YAML 只有 key-value,所以需要一个约定来区分。规则很简单:给 key 加上 @ 前缀,它就变成属性而不是子元素。在 YAML 里通常要把这种 key 用引号包起来:
book:
"@id": 7
title: X
产出 <book id="7"><title>X</title></book>。@id 挂成了 book 的属性,title 还是子元素。属性只能放标量,因为 XML 属性里不能嵌套标记,所以指向映射或列表的 @ key 会被跳过。
如果你既要属性又要文本内容,配一个 #text key:{"@name": app_title, "#text": Toolora} 得到 <string name="app_title">Toolora</string>。这正好是 Android 字符串资源的形状。还有一个容易忽略的点:每个值都会做 XML 转义,&、<、>、"、' 都转成对应实体,所以一个带 Tom & Jerry < cartoons 的值不会把文档搞坏,也不会留下注入口子。
根元素:XML 必须有且只有一个
一个合法的 XML 文档必须有且仅有一个根元素,YAML 没有这个限制。当你的 YAML 只有一个顶层 key 时,它会自动当根,note: hi 直接变 <note>hi</note>,你什么都不用管。
但当顶层有零个或两个以上 key、或者顶层本身是个列表时,工具会用你设的根元素名(默认 root)把内容整体包起来,保证输出能被解析。所以如果你的 YAML 有多个顶层 key,记得先把外层元素名想好,比如 beans 或 configuration,别留一个泛泛的 <root> 外壳。
想转完后顺手把 XML 排版对齐,可以再过一遍 XML 格式化工具,缩进和换行都会规整。需要在线即时转换的话,直接用 YAML 转 XML 工具,左边粘 YAML 右边出 XML,全程在浏览器本地跑,配置和密钥都不上传。
小结
YAML 转 XML 说到底就是四条映射:key 变标签、嵌套变层级、列表按条目重复、@ 前缀变属性加 #text 配文本。把这四条记牢,再加上自动转义和单根规则兜底,你就能放心地把易读的 YAML 喂给那些只认 XML 的老系统和 SOAP 接口,不用再像我当年那样为一个漏掉的闭合标签耗一下午。
Made by Toolora · Updated 2026-06-13