YAML to XML
YAML in XML-Format konvertieren
YAML-Eingabe
XML-Ausgabe
Was ist YAML-zu-XML-Konvertierung?
YAML-zu-XML-Konvertierung überführt Daten, die in YAML (YAML Ain't Markup Language) geschrieben sind, in XML (Extensible Markup Language). YAML verwendet Einrückung und minimale Interpunktion, um strukturierte Daten darzustellen, während XML öffnende und schließende Tags mit einer expliziten Hierarchie verwendet. Die Konvertierung zwischen beiden Formaten ist eine Routineaufgabe, wenn Systeme, die XML verarbeiten, Daten empfangen müssen, die ursprünglich in YAML erstellt wurden.
YAML wurde für die Lesbarkeit durch Menschen konzipiert. Konfigurationsdateien für Tools wie Kubernetes, Ansible, Docker Compose und GitHub Actions werden in YAML geschrieben, weil es kompakt und einfach von Hand zu bearbeiten ist. XML, definiert durch die W3C-XML-1.0-Spezifikation, ist seit Jahrzehnten das Standard-Datenaustauschformat in Unternehmenssystemen, SOAP-Webservices und dokumentenzentrierten Workflows. Wenn eine in YAML erstellte Konfiguration in eine XML-basierte Pipeline einfließen muss, ist eine Konvertierung erforderlich.
Die Zuordnung zwischen YAML und XML ist nicht eins zu eins. YAML unterstützt Datentypen wie Boolesche Werte, Integer, Floats und Null nativ, während XML alle Inhalte als Text behandelt, sofern kein Schema (XSD oder DTD) Typen extern definiert. YAML-Sequenzen (Listen) haben kein direktes XML-Äquivalent und müssen als wiederholte Elemente dargestellt werden. Wer diese Unterschiede kennt, kann die Ausgabe besser vorhersagen und unerwartete Ergebnisse vermeiden.
Warum diesen YAML-zu-XML-Konverter verwenden?
YAML manuell als XML neu zu schreiben ist mühsam und fehleranfällig — insbesondere bei tief verschachtelten Strukturen. Dieser Konverter erledigt die strukturelle Übersetzung sofort.
Anwendungsfälle für YAML zu XML
YAML-zu-XML-Typ-Mapping-Referenz
YAML-Datentypen lassen sich nicht direkt auf XML übertragen. Die Tabelle zeigt, wie jedes YAML-Konstrukt in sein XML-Äquivalent übersetzt wird. Das Verständnis dieser Regeln hilft, die Ausgabe vorherzusagen und unerwartete Ergebnisse zu beheben.
| YAML-Typ | YAML-Beispiel | XML-Ausgabe |
|---|---|---|
| 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: Formatunterschiede
YAML und XML lösen dasselbe Problem — strukturierte Datendarstellung — mit unterschiedlichen Kompromissen. Keines der Formate ist universell überlegen; die richtige Wahl hängt davon ab, wer oder was die Daten verarbeitet.
| Merkmal | YAML | XML |
|---|---|---|
| Syntax | Einrückungsbasiert | Tag-basiert (<tag>...</tag>) |
| Datentypen | Nativ (string, int, bool, null, float) | Nur Text (Schema fügt Typen hinzu) |
| Kommentare | # Inline-Kommentare | <!-- Block-Kommentare --> |
| Attribute | Keine native Unterstützung | Ja (<tag attr="val">) |
| Namensräume | Nicht unterstützt | Ja (xmlns:prefix) |
| Dateigröße | Kleiner (keine schließenden Tags) | Größer (ausführliche Tags) |
Code-Beispiele
Wie man YAML programmatisch in verschiedenen Sprachen und Umgebungen in XML konvertiert:
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>