XML থেকে YAML
XML থেকে YAML ফরম্যাটে রূপান্তর করুন
XML ইনপুট
YAML আউটপুট
XML থেকে YAML রূপান্তর কী?
XML থেকে YAML রূপান্তর হলো Extensible Markup Language (XML) থেকে YAML Ain't Markup Language (YAML)-এ ডেটা রূপান্তরের প্রক্রিয়া। XML অ্যাঙ্গেল-ব্র্যাকেট ট্যাগ ও অ্যাট্রিবিউট ব্যবহার করে শ্রেণিবদ্ধ ডেটা বর্ণনা করে, আর YAML একই কাঠামো ইন্ডেন্টেশন ও সাধারণ-টেক্সট কী-মান জোড়ার মাধ্যমে উপস্থাপন করে। XML থেকে YAML-এ অনলাইনে রূপান্তর করা একটি সাধারণ কাজ যখন Java Spring, Maven বা .NET-এর মতো XML-কেন্দ্রিক সিস্টেম থেকে Kubernetes, Ansible, GitHub Actions এবং Docker Compose-এর মতো YAML-পছন্দী প্ল্যাটফর্মে কনফিগারেশন মাইগ্রেট করা হয়।
দুটি ফরম্যাটের ডেটা মডেল আলাদা। XML ডিফল্টভাবে সবকিছু টেক্সট হিসেবে বিবেচনা করে এবং টাইপ নিশ্চিত করতে স্কিমা সংজ্ঞা (XSD, DTD) ব্যবহার করে। YAML-এর নেটিভ টাইপ আছে: স্ট্রিং, পূর্ণসংখ্যা, দশমিক, বুলিয়ান, নাল, সিকোয়েন্স (অ্যারে) এবং ম্যাপিং (অবজেক্ট)। রূপান্তরের সময় "true", "5432" এবং "3.14"-এর মতো মান YAML নেটিভ টাইপ হিসেবে ব্যাখ্যা হতে পারে। একটি সতর্ক কনভার্টার মূল টেক্সট হিসেবে রাখতে এই মানগুলো উদ্ধৃতিচিহ্নে রাখে।
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-এর মধ্যে রূপান্তর কেবল সিনট্যাক্স বদলানো নয়। ফরম্যাটগুলোর মৌলিক কাঠামোগত পার্থক্য আছে যা রূপান্তরের পরে ডেটা কীভাবে উপস্থাপিত হয় তা প্রভাবিত করে।
কোড উদাহরণ
নিচে JavaScript, Python, Go এবং কমান্ড লাইনে XML থেকে YAML রূপান্তরের কার্যকরী উদাহরণ দেওয়া হলো। প্রতিটি উদাহরণ নেস্টেড এলিমেন্ট, অ্যাট্রিবিউট এবং পুনরাবৃত্ত sibling এলিমেন্ট পরিচালনা করে।
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
}