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 |
|---|---|---|
| Синтаксис | На основе отступов | Теговый (<тег>...</тег>) |
| Типы данных | Нативные (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>