ToolDeck

مبدل YAML به XML

تبدیل YAML به فرمت XML

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

ورودی YAML

خروجی XML

به‌صورت محلی اجرا می‌شود · جای‌گذاری اسرار امن است
XML اینجا نمایش داده می‌شود…
همچنین امتحان کنید:تبدیل YAML به JSON

تبدیل YAML به XML چیست؟

تبدیل YAML به XML داده‌هایی را که به صورت YAML (YAML Ain't Markup Language) نوشته شده‌اند به XML (Extensible Markup Language) تبدیل می‌کند. YAML از تورفتگی و نشانه‌گذاری حداقلی برای نمایش داده‌های ساختاریافته استفاده می‌کند، در حالی که XML از تگ‌های باز و بسته با سلسله‌مراتب صریح استفاده می‌کند. تبدیل میان این دو یک کار رایج است هنگامی که سیستم‌هایی که از XML استفاده می‌کنند باید داده‌هایی را که در اصل در YAML نوشته شده‌اند دریافت کنند.

YAML برای خوانایی انسانی طراحی شده است. فایل‌های پیکربندی ابزارهایی مانند Kubernetes، Ansible، Docker Compose و GitHub Actions به دلیل فشردگی و سادگی ویرایش دستی به YAML نوشته می‌شوند. XML که توسط مشخصات W3C XML 1.0 تعریف شده، برای چند دهه فرمت پیش‌فرض تبادل داده در سیستم‌های سازمانی، سرویس‌های وب SOAP و گردش‌کارهای سندمحور بوده است. وقتی یک پیکربندی نوشته‌شده در YAML باید وارد یک خط لوله مبتنی بر XML شود، تبدیل ضروری است.

تطابق میان YAML و XML یک‌به‌یک نیست. YAML به صورت بومی از انواع داده‌ای مانند boolean، integer، float و null پشتیبانی می‌کند، در حالی که XML همه محتوا را به عنوان متن در نظر می‌گیرد مگر اینکه یک schema (XSD یا DTD) انواع را به صورت خارجی تعریف کند. دنباله‌های YAML (لیست‌ها) معادل مستقیمی در XML ندارند و باید به صورت عناصر تکراری نمایش داده شوند. آشنایی با این تفاوت‌ها به شما کمک می‌کند خروجی را پیش‌بینی کرده و از نتایج غیرمنتظره جلوگیری کنید.

چرا از این مبدل YAML به XML استفاده کنیم؟

بازنویسی دستی YAML به عنوان XML خسته‌کننده و مستعد خطاست، به‌ویژه برای ساختارهای تودرتوی عمیق. این مبدل ترجمه ساختاری را به صورت فوری انجام می‌دهد.

تبدیل فوری
YAML را وارد کنید یا بچسبانید و بلافاصله خروجی XML قالب‌بندی‌شده دریافت کنید. برای تبدیل‌های یک‌باره نیازی به نوشتن اسکریپت یا نصب ابزار CLI نیست.
🔒
پردازش با رعایت حریم خصوصی
تمام تبدیل در مرورگر شما اجرا می‌شود. داده‌های YAML شما که اغلب شامل آدرس سرورها، اعتبارنامه‌ها و جزئیات زیرساخت هستند، هرگز دستگاه شما را ترک نمی‌کنند.
📋
بدون نیاز به حساب کاربری
بدون ثبت‌نام، ورود به سیستم یا ارائه ایمیل از مبدل استفاده کنید. صفحه را باز کنید و شروع به تبدیل کنید.
🌐
پشتیبانی از ساختارهای تودرتو
از نگاشت‌های تودرتوی عمیق، دنباله‌ها، انواع مختلط و رشته‌های چندخطی در YAML پشتیبانی می‌کند. خروجی سلسله‌مراتب را با تورفتگی صحیح XML حفظ می‌کند.

کاربردهای تبدیل YAML به XML

توسعه Frontend
داده‌های ماک YAML را برای آزمایش تجزیه‌کننده‌های XML، تبدیل‌های XSLT یا کامپوننت‌هایی که انتظار پاسخ‌های XML از API دارند به فرمت XML تبدیل کنید.
یکپارچه‌سازی Backend
پیکربندی YAML را هنگام یکپارچه‌سازی با سرویس‌های Java قدیمی که از Spring XML config، فایل‌های Maven POM یا اندپوینت‌های SOAP استفاده می‌کنند به XML تبدیل کنید.
DevOps و CI/CD
مانیفست‌های YAML مربوط به Kubernetes یا Ansible را برای ابزارهایی که نیاز به ورودی XML دارند، مانند پیکربندی‌های Jenkins pipeline یا برخی سیستم‌های مانیتورینگ، به XML تبدیل کنید.
QA و آزمایش
فیکسچرهای آزمون XML را از تعاریف YAML تولید کنید. YAML به عنوان داده آزمون راحت‌تر نگهداری می‌شود و تبدیل به XML در زمان آزمون، فیکسچرها را خوانا نگه می‌دارد.
مهندسی داده
پیکربندی‌های ETL یا تعاریف schema با فرمت YAML را برای خطوط لوله‌ای که از XML استفاده می‌کنند به XML تبدیل کنید. این کار در حوزه بهداشت (HL7)، مالی (FpML) و سیستم‌های داده دولتی رایج است.
یادگیری و نمونه‌سازی
دانشجویان و تازه‌واردان می‌توانند YAML را وارد کرده و ساختار XML معادل را در کنار آن مشاهده کنند، که به ایجاد درک شهودی از نحوه نگاشت داده‌های سلسله‌مراتبی میان فرمت‌ها کمک می‌کند.

مرجع نگاشت انواع YAML به XML

انواع داده YAML مستقیماً به XML نگاشت نمی‌شوند. این جدول نشان می‌دهد هر سازه YAML چگونه به معادل XML خود تبدیل می‌شود. آشنایی با این قوانین به شما کمک می‌کند خروجی را پیش‌بینی کرده و نتایج غیرمنتظره را عیب‌یابی کنید.

نوع YAMLمثال YAMLخروجی XML
Mapping (key: value){ name: Alice }<name>Alice</name>
Sequence (- item)- apple\n- banana<item>apple</item><item>banana</item>
Nested mappinguser:\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>
Nullvalue: null<value/>
Multiline stringbio: |\n Line one\n Line two<bio>Line one\nLine two</bio>

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

YAML و XML هر دو یک مسئله را حل می‌کنند — نمایش داده‌های ساختاریافته — اما با مبادلات متفاوت. هیچ‌کدام لزوماً بر دیگری برتری ندارد؛ انتخاب صحیح به این بستگی دارد که چه کسی یا چه چیزی داده را مصرف می‌کند.

YAML
مبتنی بر فضای سفید، بدون تگ بسته. از انواع بومی (bool، int، float، null) پشتیبانی می‌کند. نظرات با #. فشرده برای پیکربندی و ویرایش انسانی. توسط کتابخانه‌هایی مانند PyYAML، js-yaml و gopkg.in/yaml تجزیه می‌شود.
XML
مبتنی بر تگ با جفت‌های باز/بسته صریح. همه مقادیر به طور پیش‌فرض متن هستند؛ انواع نیاز به schema (XSD) دارند. از attribute، namespace، محتوای مختلط و دستورالعمل‌های پردازش پشتیبانی می‌کند. توسط کتابخانه استاندارد هر زبان اصلی تجزیه می‌شود.
ویژگیYAMLXML
نحومبتنی بر تورفتگیمبتنی بر تگ (&lt;tag&gt;...&lt;/tag&gt;)
انواع دادهبومی (string، int، bool، null، float)فقط متن (schema انواع را اضافه می‌کند)
نظراتنظرات خطی با #<!-- نظرات بلوکی -->
Attributeپشتیبانی بومی نداردبله (&lt;tag attr="val"&gt;)
Namespaceپشتیبانی نمی‌شودبله (xmlns:prefix)
حجم فایلکوچک‌تر (بدون تگ بسته)بزرگ‌تر (تگ‌های طولانی)

نمونه‌های کد

نحوه تبدیل به صورت برنامه‌ای YAML به XML در زبان‌ها و محیط‌های مختلف:

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

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

آیا دنباله‌های YAML می‌توانند در XML نمایش داده شوند؟
بله، اما XML نوع لیست بومی ندارد. دنباله‌های YAML معمولاً به عناصر XML تکراری با همان نام تگ تبدیل می‌شوند. برای مثال، یک لیست YAML زیر کلید "items" به چندین عنصر فرزند &lt;item&gt; تبدیل می‌شود. برخی مبدل‌ها آن‌ها را در یک عنصر والد &lt;items&gt; برای وضوح بیشتر می‌پوشانند.
در حین تبدیل چه اتفاقی برای نظرات YAML می‌افتد؟
نظرات YAML (خطوطی که با # شروع می‌شوند) در حین تبدیل حذف می‌شوند. اکثر تجزیه‌کننده‌های YAML هنگام ساختن ساختار داده، نظرات را حذف می‌کنند، بنابراین برای خروجی XML در دسترس نیستند. اگر نیاز دارید نظرات را حفظ کنید، به یک تجزیه‌کننده YAML نیاز دارید که آن‌ها را نگه می‌دارد، مانند ruamel.yaml در Python.
چگونه anchor و alias های YAML مدیریت می‌شوند؟
anchor های YAML (&name) و alias های آن (*name) قبل از تبدیل پردازش می‌شوند. تجزیه‌کننده alias ها را به مقادیر کامل‌شان گسترش می‌دهد، بنابراین XML حاصل داده کامل را بدون هیچ مرجع anchor ای شامل می‌شود. این به معنای آن است که خروجی XML ممکن است از ورودی YAML بزرگ‌تر باشد اگر از anchor ها برای جلوگیری از تکرار استفاده شده باشد.
آیا تبدیل برگشت‌پذیر است (XML به YAML)؟
تا حدی. می‌توانید XML را به YAML تبدیل کنید، اما نتیجه ممکن است دقیقاً با YAML اصلی مطابقت نداشته باشد. attribute های XML معادل مستقیمی در YAML ندارند و معمولاً به عنوان کلیدهای خاص نمایش داده می‌شوند (مثلاً @attribute). اطلاعات نوع نیز از دست می‌رود زیرا XML همه چیز را به عنوان متن در نظر می‌گیرد، بنابراین اعداد و مقادیر boolean در YAML اصلی پس از یک دور رفت‌وبرگشت به رشته تبدیل می‌شوند.
هنگام تبدیل از YAML چگونه با attribute های XML کار کنم؟
YAML مفهوم بومی attribute ندارد. یک قرارداد رایج این است که کلیدها را با @ پیشوند بزنیم تا نشان دهیم باید به جای عناصر فرزند، attribute های XML شوند. برای مثال، "@id: 42" زیر یک نگاشت، &lt;element id="42"&gt; تولید می‌کند. این قرارداد توسط کتابخانه‌هایی مانند xml-js و xmltodict استفاده می‌شود.
حداکثر حجم فایل YAML که این ابزار می‌تواند مدیریت کند چقدر است؟
مبدل در مرورگر شما اجرا می‌شود، بنابراین محدودیت به حافظه در دسترس دستگاه شما بستگی دارد. فایل‌هایی تا چند مگابایت روی سخت‌افزار مدرن بدون مشکل تبدیل می‌شوند. برای فایل‌های بسیار بزرگ (۵۰ مگابایت به بالا)، از یک ابزار خط فرمان مانند yq یا یک اسکریپت Python با PyYAML و lxml استفاده کنید که streaming و حافظه را کارآمدتر مدیریت می‌کنند.
چرا YAML من خروجی XML نامعتبر تولید می‌کند؟
رایج‌ترین دلیل، کلیدهای YAML هستند که نام‌های عنصر XML معتبری نیستند. نام‌های عنصر XML نمی‌توانند با عدد شروع شوند، فضای خالی داشته باشند یا از اکثر کاراکترهای خاص استفاده کنند. کلیدهایی مانند "2nd-item" یا "my key" XML نامعتبر تولید می‌کنند. نام‌های مشکل‌دار را تغییر نام دهید یا از مبدلی استفاده کنید که نام‌ها را به صورت خودکار پاکسازی می‌کند (مثلاً جایگزین کردن فضاهای خالی با زیرخط و قرار دادن زیرخط قبل از نام‌هایی که با عدد شروع می‌شوند).