YAML na XML
Konwertuj YAML do formatu XML
Wejście YAML
Wyjście XML
Czym jest konwersja YAML na XML?
Konwersja YAML na XML to przekształcanie danych zapisanych w formacie YAML (YAML Ain't Markup Language) do formatu XML (Extensible Markup Language). YAML używa wcięć i minimalnej interpunkcji do reprezentowania danych strukturalnych, natomiast XML stosuje tagi otwierające i zamykające z jawną hierarchią. Konwersja między tymi formatami to rutynowe zadanie, gdy systemy korzystające z XML muszą odbierać dane pierwotnie napisane w YAML.
YAML został zaprojektowany z myślą o czytelności dla człowieka. Pliki konfiguracyjne narzędzi takich jak Kubernetes, Ansible, Docker Compose i GitHub Actions są pisane w YAML, ponieważ jest on zwarty i łatwy do ręcznej edycji. XML, zdefiniowany przez specyfikację W3C XML 1.0, przez dekady był domyślnym formatem wymiany danych w systemach korporacyjnych, usługach sieciowych SOAP i procesach pracy zorientowanych na dokumenty. Gdy konfiguracja napisana w YAML musi zasilić potok oparty na XML, wymagana jest konwersja.
Odwzorowanie między YAML a XML nie jest wzajemnie jednoznaczne. YAML natywnie obsługuje typy danych takie jak wartości logiczne, liczby całkowite, liczby zmiennoprzecinkowe i wartość null, podczas gdy XML traktuje całą zawartość jako tekst, chyba że schemat (XSD lub DTD) definiuje typy zewnętrznie. Sekwencje YAML (listy) nie mają bezpośredniego odpowiednika w XML i muszą być reprezentowane jako powtarzające się elementy. Znajomość tych różnic pomaga przewidzieć wynik i uniknąć niespodzianek.
Dlaczego warto używać tego konwertera YAML na XML?
Ręczne przepisywanie YAML jako XML jest żmudne i podatne na błędy, zwłaszcza w przypadku głęboko zagnieżdżonych struktur. Ten konwerter obsługuje tłumaczenie strukturalne natychmiastowo.
Zastosowania konwertera YAML na XML
Tabela odwzorowania typów YAML na XML
Typy danych YAML nie mapują się bezpośrednio na XML. Ta tabela pokazuje, jak każda konstrukcja YAML przekłada się na odpowiednik XML. Znajomość tych zasad pomaga przewidzieć wynik i rozwiązywać problemy z nieoczekiwanymi rezultatami.
| Typ YAML | Przykład YAML | Wyjście 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 vs XML: różnice między formatami
YAML i XML rozwiązują ten sam problem — reprezentację danych strukturalnych — z różnymi kompromisami. Żaden z nich nie jest uniwersalnie lepszy; właściwy wybór zależy od tego, kto lub co przetwarza dane.
| Cecha | YAML | XML |
|---|---|---|
| Składnia | Oparta na wcięciach | Oparta na tagach (<tag>...</tag>) |
| Typy danych | Natywne (string, int, bool, null, float) | Tylko tekst (schemat dodaje typy) |
| Komentarze | # komentarze inline | <!-- komentarze blokowe --> |
| Atrybuty | Brak natywnego wsparcia | Tak (<tag attr="val">) |
| Przestrzenie nazw | Nieobsługiwane | Tak (xmlns:prefix) |
| Rozmiar pliku | Mniejszy (bez tagów zamykających) | Większy (tagi szczegółowe) |
Przykłady kodu
Jak programowo konwertować YAML na XML w różnych językach i środowiskach:
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>