تبدیل XML به YAML
تبدیل XML به YAML
ورودی XML
خروجی YAML
تبدیل XML به YAML چیست؟
تبدیل XML به YAML فرآیند تبدیل داده از Extensible Markup Language (XML) به YAML Ain't Markup Language (YAML) است. XML از تگهای زاویهای با ویژگیها برای توصیف دادههای سلسلهمراتبی استفاده میکند، در حالی که YAML همان ساختارها را از طریق تورفتگی و جفتهای کلید-مقدار متنی نمایش میدهد. تبدیل XML به YAML به صورت آنلاین یک کار رایج هنگام مهاجرت پیکربندی از سیستمهای XMLمحور مانند Java Spring، Maven یا .NET به پلتفرمهایی است که YAML را ترجیح میدهند، مانند Kubernetes، Ansible، GitHub Actions و Docker Compose.
این دو فرمت در مدلهای داده خود تفاوت دارند. XML همه چیز را به طور پیشفرض به عنوان متن در نظر میگیرد و برای اعمال نوع داده به تعریفهای طرحواره (XSD، DTD) متکی است. YAML دارای انواع بومی است: رشتهها، اعداد صحیح، اعشاری، بولینها، مقادیر تهی، دنبالهها (آرایهها) و نگاشتها (اشیاء). در طول تبدیل، مقادیری مانند «true»، «5432» و «3.14» میتوانند به عنوان انواع بومی YAML تفسیر شوند به جای اینکه رشته باقی بمانند. یک مبدل دقیق این مقادیر را نقلقول میکند تا نمایش متنی اصلی از منبع XML حفظ شود.
XML همچنین از ساختارهایی پشتیبانی میکند که معادل YAML ندارند: ویژگیها، فضاهای نام، دستورالعملهای پردازش، بخشهای CDATA و توضیحات. تبدیل باید یک قرارداد برای نمایش ویژگیها انتخاب کند (معمولاً کلیدهای دارای پیشوند زیرخط مانند _attr) و تصمیم بگیرد که آیا باقی موارد را دور بیاندازد یا مسطح کند. درک این مبادلات قبل از تبدیل به شما کمک میکند ابزار مناسب را انتخاب کنید، آن را به درستی پیکربندی کنید و تأیید کنید که خروجی YAML با هدف اصلی XML مطابقت دارد.
<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=30چرا از یک مبدل آنلاین XML به YAML استفاده کنیم؟
نوشتن یک اسکریپت تبدیل دستی به معنای مواجهه با نگاشت ویژگیها، تشخیص آرایه برای عناصر تکراری و موارد خاص تبدیل نوع YAML است. یک مبدل مبتنی بر مرورگر همه اینها را در یک مرحله انجام میدهد و به شما امکان میدهد خروجی YAML را بررسی کرده و مستقیماً در فایلهای پیکربندی خود کپی کنید.
موارد استفاده از تبدیل XML به YAML
مرجع نگاشت XML به YAML
XML و YAML مدلهای داده متفاوتی دارند. جدول زیر نشان میدهد هر ساختار XML چگونه به معادل YAML نگاشت میشود. ویژگیها معمولاً به کلیدهای دارای پیشوند زیرخط تبدیل میشوند و عناصر تکراری به دنبالههای YAML تبدیل میشوند. برخی ساختارها مانند توضیحات و دستورالعملهای پردازش معادلی در YAML ندارند و در طول تبدیل دور انداخته میشوند.
| ساختار XML | مثال XML | معادل 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 در مقابل YAML: تفاوتهای مدل داده
تبدیل بین XML و YAML یک تبادل ساده نحو نیست. این فرمتها تفاوتهای ساختاری بنیادی دارند که بر نحوه نمایش داده پس از تبدیل تأثیر میگذارند.
مثالهای کد
در ادامه مثالهای کاربردی برای تبدیل XML به YAML در JavaScript، Python، Go و خط فرمان آمده است. هر مثال عناصر تودرتو، ویژگیها و تگهای همرده تکراری را مدیریت میکند.
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
}