YAML to XML
Конвертація YAML у формат XML
Введення YAML
Виведення XML
Що таке конвертація YAML у XML?
Конвертація YAML у XML — це перетворення даних, записаних у форматі YAML (YAML Ain't Markup Language), у формат XML (Extensible Markup Language). YAML використовує відступи та мінімальну пунктуацію для представлення структурованих даних, тоді як XML описує ту саму ієрархію за допомогою відкривальних і закривальних тегів. Конвертація між цими форматами є рутинним завданням, коли системи, що споживають XML, мають отримати дані, спочатку написані у YAML.
YAML розроблено для зручності читання людиною. Конфігураційні файли таких інструментів, як Kubernetes, Ansible, Docker Compose та GitHub Actions, написані у YAML, оскільки він компактний і зручний для редагування вручну. XML, визначений специфікацією W3C XML 1.0, десятиліттями залишається стандартним форматом обміну даними в корпоративних системах, SOAP-вебсервісах та документо-орієнтованих процесах. Коли конфігурацію, написану у YAML, необхідно передати в XML-орієнтований пайплайн, конвертація є обов'язковою.
Відповідність між YAML і XML не є взаємно однозначною. YAML нативно підтримує типи даних: булеві значення, цілі числа, числа з рухомою комою та null, тоді як XML трактує весь вміст як текст, якщо схема (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>) |
| Типи даних | Нативні (string, int, bool, null, float) | Лише текст (типи додає схема) |
| Коментарі | # вбудовані коментарі | <!-- блокові коментарі --> |
| Атрибути | Нативна підтримка відсутня | Так (<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>