XML to YAML
Преобразует XML в формат YAML
Входные данные XML
Выходные данные YAML
Что такое преобразование XML в YAML?
Преобразование XML в YAML — это процесс трансформации данных из формата Extensible Markup Language (XML) в YAML Ain't Markup Language (YAML). XML использует теги в угловых скобках с атрибутами для описания иерархических данных, тогда как YAML представляет те же структуры через отступы и пары ключ-значение в виде обычного текста. Преобразование XML в YAML онлайн — распространённая задача при переходе конфигурации с XML-ориентированных систем — Java Spring, Maven, .NET — на платформы, предпочитающие YAML: Kubernetes, Ansible, GitHub Actions и Docker Compose.
Два формата различаются моделями данных. XML по умолчанию трактует всё как текст и опирается на определения схем (XSD, DTD) для проверки типов. YAML имеет нативные типы: строки, целые числа, числа с плавающей точкой, булевы значения, null, последовательности (массивы) и отображения (объекты). При конвертации значения вроде "true", "5432" и "3.14" могут интерпретироваться как нативные типы YAML вместо того, чтобы оставаться строками. Аккуратный конвертер берёт такие значения в кавычки, чтобы сохранить исходное текстовое представление из XML-источника.
В XML также есть конструкции, не имеющие аналога в YAML: атрибуты, пространства имён, инструкции по обработке, секции CDATA и комментарии. При конвертации необходимо выбрать соглашение для представления атрибутов (как правило, ключи с префиксом-подчёркиванием, например _attr) и решить, что делать с остальным — отбрасывать или преобразовывать. Понимание этих компромиссов до начала конвертации помогает выбрать подходящий инструмент, правильно его настроить и убедиться, что YAML-вывод соответствует исходному смыслу XML.
<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>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
Справочник по сопоставлению 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) |
| Namespaces | xmlns:ns="uri" | Prefix preserved or stripped |
| Boolean-like text | <flag>true</flag> | flag: "true" (quoted to stay string) |
XML и YAML: различия моделей данных
Преобразование между XML и YAML — это не просто смена синтаксиса. Форматы имеют принципиальные структурные различия, которые влияют на представление данных после конвертации.
Примеры кода
Ниже приведены рабочие примеры преобразования XML в YAML на JavaScript, Python, Go и в командной строке. Каждый пример обрабатывает вложенные элементы, атрибуты и повторяющиеся соседние теги.
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
// → - loggingimport 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))# 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
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
}