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-এ লেখা হয় কারণ এটি সংক্ষিপ্ত ও হাতে সম্পাদনা করা সহজ। W3C XML 1.0 স্পেসিফিকেশন দ্বারা সংজ্ঞায়িত XML দশকের পর দশক ধরে এন্টারপ্রাইজ সিস্টেম, SOAP ওয়েব সার্ভিস ও ডকুমেন্ট-কেন্দ্রিক কর্মপ্রবাহে ডিফল্ট ডেটা আদান-প্রদানের ফরম্যাট হয়ে আসছে। কোনো YAML-নির্মিত কনফিগারেশন XML-ভিত্তিক পাইপলাইনে যুক্ত করতে হলে রূপান্তর আবশ্যক।
YAML ও XML-এর মধ্যে ম্যাপিং এক-থেকে-এক নয়। YAML স্বাভাবিকভাবেই বুলিয়ান, পূর্ণসংখ্যা, দশমিক সংখ্যা ও null-এর মতো ডেটা টাইপ সমর্থন করে, আর XML সমস্ত কন্টেন্টকে টেক্সট হিসেবে বিবেচনা করে যদি না কোনো স্কিমা (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) | শুধুমাত্র টেক্সট (স্কিমা টাইপ যোগ করে) |
| মন্তব্য | # ইনলাইন মন্তব্য | <!-- ব্লক মন্তব্য --> |
| অ্যাট্রিবিউট | স্বাভাবিক সমর্থন নেই | হ্যাঁ (<tag attr="val">) |
| নেমস্পেস | সমর্থিত নয় | হ্যাঁ (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>