XML na YAML
Konwertuj XML do formatu YAML
Wejście XML
Wyjście YAML
Czym jest konwersja XML na YAML?
Konwersja XML na YAML to przekształcanie danych z formatu Extensible Markup Language (XML) do YAML Ain't Markup Language (YAML). XML używa tagów w nawiasach ostrych z atrybutami do opisywania danych hierarchicznych, natomiast YAML reprezentuje te same struktury za pomocą wcięć i par klucz-wartość w postaci zwykłego tekstu. Konwersja XML na YAML online to częste zadanie przy migracji konfiguracji z systemów opartych na XML, takich jak Java Spring, Maven czy .NET, do platform preferujących YAML — Kubernetes, Ansible, GitHub Actions i Docker Compose.
Oba formaty różnią się modelami danych. XML traktuje wszystko domyślnie jako tekst i polega na definicjach schematu (XSD, DTD) w celu wymuszania typów. YAML ma typy natywne: łańcuchy znaków, liczby całkowite, liczby zmiennoprzecinkowe, wartości logiczne, wartości null, sekwencje (tablice) i odwzorowania (obiekty). Podczas konwersji wartości takie jak "true", "5432" czy "3.14" mogą być interpretowane jako typy natywne YAML zamiast pozostawać łańcuchami znaków. Staranny konwerter cytuje te wartości, aby zachować oryginalną reprezentację tekstową ze źródłowego XML.
XML obsługuje też konstrukcje niemające odpowiednika w YAML: atrybuty, przestrzenie nazw, instrukcje przetwarzania, sekcje CDATA i komentarze. Konwersja musi przyjąć konwencję reprezentowania atrybutów (zazwyczaj klucze z prefiksem podkreślenia, np. _attr) i zdecydować, czy pozostałe elementy odrzucić, czy spłaszczyć. Zrozumienie tych kompromisów przed konwersją pomaga wybrać właściwe narzędzie, skonfigurować je poprawnie i zweryfikować, czy wyjście YAML odpowiada zamierzeniu oryginalnego 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=30Dlaczego warto używać internetowego konwertera XML na YAML?
Pisanie skryptu konwersji od podstaw oznacza ręczne obsługiwanie mapowania atrybutów, wykrywania tablic dla powtarzających się elementów oraz specyficznych przypadków konwersji typów YAML. Konwerter działający w przeglądarce obsługuje to wszystko jednym krokiem, pozwalając na natychmiastowe sprawdzenie wyjścia YAML i skopiowanie go do pliku konfiguracyjnego.
Zastosowania konwertera XML na YAML
Tabela odwzorowania XML na YAML
XML i YAML mają różne modele danych. Poniższa tabela pokazuje, jak każda konstrukcja XML mapuje się na odpowiednik YAML. Atrybuty są zazwyczaj konwertowane na klucze z prefiksem podkreślenia, a powtarzające się elementy stają się sekwencjami YAML. Niektóre konstrukcje, takie jak komentarze i instrukcje przetwarzania, nie mają reprezentacji w YAML i są odrzucane podczas konwersji.
| Konstrukcja XML | Przykład XML | Odpowiednik 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: różnice modeli danych
Konwersja między XML a YAML to nie tylko zamiana składni. Formaty te mają fundamentalne różnice strukturalne wpływające na sposób reprezentowania danych po konwersji.
Przykłady kodu
Poniżej znajdują się działające przykłady konwersji XML na YAML w JavaScript, Python, Go i wierszu poleceń. Każdy przykład obsługuje zagnieżdżone elementy, atrybuty i powtarzające się tagi rodzeństwa.
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
}