XML to YAML
Převeďte XML do formátu YAML
XML Vstup
YAML Výstup
Co je převod XML na YAML?
Převod XML na YAML je proces transformace dat z Extensible Markup Language (XML) do formátu YAML Ain't Markup Language (YAML). XML používá značky s úhlovými závorkami a atributy k popisu hierarchických dat, zatímco YAML reprezentuje stejné struktury prostřednictvím odsazení a párů klíč–hodnota v prostém textu. Převod XML na YAML online je běžným úkolem při migraci konfigurace ze systémů silně využívajících XML — jako Java Spring, Maven nebo .NET — na platformy upřednostňující YAML, například Kubernetes, Ansible, GitHub Actions a Docker Compose.
Oba formáty se liší svými datovými modely. XML standardně zpracovává vše jako text a pro vynucení typů spoléhá na definice schémat (XSD, DTD). YAML má nativní typy: řetězce, celá čísla, čísla s plovoucí desetinnou čárkou, booleovské hodnoty, null, sekvence (pole) a mapování (objekty). Při převodu mohou být hodnoty jako "true", "5432" nebo "3.14" interpretovány jako nativní typy YAML namísto zachování jako řetězce. Pečlivý převodník tyto hodnoty uzavírá do uvozovek, aby zachoval původní textovou reprezentaci ze zdroje XML.
XML také podporuje konstrukty, které nemají v YAML ekvivalent: atributy, jmenné prostory, zpracovatelské instrukce, sekce CDATA a komentáře. Při převodu je nutné zvolit konvenci pro reprezentaci atributů (nejčastěji klíče s předponou podtržítka, například _attr) a rozhodnout, zda ostatní konstrukty zahrnout nebo zploštit. Pochopení těchto kompromisů před samotným převodem vám pomůže vybrat správný nástroj, správně ho nakonfigurovat a ověřit, že výstup YAML odpovídá původnímu záměru 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=30Proč použít online převodník XML na YAML?
Psaní převodního skriptu ručně znamená řešit mapování atributů, detekci polí u opakujících se prvků a hraniční případy typové konverze v YAML. Převodník v prohlížeči zvládne vše najednou a umožní vám zkontrolovat výstup YAML a zkopírovat ho přímo do konfiguračních souborů.
Případy použití převodníku XML na YAML
Referenční tabulka mapování XML na YAML
XML a YAML mají odlišné datové modely. Tabulka níže ukazuje, jak se každý konstrukt XML mapuje na ekvivalent v YAML. Atributy jsou typicky převáděny na klíče s předponou podtržítka a opakující se prvky se stávají sekvencemi YAML. Některé konstrukty, například komentáře a zpracovatelské instrukce, nemají v YAML reprezentaci a při převodu jsou zahozeny.
| Konstrukt XML | Příklad XML | Ekvivalent 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 vs YAML: rozdíly datových modelů
Převod mezi XML a YAML není pouhá záměna syntaxe. Formáty mají zásadní strukturální rozdíly, které ovlivňují způsob reprezentace dat po převodu.
Ukázky kódu
Níže jsou funkční příklady pro převod XML na YAML v JavaScriptu, Pythonu, Go a na příkazovém řádku. Každý příklad zpracovává vnořené prvky, atributy a opakující se sourozenecké značky.
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
}