ToolDeck

تبدیل XML به YAML

تبدیل XML به YAML

یک مثال امتحان کنید

ورودی XML

خروجی YAML

به‌صورت محلی اجرا می‌شود · جای‌گذاری اسرار امن است
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 مطابقت دارد.

XML input
<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>
YAML output
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 را در چند میلی‌ثانیه دریافت کنید. بدون نصب کتابخانه، بدون مرحله ساخت، بدون اسکریپتی که نگهداری آن لازم باشد.
🔒
پردازش با اولویت حریم خصوصی
تبدیل کاملاً در مرورگر شما با استفاده از JavaScript اجرا می‌شود. داده‌های XML شما روی دستگاه‌تان می‌ماند و هرگز به سروری ارسال نمی‌شود.
🔀
پشتیبانی از ویژگی‌ها و آرایه‌ها
ویژگی‌های XML به کلیدهای دارای پیشوند نگاشت می‌شوند. عناصر هم‌رده تکراری به صورت خودکار در دنباله‌های YAML گروه‌بندی می‌شوند و ساختارهای لیست حفظ می‌شوند.
📋
بدون نیاز به حساب کاربری
صفحه را باز کنید، XML را پیست کنید، نتیجه YAML را کپی کنید. بدون ثبت‌نام، بدون کلید API، بدون محدودیت نرخ یا سقف استفاده.

موارد استفاده از تبدیل XML به YAML

توسعه فرانت‌اند
قطعات پیکربندی XML از ابزارهای ساخت قدیمی (Ant، Maven) را به YAML برای pipeline‌های CI مدرن مانند GitHub Actions یا GitLab CI که فایل‌های پیکربندی YAML انتظار دارند تبدیل کنید.
مهندسی بک‌اند
تعریف‌های bean XML مربوط به Spring را به فرمت application.yml مربوط به Spring Boot مهاجرت دهید، یا بخش‌های app.config مربوط به .NET را برای استقرار کانتینر به YAML تبدیل کنید.
DevOps و زیرساخت
descriptor های استقرار مبتنی بر XML (server.xml مربوط به Tomcat، web.config مربوط به IIS) را به معادل‌های YAML برای مانیفست‌های Kubernetes، چارت‌های Helm یا playbook‌های Ansible تبدیل کنید.
تضمین کیفیت و آزمایش
فیکسچرهای آزمون XML یا پیکربندی JUnit را به YAML برای فریم‌ورک‌های آزمونی که از منابع داده YAML پشتیبانی می‌کنند تبدیل کنید، مانند pytest با فیکسچرهای YAML یا Robot Framework.
مهندسی داده
خروجی‌های داده XML از سیستم‌های سازمانی (SAP، Oracle) را برای مصرف توسط ابزارهای ETL مانند dbt یا Airflow که از پیکربندی و طرحواره‌های مبتنی بر 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)
Namespacesxmlns:ns="uri"Prefix preserved or stripped
Boolean-like text<flag>true</flag>flag: "true" (quoted to stay string)

XML در مقابل YAML: تفاوت‌های مدل داده

تبدیل بین XML و YAML یک تبادل ساده نحو نیست. این فرمت‌ها تفاوت‌های ساختاری بنیادی دارند که بر نحوه نمایش داده پس از تبدیل تأثیر می‌گذارند.

سیستم نوع
XML همه مقادیر را به عنوان رشته‌های متنی ذخیره می‌کند. YAML دارای بولین‌ها، اعداد صحیح، اعشاری و مقادیر تهی بومی است. در طول تبدیل، مقداری مانند «true» یا «3306» ممکن است به عنوان بولین یا عدد صحیح YAML تفسیر شود مگر اینکه مبدل آن را نقل‌قول کند. همیشه مقادیر حساس به نوع را در خروجی بررسی کنید.
ویژگی‌ها در مقابل کلیدها
عناصر XML می‌توانند علاوه بر عناصر فرزند و محتوای متنی، ویژگی‌ها هم داشته باشند. YAML فقط نگاشت‌های کلید-مقدار دارد. ویژگی‌ها باید به کلیدهای معمولی تبدیل شوند، معمولاً با پیشوندی مانند _ یا @ تا از عناصر فرزند متمایز شوند.
ترتیب و تکرار
XML ترتیب سند را حفظ می‌کند و عناصر هم‌رده با نام تگ یکسان را مجاز می‌شمارد. نگاشت‌های YAML طبق مشخصات بی‌ترتیب هستند (هرچند اکثر تجزیه‌گرها ترتیب درج را حفظ می‌کنند) و کلیدهای تکراری در YAML 1.2 ممنوع است. عناصر XML تکراری باید به یک دنباله YAML تبدیل شوند.

مثال‌های کد

در ادامه مثال‌های کاربردی برای تبدیل XML به YAML در JavaScript، Python، Go و خط فرمان آمده است. هر مثال عناصر تودرتو، ویژگی‌ها و تگ‌های هم‌رده تکراری را مدیریت می‌کند.

JavaScript (Node.js)
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
// →       - logging
Python
import 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))
CLI (xq + yq)
# 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
Go
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
}

سؤالات متداول

آیا تبدیل XML به YAML بدون اتلاف است؟
نه به طور کامل. ویژگی‌های XML، توضیحات، دستورالعمل‌های پردازش و بخش‌های CDATA معادل بومی YAML ندارند. ویژگی‌ها می‌توانند به عنوان کلیدهای دارای پیشوند (_attr یا @attr) حفظ شوند، اما توضیحات و دستورالعمل‌های پردازش دور انداخته می‌شوند. اگر نیاز به بازگشت به XML دارید، بررسی کنید که ویژگی‌ها و اعلان‌های فضای نام از تبدیل جان سالم به در برده‌اند.
ویژگی‌های XML چگونه در YAML نمایش داده می‌شوند؟
اکثر مبدل‌ها نام ویژگی‌ها را با زیرخط (_) یا @ پیشوند می‌دهند تا آن‌ها را از کلیدهای عنصر فرزند جدا کنند. به عنوان مثال، <server port="8080"> به server:\n _port: "8080" تبدیل می‌شود. پیشوند خاص به کتابخانه یا ابزاری که استفاده می‌کنید بستگی دارد.
در طول تبدیل چه اتفاقی برای عناصر XML تکراری می‌افتد؟
هنگامی که یک تگ عنصر یکسان چندین بار زیر یک والد ظاهر می‌شود، مبدل آن‌ها را در یک دنباله YAML (لیست) گروه‌بندی می‌کند. به عنوان مثال، دو عنصر هم‌رده <item> به item:\n - value1\n - value2 تبدیل می‌شوند. یک <item> منفرد به عنوان یک مقدار اسکالر باقی می‌ماند مگر اینکه حالت اجبار-آرایه فعال باشد.
آیا می‌توانم YAML را به XML تبدیل کنم؟
بله، اما نتیجه به نحوه مدیریت ویژگی‌ها و انواع در تبدیل اولیه بستگی دارد. اگر ویژگی‌ها با کلیدهای دارای پیشوند حفظ شده بودند، یک مبدل YAML به XML می‌تواند آن‌ها را بازسازی کند. ToolDeck یک ابزار YAML به XML برای جهت معکوس دارد. توجه داشته باشید که انواع بومی YAML (بولین‌ها، اعداد) در XML به رشته‌های متنی تبدیل می‌شوند.
چرا خروجی YAML برخی مقادیر را نقل‌قول می‌کند؟
YAML دارای انواع بومی است: true/false بولین هستند، اعداد خالص به اعداد صحیح یا اعشاری تبدیل می‌شوند و yes/no/on/off نیز در YAML 1.1 بولین هستند. اگر XML شما حاوی متنی مانند «true» یا «3306» باشد که باید رشته باقی بماند، مبدل آن را نقل‌قول می‌کند تا از تفسیر مجدد مقدار توسط تجزیه‌گرهای YAML جلوگیری کند. این رفتار صحیح است، نه یک خطا.
چگونه فایل‌های XML بزرگ را مدیریت کنم؟
مبدل‌های مبتنی بر مرورگر برای فایل‌های تا چند مگابایت به خوبی کار می‌کنند. برای فایل‌های بزرگ‌تر (۱۰ مگابایت به بالا)، از یک رویکرد جریانی استفاده کنید: XML را با iterparse پایتون یا sax در Node.js تجزیه کنید، شیء میانی را به صورت تدریجی بسازید، سپس به YAML سریال‌سازی کنید. ابزارهایی مانند yq نیز می‌توانند XML را مستقیماً از خط فرمان بدون بارگذاری کل سند در حافظه به YAML تبدیل کنند.
تفاوت بین تبدیل XML به YAML و XML به JSON چیست؟
هر دو تبدیل با چالش یکسان مواجه‌اند: نگاشت ویژگی‌های XML و عناصر تکراری به مدل داده متفاوت. تفاوت اصلی در فرمت خروجی است. JSON سخت‌گیر است (بدون توضیح، انواع صریح، نحو دقیق)، در حالی که YAML یک superset از JSON است که ویژگی‌های مناسب برای انسان اضافه می‌کند: توضیحات، رشته‌های چندخطی، لنگرها و نام‌مستعارها. JSON را انتخاب کنید وقتی مصرف‌کننده یک API یا محیط اجرایی JavaScript است. YAML را انتخاب کنید وقتی مصرف‌کننده یک انسان است که فایل‌های پیکربندی ویرایش می‌کند.