XML to YAML
XML naar YAML-formaat converteren
XML-invoer
YAML-uitvoer
Wat is XML naar YAML-conversie?
XML naar YAML-conversie zet gegevens om van Extensible Markup Language (XML) naar YAML Ain't Markup Language (YAML). XML gebruikt tags met puntige haken en attributen om hiërarchische gegevens te beschrijven, terwijl YAML dezelfde structuren weergeeft via inspringing en eenvoudige sleutel-waardeparen in platte tekst. XML naar YAML online converteren is een veelvoorkomende taak bij het migreren van configuratie uit XML-zware systemen zoals Java Spring, Maven of .NET naar platforms die de voorkeur geven aan YAML, zoals Kubernetes, Ansible, GitHub Actions en Docker Compose.
De twee formaten verschillen in hun gegevensmodel. XML behandelt alles standaard als tekst en vertrouwt op schemadefinities (XSD, DTD) voor typehandhaving. YAML heeft native typen: tekenreeksen, gehele getallen, kommagetallen, booleans, nullwaarden, reeksen (arrays) en afbeeldingen (objecten). Tijdens de conversie kunnen waarden zoals "true", "5432" en "3.14" worden geïnterpreteerd als YAML native typen in plaats van als tekenreeksen te blijven. Een zorgvuldige converter plaatst deze waarden tussen aanhalingstekens om de oorspronkelijke tekstrepresentatie uit de XML-bron te bewaren.
XML ondersteunt ook constructies zonder YAML-equivalent: attributen, naamruimten, verwerkingsinstructies, CDATA-secties en opmerkingen. De conversie moet een conventie kiezen voor het weergeven van attributen (doorgaans sleutels met een onderstrepingsteken als voorvoegsel, zoals _attr) en beslissen of de overige constructies worden weggegooid of afgevlakt. Inzicht in deze afwegingen vóór de conversie helpt u de juiste tool te kiezen, deze correct te configureren en te verifiëren dat de YAML-uitvoer overeenkomt met de oorspronkelijke XML-bedoeling.
<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=30Waarom een online XML naar YAML-converter gebruiken?
Een conversiescript met de hand schrijven betekent omgaan met attribuutmapping, arraydetectie voor herhaalde elementen en rand gevallen bij YAML-typeconversie. Een browsergebaseerde converter verwerkt dit alles in één stap, zodat u de YAML-uitvoer kunt inspecteren en direct in uw configuratiebestanden kunt kopiëren.
Toepassingen van XML naar YAML-conversie
XML naar YAML-toewijzingsreferentie
XML en YAML hebben verschillende gegevensmodellen. De tabel hieronder toont hoe elke XML-constructie overeenkomt met een YAML-equivalent. Attributen worden doorgaans omgezet naar sleutels met onderstrepingsteken als voorvoegsel, en herhaalde elementen worden YAML-reeksen. Sommige constructies zoals opmerkingen en verwerkingsinstructies hebben geen YAML-representatie en worden tijdens de conversie weggegooid.
| XML-constructie | XML-voorbeeld | YAML-equivalent |
|---|---|---|
| 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 versus YAML: verschillen in gegevensmodel
Converteren tussen XML en YAML is geen eenvoudige syntaxwissel. De formaten hebben fundamentele structurele verschillen die van invloed zijn op de weergave van gegevens na de conversie.
Codevoorbeelden
Hieronder staan werkende voorbeelden voor het converteren van XML naar YAML in JavaScript, Python, Go en op de opdrachtregel. Elk voorbeeld verwerkt geneste elementen, attributen en herhaalde nevenliggende tags.
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
}