XML'den YAML'a
XML'yi YAML biçimine dönüştür
XML Girdisi
YAML Çıktısı
XML'den YAML'a Dönüşüm Nedir?
XML'den YAML'a dönüşüm, verilerin Genişletilebilir İşaretleme Dili (XML) biçiminden YAML Ain't Markup Language (YAML) biçimine dönüştürülmesi işlemidir. XML, hiyerarşik verileri öznitelikli açılı ayraç etiketleriyle tanımlarken YAML aynı yapıları girinti ve düz metin anahtar-değer çiftleriyle temsil eder. XML'yi çevrimiçi olarak YAML'a dönüştürmek, Java Spring, Maven veya .NET gibi XML ağırlıklı sistemlerden Kubernetes, Ansible, GitHub Actions ve Docker Compose gibi YAML tercih eden platformlara yapılandırma taşırken sık başvurulan bir adımdır.
İki biçim veri modelleri bakımından farklılık gösterir. XML varsayılan olarak her şeyi metin olarak ele alır ve tür zorunluluğu için şema tanımlarına (XSD, DTD) dayanır. YAML ise yerel türlere sahiptir: dizeler, tam sayılar, kayan noktalılar, mantıksal değerler, null'lar, diziler ve eşlemeler. Dönüşüm sırasında "true", "5432" ve "3.14" gibi değerler, XML kaynağındaki özgün metin temsili korunmak yerine YAML yerel türleri olarak yorumlanabilir. Dikkatli bir dönüştürücü bu değerleri tırnak içine alarak özgün metni korur.
XML'in YAML'da karşılığı bulunmayan yapıları da vardır: öznitelikler, ad alanları, işleme talimatları, CDATA bölümleri ve yorumlar. Dönüşüm, öznitelikleri temsil etmek için bir kural seçmeli (genellikle _attr gibi alt çizgi önekli anahtarlar) ve diğerlerini atmayı ya da düzleştirmeyi kararlaştırmalıdır. Bu değiş tokuşları dönüşümden önce anlamak, doğru aracı seçmenize, yapılandırmanıza ve YAML çıktısının özgün XML amacıyla örtüşüp örtüşmediğini doğrulamanıza yardımcı olur.
<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=30Neden Çevrimiçi XML'den YAML'a Dönüştürücü Kullanmalısınız?
Elle dönüşüm betiği yazmak, öznitelik eşlemesi, tekrarlayan öğelerde dizi algılama ve YAML tür dönüşümü uç durumlarıyla uğraşmak anlamına gelir. Tarayıcı tabanlı bir dönüştürücü tüm bunları tek adımda halleder; YAML çıktısını inceleyip doğrudan yapılandırma dosyalarınıza kopyalayabilirsiniz.
XML'den YAML'a Dönüşüm Kullanım Senaryoları
XML'den YAML'a Eşleme Başvurusu
XML ve YAML farklı veri modellerine sahiptir. Aşağıdaki tablo, her XML yapısının YAML karşılığına nasıl eşlendiğini gösterir. Öznitelikler genellikle alt çizgi önekli anahtarlara dönüştürülür, tekrarlayan öğeler ise YAML dizisi haline gelir. Yorumlar ve işleme talimatları gibi bazı yapıların YAML karşılığı yoktur ve dönüşüm sırasında atılır.
| XML Yapısı | XML Örneği | YAML Karşılığı |
|---|---|---|
| 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 ile YAML: Veri Modeli Farklılıkları
XML ile YAML arasında dönüşüm yapmak, basit bir sözdizimi değişikliği değildir. Bu biçimler, dönüşümden sonra verilerin nasıl temsil edileceğini etkileyen temel yapısal farklılıklara sahiptir.
Kod Örnekleri
Aşağıda JavaScript, Python, Go ve komut satırında XML'den YAML'a dönüşüm için çalışan örnekler bulunmaktadır. Her örnek iç içe öğeleri, öznitelikleri ve tekrarlayan kardeş etiketleri işlemektedir.
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
}