مبدل YAML به XML
تبدیل YAML به فرمت XML
ورودی YAML
خروجی XML
تبدیل 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
مرجع نگاشت انواع 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 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 در برابر XML: تفاوتهای فرمت
YAML و XML هر دو یک مسئله را حل میکنند — نمایش دادههای ساختاریافته — اما با مبادلات متفاوت. هیچکدام لزوماً بر دیگری برتری ندارد؛ انتخاب صحیح به این بستگی دارد که چه کسی یا چه چیزی داده را مصرف میکند.
| ویژگی | YAML | XML |
|---|---|---|
| نحو | مبتنی بر تورفتگی | مبتنی بر تگ (<tag>...</tag>) |
| انواع داده | بومی (string، int، bool، null، float) | فقط متن (schema انواع را اضافه میکند) |
| نظرات | نظرات خطی با # | <!-- نظرات بلوکی --> |
| Attribute | پشتیبانی بومی ندارد | بله (<tag attr="val">) |
| Namespace | پشتیبانی نمیشود | بله (xmlns:prefix) |
| حجم فایل | کوچکتر (بدون تگ بسته) | بزرگتر (تگهای طولانی) |
نمونههای کد
نحوه تبدیل به صورت برنامهای YAML به XML در زبانها و محیطهای مختلف:
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>