XML to YAML
Konversi XML ke format YAML
Input XML
Output YAML
Apa itu Konversi XML ke YAML?
Konversi XML ke YAML adalah proses mengubah data dari Extensible Markup Language (XML) menjadi YAML Ain't Markup Language (YAML). XML menggunakan tag tanda kurung sudut dengan atribut untuk mendeskripsikan data hierarkis, sedangkan YAML merepresentasikan struktur yang sama melalui indentasi dan pasangan key-value berupa teks biasa. Mengonversi XML ke YAML secara online adalah tugas yang umum saat bermigrasi konfigurasi dari sistem berbasis XML seperti Java Spring, Maven, atau .NET ke platform yang lebih menyukai YAML, seperti Kubernetes, Ansible, GitHub Actions, dan Docker Compose.
Kedua format ini berbeda dalam model datanya. XML memperlakukan semua nilai sebagai teks secara default dan mengandalkan definisi skema (XSD, DTD) untuk penegakan tipe. YAML memiliki tipe asli: string, integer, float, boolean, null, sekuens (larik), dan pemetaan (objek). Selama konversi, nilai seperti "true", "5432", dan "3.14" dapat diinterpretasikan sebagai tipe asli YAML alih-alih tetap sebagai string. Konverter yang cermat akan mengutip nilai-nilai ini untuk mempertahankan representasi teks asli dari sumber XML.
XML juga mendukung konstruksi yang tidak memiliki padanan YAML: atribut, namespace, instruksi pemrosesan, bagian CDATA, dan komentar. Konversi harus memilih konvensi untuk merepresentasikan atribut (umumnya kunci berawalan garis bawah seperti _attr) dan memutuskan apakah akan membuang atau meratakan elemen lainnya. Memahami pertimbangan ini sebelum mengonversi membantu Anda memilih alat yang tepat, mengonfigurasinya dengan benar, dan memverifikasi bahwa output YAML sesuai dengan maksud XML asli.
<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=30Mengapa Menggunakan Konverter XML ke YAML Online?
Menulis skrip konversi secara manual berarti menangani pemetaan atribut, deteksi larik untuk elemen berulang, dan kasus tepi koersi tipe YAML. Konverter berbasis browser menangani semua itu dalam satu langkah, memungkinkan Anda memeriksa output YAML dan langsung menyalinnya ke dalam file konfigurasi.
Kasus Penggunaan XML ke YAML
Referensi Pemetaan XML ke YAML
XML dan YAML memiliki model data yang berbeda. Tabel di bawah menunjukkan bagaimana setiap konstruksi XML dipetakan ke padanan YAML-nya. Atribut umumnya dikonversi ke kunci berawalan garis bawah, dan elemen berulang menjadi sekuens YAML. Beberapa konstruksi seperti komentar dan instruksi pemrosesan tidak memiliki representasi YAML dan dibuang selama konversi.
| Konstruksi XML | Contoh XML | Padanan 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: Perbedaan Model Data
Mengonversi antara XML dan YAML bukan sekadar penggantian sintaks. Kedua format ini memiliki perbedaan struktural mendasar yang memengaruhi cara data direpresentasikan setelah konversi.
Contoh Kode
Berikut adalah contoh yang dapat digunakan untuk mengonversi XML ke YAML dalam JavaScript, Python, Go, dan baris perintah. Setiap contoh menangani elemen bersarang, atribut, dan tag saudara yang berulang.
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
}