YAML'dan XML'e
YAML'ı XML biçimine dönüştür
YAML Girdisi
XML Çıktısı
YAML'dan XML'e Dönüşüm Nedir?
YAML'dan XML'e dönüşüm, YAML (YAML Ain't Markup Language) biçiminde yazılmış verileri XML (Extensible Markup Language) biçimine dönüştürür. YAML, yapılandırılmış verileri girintileme ve minimal noktalama ile temsil ederken XML, açık bir hiyerarşiyle açılış ve kapanış etiketleri kullanır. İki biçim arasında dönüşüm yapmak, XML tüketen sistemlerin özünde YAML ile yazılmış verileri alması gerektiğinde sık karşılaşılan bir görevdir.
YAML insan tarafından okunabilirlik için tasarlanmıştır. Kubernetes, Ansible, Docker Compose ve GitHub Actions gibi araçların yapılandırma dosyaları; kompakt yapısı ve elle düzenleme kolaylığı nedeniyle YAML ile yazılır. W3C XML 1.0 spesifikasyonuyla tanımlanan XML ise onlarca yıldır kurumsal sistemlerde, SOAP web servislerinde ve belge odaklı iş akışlarında standart veri alışverişi biçimi olmuştur. YAML ile yazılmış bir yapılandırmanın XML tabanlı bir ardışık düzene (pipeline) beslenmesi gerektiğinde dönüşüm kaçınılmazdır.
YAML ile XML arasındaki eşleme birebir değildir. YAML; boolean, tam sayı, ondalıklı sayı ve null gibi veri türlerini yerel olarak desteklerken XML, bir şema (XSD veya DTD) harici olarak tür tanımlamadıkça tüm içeriği metin olarak ele alır. YAML dizilerinin (listelerin) XML'de doğrudan karşılığı yoktur; bunlar yinelenen öğeler olarak temsil edilmek zorundadır. Bu farkları bilmek, çıktıyı öngörmenizi ve sürprizlerden kaçınmanızı sağlar.
Neden Bu YAML'dan XML'e Dönüştürücüyü Kullanmalısınız?
YAML'ı elle XML olarak yeniden yazmak, özellikle derin iç içe geçmiş yapılarda, sıkıcı ve hataya açıktır. Bu dönüştürücü yapısal çeviriyi anında gerçekleştirir.
YAML'dan XML'e Kullanım Senaryoları
YAML'dan XML'e Tür Eşleme Başvurusu
YAML veri türleri XML'e doğrudan eşlenmez. Bu tablo, her YAML yapısının XML karşılığına nasıl çevrildiğini gösterir. Bu kuralları anlamak, çıktıyı öngörmenize ve beklenmeyen sonuçları gidermenize yardımcı olur.
| YAML Türü | YAML Örneği | XML Çıktısı |
|---|---|---|
| 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 ile XML: Biçim Farklılıkları
YAML ve XML aynı sorunu — yapılandırılmış veri temsili — farklı değiş tokuşlarla çözer. Hiçbiri her durumda daha iyi değildir; doğru seçim, verinin kim ya da ne tarafından tüketildiğine bağlıdır.
| Özellik | YAML | XML |
|---|---|---|
| Sözdizimi | Girinti tabanlı | Etiket tabanlı (<etiket>...</etiket>) |
| Veri türleri | Yerel (string, int, bool, null, float) | Yalnızca metin (şema türleri ekler) |
| Yorumlar | # satır içi yorumlar | <!-- blok yorumlar --> |
| Öznitelikler | Yerel destek yok | Var (<etiket öznitelik="değer">) |
| Ad alanları | Desteklenmiyor | Var (xmlns:önek) |
| Dosya boyutu | Küçük (kapanış etiketi yok) | Büyük (ayrıntılı etiketler) |
Kod Örnekleri
Farklı dil ve ortamlarda YAML'ı XML'e programatik olarak dönüştürme:
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>