XML 转 YAML 转换器

将 XML 转换为 YAML 格式

加载示例

XML 输入

YAML 输出

本地运行 · 粘贴密钥安全无忧
YAML 将显示在此处…

什么是 XML 转 YAML?

XML 转 YAML 是将数据从可扩展标记语言(XML)转换为 YAML Ain't Markup Language(YAML)的过程。XML 使用尖括号标签和属性描述层级数据,而 YAML 通过缩进和纯文本键值对表示相同的结构。将 XML 在线转换为 YAML 是将配置从以 XML 为主的系统(如 Java Spring、Maven 或 .NET)迁移到偏好 YAML 的平台(如 Kubernetes、Ansible、GitHub Actions 和 Docker Compose)时的常见操作。

两种格式的数据模型存在差异。XML 默认将所有内容视为文本,依赖 schema 定义(XSD、DTD)进行类型约束。YAML 拥有原生类型:字符串、整数、浮点数、布尔值、空值、序列(数组)和映射(对象)。在转换过程中,"true"、"5432"、"3.14" 等值可能被解析为 YAML 原生类型,而非保持为字符串。谨慎的转换器会对这些值加引号,以保留原始 XML 中的文本表示。

XML 还支持一些在 YAML 中没有对应物的构造:属性、命名空间、处理指令、CDATA 节和注释。转换时必须为属性选择一种表示约定(通常是带下划线前缀的键,如 _attr),并决定其余构造是丢弃还是展平。在转换前理解这些权衡,有助于选择合适的工具、正确配置并验证 YAML 输出是否忠实还原了原始 XML 的含义。

XML input
<server>
  <host>db.example.com</host>
  <port>5432</port>
  <credentials admin="true">
    <username>deploy</username>
    <password>s3cret</password>
  </credentials>
  <options>
    <option>ssl=true</option>
    <option>timeout=30</option>
  </options>
</server>
YAML output
server:
  host: db.example.com
  port: "5432"
  credentials:
    _admin: "true"
    username: deploy
    password: s3cret
  options:
    option:
      - ssl=true
      - timeout=30

为什么使用在线 XML 转 YAML 转换器?

手动编写转换脚本需要处理属性映射、重复元素的数组检测以及 YAML 类型转换的边界情况。基于浏览器的转换器一步完成所有这些工作,让您直接检查 YAML 输出并将其复制到配置文件中。

即时转换
粘贴 XML 即可在毫秒内获得 YAML 输出。无需安装库,无需构建步骤,也无需维护脚本。
🔒
隐私优先处理
整个转换过程通过 JavaScript 在浏览器中完成。您的 XML 数据不会离开本机,也不会发送到任何服务器。
🔀
支持属性和数组
XML 属性映射为带前缀的键。重复的同级元素自动归组为 YAML 序列,完整保留列表结构。
📋
无需账号
打开页面,粘贴 XML,复制 YAML 结果即可。无需注册,无需 API 密钥,无使用限制。

XML 转 YAML 使用场景

前端开发
将旧式构建工具(Ant、Maven)中的 XML 配置片段转换为 YAML,用于 GitHub Actions 或 GitLab CI 等期望使用 YAML 配置文件的现代 CI 流水线。
后端工程
将 Spring XML Bean 定义迁移到 Spring Boot 的 application.yml 格式,或将 .NET app.config 节转换为 YAML 以用于容器部署。
DevOps 与基础设施
将基于 XML 的部署描述符(Tomcat server.xml、IIS web.config)转换为 YAML 等价形式,用于 Kubernetes 清单、Helm Chart 或 Ansible Playbook。
质量保证与测试
将 XML 测试固件或 JUnit 配置转换为 YAML,用于支持 YAML 数据源的测试框架,例如使用 YAML 固件的 pytest 或 Robot Framework。
数据工程
将企业系统(SAP、Oracle)导出的 XML 数据转换为 YAML,以便 dbt 或 Airflow 等使用基于 YAML 配置和 schema 的 ETL 工具摄取。
学习与文档编写
学员和技术文档作者可以粘贴 XML 示例,直观了解元素、属性和嵌套结构如何转化为 YAML 缩进、序列和映射。

XML 转 YAML 映射参考

XML 和 YAML 的数据模型不同。下表展示了每种 XML 构造如何映射为对应的 YAML。属性通常转换为带下划线前缀的键,重复元素变为 YAML 序列。注释和处理指令等构造在 YAML 中没有对应表示,转换时会被丢弃。

XML 构造XML 示例YAML 等价形式
Element<name>text</name>name: text
Nested elements<a><b>1</b></a>a:\n b: "1"
Attributes<el attr="v"/>el:\n _attr: v
Text + attributes<el a="1">text</el>el:\n _a: "1"\n _text: text
Repeated elements<r><i>1</i><i>2</i></r>r:\n i:\n - "1"\n - "2"
Empty element<el/>el: ""
CDATA<![CDATA[raw]]>Treated as plain text
Comments<!-- note -->Discarded (no YAML equivalent)
Namespacesxmlns:ns="uri"Prefix preserved or stripped
Boolean-like text<flag>true</flag>flag: "true" (quoted to stay string)

XML 与 YAML:数据模型差异

XML 与 YAML 之间的转换并非简单的语法替换。两种格式在数据表示方式上存在根本性的结构差异,这些差异会影响转换后的数据呈现。

类型系统
XML 将所有值存储为文本字符串。YAML 拥有原生布尔值、整数、浮点数和空值。转换时,"true" 或 "3306" 等值可能被解析为 YAML 布尔值或整数,除非转换器对其加引号。务必在输出中核查对类型敏感的值。
属性与键
XML 元素可以在子元素和文本内容之外携带属性。YAML 只有键值映射。属性必须转换为普通键,通常使用 _ 或 @ 前缀以区别于子元素键。
顺序与重复
XML 保留文档顺序,并允许同名同级元素出现多次。YAML 映射在规范层面是无序的(尽管大多数解析器保留插入顺序),且 YAML 1.2 中禁止重复键。重复的 XML 元素必须转换为 YAML 序列。

代码示例

以下是在 JavaScript、Python、Go 和命令行中将 XML 转换为 YAML 的可运行示例。每个示例均处理了嵌套元素、属性和重复同级标签。

JavaScript (Node.js)
import { parseStringPromise } from 'xml2js'
import YAML from 'yaml'

const xml = `
<config>
  <database host="localhost" port="5432">
    <name>mydb</name>
  </database>
  <features>
    <feature>auth</feature>
    <feature>logging</feature>
  </features>
</config>`

const obj = await parseStringPromise(xml, { explicitArray: false })
console.log(YAML.stringify(obj))
// → config:
// →   database:
// →     $:
// →       host: localhost
// →       port: "5432"
// →     name: mydb
// →   features:
// →     feature:
// →       - auth
// →       - logging
Python
import xmltodict
import yaml

xml = """
<server>
  <host>db.example.com</host>
  <port>5432</port>
  <replicas>
    <replica>node-1</replica>
    <replica>node-2</replica>
  </replicas>
</server>
"""

# Step 1: XML → Python dict
data = xmltodict.parse(xml)

# Step 2: Python dict → YAML
print(yaml.dump(data, default_flow_style=False))
# → server:
# →   host: db.example.com
# →   port: '5432'
# →   replicas:
# →     replica:
# →     - node-1
# →     - node-2

# With the standard library only (no xmltodict)
import xml.etree.ElementTree as ET

def elem_to_dict(elem):
    d = {}
    if elem.attrib:
        d.update({f"_{k}": v for k, v in elem.attrib.items()})
    for child in elem:
        val = elem_to_dict(child)
        if child.tag in d:
            if not isinstance(d[child.tag], list):
                d[child.tag] = [d[child.tag]]
            d[child.tag].append(val)
        else:
            d[child.tag] = val
    if elem.text and elem.text.strip():
        text = elem.text.strip()
        return text if not d else {**d, "_text": text}
    return d

root = ET.fromstring(xml)
print(yaml.dump({root.tag: elem_to_dict(root)}, default_flow_style=False))
CLI (xq + yq)
# xq is part of the yq package (pip install yq)
# It parses XML via xq and outputs JSON, then pipe to yq for YAML

echo '<config><host>localhost</host><port>8080</port></config>' | xq . | yq -y .
# → config:
# →   host: localhost
# →   port: "8080"

# Using xmlstarlet + yq (Go version: https://github.com/mikefarah/yq)
xmlstarlet sel -t -c '/' input.xml | yq -p=xml -o=yaml
# Reads XML from file and outputs YAML directly
Go
package main

import (
	"encoding/xml"
	"fmt"
	"strings"

	"gopkg.in/yaml.v3"
)

type Server struct {
	XMLName xml.Name `xml:"server"`
	Host    string   `xml:"host" yaml:"host"`
	Port    int      `xml:"port" yaml:"port"`
	Options []string `xml:"options>option" yaml:"options"`
}

func main() {
	data := `<server>
		<host>db.example.com</host>
		<port>5432</port>
		<options><option>ssl=true</option><option>timeout=30</option></options>
	</server>`

	var srv Server
	xml.NewDecoder(strings.NewReader(data)).Decode(&srv)

	out, _ := yaml.Marshal(srv)
	fmt.Println(string(out))
	// → host: db.example.com
	// → port: 5432
	// → options:
	// →   - ssl=true
	// →   - timeout=30
}

常见问题

XML 转 YAML 是无损转换吗?
不完全是。XML 属性、注释、处理指令和 CDATA 节在 YAML 中没有原生等价物。属性可以通过带前缀的键(_attr 或 @attr)保留,但注释和处理指令会被丢弃。如果需要回转为 XML,请验证属性和命名空间声明是否在转换中得以保留。
XML 属性在 YAML 中如何表示?
大多数转换器在属性名前添加下划线(_)或 @ 符号,以区分属性键与子元素键。例如,<server port="8080"> 转换为 server:\n _port: "8080"。具体前缀取决于所使用的库或工具。
转换过程中重复的 XML 元素如何处理?
当同一元素标签在一个父节点下出现多次时,转换器会将它们归组为 YAML 序列(列表)。例如,两个 <item> 同级元素变为 item:\n - value1\n - value2。单个 <item> 保持为标量值,除非启用了强制数组模式。
可以将 YAML 转回 XML 吗?
可以,但结果取决于原始转换对属性和类型的处理方式。如果属性通过带前缀的键保留,YAML 转 XML 工具可以将其还原。ToolDeck 提供 YAML 转 XML 工具用于反向转换。请注意,YAML 原生类型(布尔值、数字)在 XML 中将变为文本字符串。
为什么 YAML 输出中某些值被加了引号?
YAML 拥有原生类型:true/false 是布尔值,裸数字变为整数或浮点数,yes/no/on/off 在 YAML 1.1 中也是布尔值。如果您的 XML 包含 "true" 或 "3306" 等应保持为字符串的文本,转换器会对其加引号,防止 YAML 解析器重新解释该值。这是正确行为,而非错误。
如何处理大型 XML 文件?
浏览器端转换器适用于几兆字节以内的文件。对于更大的文件(10 MB 以上),请使用流式方案:用 Python 的 iterparse 或 Node.js 的 sax 增量解析 XML,构建中间对象后再序列化为 YAML。yq 等工具也可以直接从命令行将 XML 转换为 YAML,无需将整个文档加载到内存中。
XML 转 YAML 与 XML 转 JSON 有什么区别?
两种转换面临相同的挑战:将 XML 属性和重复元素映射到不同的数据模型。主要区别在于输出格式。JSON 格式严格(无注释、明确类型、严格语法),而 YAML 是 JSON 的超集,增加了对人友好的特性:注释、多行字符串、锚点和别名。当消费方是 API 或 JavaScript 运行时,选择 JSON;当消费方是需要手动编辑配置文件的人,选择 YAML。