YAML to XML
Konversi YAML ke format XML
Input YAML
Output XML
Apa itu Konversi YAML ke XML?
Konversi YAML ke XML mengubah data yang ditulis dalam YAML (YAML Ain't Markup Language) menjadi XML (Extensible Markup Language). YAML menggunakan indentasi dan tanda baca minimal untuk merepresentasikan data terstruktur, sementara XML menggunakan tag pembuka dan penutup dengan hierarki yang eksplisit. Mengonversi antara keduanya adalah tugas rutin ketika sistem yang menggunakan XML perlu menerima data yang awalnya ditulis dalam YAML.
YAML dirancang untuk keterbacaan manusia. File konfigurasi untuk alat seperti Kubernetes, Ansible, Docker Compose, dan GitHub Actions ditulis dalam YAML karena kompak dan mudah disunting secara manual. XML, yang didefinisikan oleh spesifikasi W3C XML 1.0, telah menjadi format pertukaran data default dalam sistem enterprise, layanan web SOAP, dan alur kerja berbasis dokumen selama beberapa dekade. Ketika konfigurasi yang ditulis dalam YAML harus masuk ke dalam pipeline berbasis XML, konversi diperlukan.
Pemetaan antara YAML dan XML tidak satu-satu. YAML mendukung tipe data seperti boolean, integer, float, dan null secara native, sementara XML memperlakukan semua konten sebagai teks kecuali jika skema (XSD atau DTD) mendefinisikan tipe secara eksternal. Urutan YAML (daftar) tidak memiliki padanan langsung dalam XML dan harus direpresentasikan sebagai elemen yang diulang. Memahami perbedaan ini membantu Anda memprediksi output dan menghindari kejutan.
Mengapa Menggunakan Konverter YAML ke XML Ini?
Menulis ulang YAML sebagai XML secara manual membosankan dan rawan kesalahan, terutama untuk struktur yang bersarang dalam. Konverter ini menangani translasi struktural secara instan.
Kasus Penggunaan YAML ke XML
Referensi Pemetaan Tipe YAML ke XML
Tipe data YAML tidak dipetakan langsung ke XML. Tabel ini menunjukkan bagaimana setiap konstruk YAML diterjemahkan ke padanan XML-nya. Memahami aturan ini membantu Anda memprediksi output dan memecahkan masalah hasil yang tidak terduga.
| Tipe YAML | Contoh YAML | Output XML |
|---|---|---|
| Mapping (key: value) | { name: Alice } | <name>Alice</name> |
| Sequence (- item) | - apple\n- banana | <item>apple</item><item>banana</item> |
| Nested mapping | user:\n name: Alice | <user><name>Alice</name></user> |
| Scalar (string) | greeting: hello world | <greeting>hello world</greeting> |
| Scalar (number) | count: 42 | <count>42</count> |
| Scalar (boolean) | active: true | <active>true</active> |
| Null | value: null | <value/> |
| Multiline string | bio: |\n Line one\n Line two | <bio>Line one\nLine two</bio> |
YAML vs XML: Perbedaan Format
YAML dan XML menyelesaikan masalah yang sama — representasi data terstruktur — dengan pertukaran yang berbeda. Tidak ada yang secara universal lebih baik; pilihan yang tepat bergantung pada siapa atau apa yang menggunakan data tersebut.
| Fitur | YAML | XML |
|---|---|---|
| Sintaks | Berbasis indentasi | Berbasis tag (<tag>...</tag>) |
| Tipe data | Native (string, int, bool, null, float) | Hanya teks (skema menambahkan tipe) |
| Komentar | # komentar inline | <!-- komentar blok --> |
| Atribut | Tidak ada dukungan native | Ya (<tag attr="val">) |
| Namespace | Tidak didukung | Ya (xmlns:prefix) |
| Ukuran file | Lebih kecil (tanpa tag penutup) | Lebih besar (tag verbose) |
Contoh Kode
Cara mengonversi YAML ke XML secara terprogram dalam berbagai bahasa dan lingkungan:
import { parseDocument } from 'yaml'
import { js2xml } from 'xml-js'
const yamlStr = `
server:
host: localhost
port: 8080
ssl: true
`
const data = parseDocument(yamlStr).toJSON()
const xml = js2xml({ root: data }, { compact: true, spaces: 2 })
console.log(xml)
// → <root>
// → <server>
// → <host>localhost</host>
// → <port>8080</port>
// → <ssl>true</ssl>
// → </server>
// → </root>import yaml
import xml.etree.ElementTree as ET
yaml_str = """
database:
host: db.example.com
port: 5432
credentials:
user: admin
password: secret
"""
data = yaml.safe_load(yaml_str)
def dict_to_xml(tag, d):
elem = ET.Element(tag)
for key, val in d.items():
child = ET.SubElement(elem, key)
if isinstance(val, dict):
child.extend(dict_to_xml(key, val))
elem.remove(child)
elem.append(dict_to_xml(key, val))
else:
child.text = str(val)
return elem
root = dict_to_xml('root', data)
ET.indent(root, space=' ')
print(ET.tostring(root, encoding='unicode'))
# → <root>
# → <database>
# → <host>db.example.com</host>
# → <port>5432</port>
# → ...
# → </database>
# → </root>package main
import (
"encoding/xml"
"fmt"
"gopkg.in/yaml.v3"
)
type Server struct {
XMLName xml.Name `xml:"server"`
Host string `yaml:"host" xml:"host"`
Port int `yaml:"port" xml:"port"`
SSL bool `yaml:"ssl" xml:"ssl"`
}
func main() {
yamlData := []byte("host: localhost\nport: 8080\nssl: true")
var s Server
yaml.Unmarshal(yamlData, &s)
xmlBytes, _ := xml.MarshalIndent(s, "", " ")
fmt.Println(xml.Header + string(xmlBytes))
// → <?xml version="1.0" encoding="UTF-8"?>
// → <server>
// → <host>localhost</host>
// → <port>8080</port>
// → <ssl>true</ssl>
// → </server>
}# Using yq (YAML processor) with xq (XML wrapper around jq) # Install: pip install yq # Convert YAML file to XML yq -x . config.yaml # → <host>localhost</host><port>8080</port> # Pipe inline YAML through conversion echo "name: Alice" | yq -x . # → <name>Alice</name>