YAML转XML转换器
将YAML转换为XML格式
YAML输入
XML输出
什么是 YAML 转 XML?
YAML 转 XML 是将以 YAML(YAML Ain't Markup Language)编写的数据转换为 XML(可扩展标记语言)的过程。YAML 通过缩进和最少的标点符号表示结构化数据,而 XML 则使用开闭标签构建明确的层级结构。当需要消费 XML 的系统接收最初以 YAML 编写的数据时,格式转换便成为必要的操作。
YAML 的设计目标是人类可读性。Kubernetes、Ansible、Docker Compose 和 GitHub Actions 等工具的配置文件均采用 YAML 编写,因为它简洁且便于手动编辑。XML 由 W3C XML 1.0 规范定义,数十年来一直是企业系统、SOAP Web 服务和以文档为中心的工作流中的默认数据交换格式。当 YAML 编写的配置需要接入基于 XML 的流水线时,转换就不可避免。
YAML 与 XML 之间的映射并非一一对应。YAML 原生支持布尔值、整数、浮点数和空值等数据类型,而 XML 将所有内容视为文本,除非通过外部 schema(XSD 或 DTD)定义类型。YAML 序列(列表)在 XML 中没有直接对应物,必须表示为重复的同名元素。了解这些差异有助于预判输出结果,避免意外情况。
为什么使用这款 YAML 转 XML 转换器?
手动将 YAML 改写为 XML 既繁琐又容易出错,尤其是对于深度嵌套的结构。这款转换器能即时完成结构转换。
YAML 转 XML 使用场景
YAML 转 XML 类型映射参考
YAML 数据类型与 XML 并非直接对应。下表展示了每种 YAML 构造如何转换为对应的 XML 形式。了解这些规则有助于预判输出结果并排查意外情况。
| YAML 类型 | YAML 示例 | XML 输出 |
|---|---|---|
| Mapping (key: value) | { name: Alice } | <name>Alice</name> |
| Sequence (- item) | - apple\n- banana | <item>apple</item><item>banana</item> |
| Nested mapping | user:\n name: Alice | <user><name>Alice</name></user> |
| Scalar (string) | greeting: hello world | <greeting>hello world</greeting> |
| Scalar (number) | count: 42 | <count>42</count> |
| Scalar (boolean) | active: true | <active>true</active> |
| Null | value: null | <value/> |
| Multiline string | bio: |\n Line one\n Line two | <bio>Line one\nLine two</bio> |
YAML 与 XML:格式差异对比
YAML 和 XML 解决同一个问题——结构化数据表示——但各有不同的权衡取舍。两者并无优劣之分,正确的选择取决于数据的消费方式。
| 特性 | YAML | XML |
|---|---|---|
| 语法 | 基于缩进 | 基于标签(<tag>...</tag>) |
| 数据类型 | 原生类型(字符串、整数、布尔值、空值、浮点数) | 仅文本(schema 添加类型) |
| 注释 | # 行内注释 | <!-- 块注释 --> |
| 属性 | 不原生支持 | 支持(<tag attr="val">) |
| 命名空间 | 不支持 | 支持(xmlns:prefix) |
| 文件大小 | 较小(无闭合标签) | 较大(标签冗长) |
代码示例
如何在不同语言和环境中以编程方式将 YAML 转换为 XML:
import { parseDocument } from 'yaml'
import { js2xml } from 'xml-js'
const yamlStr = `
server:
host: localhost
port: 8080
ssl: true
`
const data = parseDocument(yamlStr).toJSON()
const xml = js2xml({ root: data }, { compact: true, spaces: 2 })
console.log(xml)
// → <root>
// → <server>
// → <host>localhost</host>
// → <port>8080</port>
// → <ssl>true</ssl>
// → </server>
// → </root>import yaml
import xml.etree.ElementTree as ET
yaml_str = """
database:
host: db.example.com
port: 5432
credentials:
user: admin
password: secret
"""
data = yaml.safe_load(yaml_str)
def dict_to_xml(tag, d):
elem = ET.Element(tag)
for key, val in d.items():
child = ET.SubElement(elem, key)
if isinstance(val, dict):
child.extend(dict_to_xml(key, val))
elem.remove(child)
elem.append(dict_to_xml(key, val))
else:
child.text = str(val)
return elem
root = dict_to_xml('root', data)
ET.indent(root, space=' ')
print(ET.tostring(root, encoding='unicode'))
# → <root>
# → <database>
# → <host>db.example.com</host>
# → <port>5432</port>
# → ...
# → </database>
# → </root>package main
import (
"encoding/xml"
"fmt"
"gopkg.in/yaml.v3"
)
type Server struct {
XMLName xml.Name `xml:"server"`
Host string `yaml:"host" xml:"host"`
Port int `yaml:"port" xml:"port"`
SSL bool `yaml:"ssl" xml:"ssl"`
}
func main() {
yamlData := []byte("host: localhost\nport: 8080\nssl: true")
var s Server
yaml.Unmarshal(yamlData, &s)
xmlBytes, _ := xml.MarshalIndent(s, "", " ")
fmt.Println(xml.Header + string(xmlBytes))
// → <?xml version="1.0" encoding="UTF-8"?>
// → <server>
// → <host>localhost</host>
// → <port>8080</port>
// → <ssl>true</ssl>
// → </server>
}# Using yq (YAML processor) with xq (XML wrapper around jq) # Install: pip install yq # Convert YAML file to XML yq -x . config.yaml # → <host>localhost</host><port>8080</port> # Pipe inline YAML through conversion echo "name: Alice" | yq -x . # → <name>Alice</name>