XML to YAML
Konvertera XML till YAML-format
XML Inmatning
YAML Utmatning
Vad är XML till YAML-konvertering?
XML till YAML-konvertering omvandlar data från Extensible Markup Language (XML) till YAML Ain't Markup Language (YAML). XML använder vinkelparentestaggar med attribut för att beskriva hierarkisk data, medan YAML representerar samma strukturer med indragning och klartext-nyckel-värdepar. Att konvertera XML till YAML online är en vanlig uppgift vid migrering av konfiguration från XML-tunga system som Java Spring, Maven eller .NET till plattformar som föredrar YAML, exempelvis Kubernetes, Ansible, GitHub Actions och Docker Compose.
De två formaten skiljer sig i sin datamodell. XML behandlar allt som text som standard och förlitar sig på schemadefinitioner (XSD, DTD) för typvalidering. YAML har inbyggda typer: strängar, heltal, flyttal, booleaner, null-värden, sekvenser (arrayer) och avbildningar (objekt). Under konverteringen kan värden som "true", "5432" och "3.14" tolkas som YAML-inbyggda typer istället för att förbli strängar. En noggrann konverterare citerar dessa värden för att bevara den ursprungliga textrepresentationen från XML-källan.
XML stöder även konstruktioner som saknar YAML-motsvarighet: attribut, namnrymder, bearbetningsinstruktioner, CDATA-avsnitt och kommentarer. Konverteringen måste välja en konvention för att representera attribut (vanligtvis understreck-prefixade nycklar som _attr) och bestämma om resterande konstruktioner ska kasseras eller plattas ut. Att förstå dessa avvägningar innan konvertering hjälper dig att välja rätt verktyg, konfigurera det korrekt och verifiera att YAML-utdata matchar den ursprungliga XML-avsikten.
<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=30Varför använda en online-konverterare för XML till YAML?
Att skriva ett konverteringsskript för hand innebär att hantera attributmappning, arraydetektering för upprepade element och YAML-typkoercions edge cases. En webbläsarbaserad konverterare hanterar allt detta i ett steg och låter dig inspektera YAML-utdata och kopiera den direkt till dina konfigurationsfiler.
Användningsfall för XML till YAML
XML till YAML-mappningsreferens
XML och YAML har olika datamodeller. Tabellen nedan visar hur varje XML-konstruktion mappas till sin YAML-motsvarighet. Attribut konverteras vanligtvis till understreck-prefixade nycklar och upprepade element blir YAML-sekvenser. Vissa konstruktioner som kommentarer och bearbetningsinstruktioner har ingen YAML-representation och kasseras under konverteringen.
| XML-konstruktion | XML-exempel | YAML-motsvarighet |
|---|---|---|
| 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: Skillnader i datamodell
Att konvertera mellan XML och YAML är inte ett enkelt syntaxbyte. Formaten har grundläggande strukturella skillnader som påverkar hur data representeras efter konverteringen.
Kodexempel
Nedan finns fungerande exempel för att konvertera XML till YAML i JavaScript, Python, Go och på kommandoraden. Varje exempel hanterar nästlade element, attribut och upprepade syskontaggar.
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
}