XML থেকে JSON
XML থেকে JSON ফরম্যাটে রূপান্তর করুন
XML ইনপুট
JSON আউটপুট
XML থেকে JSON রূপান্তর কী?
XML থেকে JSON রূপান্তর হলো Extensible Markup Language (XML) থেকে JavaScript Object Notation (JSON)-এ ডেটা রূপান্তরের প্রক্রিয়া। উভয় ফরম্যাটই কাঠামোগত, শ্রেণিবদ্ধ ডেটা উপস্থাপন করে, কিন্তু তারা ভিন্ন সিনট্যাক্স ও ডেটা মডেল ব্যবহার করে। XML ঐচ্ছিক অ্যাট্রিবিউট সহ ওপেনিং ও ক্লোজিং ট্যাগ ব্যবহার করে, আর JSON কী-মান জোড়া, অ্যারে এবং প্রিমিটিভ টাইপ ব্যবহার করে। XML থেকে JSON-এ রূপান্তর করলে আপনি এমন পরিবেশে XML ডেটা নিয়ে কাজ করতে পারেন যেখানে JSON হলো নেটিভ ফরম্যাট, যেমন JavaScript রানটাইম, REST API এবং NoSQL ডেটাবেস।
রূপান্তর সবসময় এক-থেকে-এক হয় না। XML-এর এমন কিছু কাঠামো আছে যার কোনো সরাসরি JSON সমতুল্য নেই: অ্যাট্রিবিউট, মিশ্র কন্টেন্ট (চাইল্ড এলিমেন্টের সাথে মিশ্রিত টেক্সট), প্রসেসিং ইনস্ট্রাকশন, কমেন্ট, CDATA সেকশন এবং নেমস্পেস ডিক্লারেশন। বিভিন্ন রূপান্তর লাইব্রেরি এই কাঠামোগুলো ভিন্নভাবে পরিচালনা করে, তাই একাধিক রীতি বিদ্যমান। সবচেয়ে প্রচলিত পদ্ধতি হলো অ্যাট্রিবিউটের নামে @ উপসর্গ যোগ করা এবং একই এলিমেন্টে অ্যাট্রিবিউট থাকলে টেক্সট কন্টেন্টকে #text ফিল্ডে রাখা।
SOAP থেকে REST-এ মাইগ্রেশন, পুরনো এন্টারপ্রাইজ API ব্যবহার, অথবা XML বাধ্যতামূলক করে এমন সরকারি ও আর্থিক ডেটা ফিড প্রক্রিয়া করার সময় XML থেকে JSON রূপান্তর একটি সাধারণ ধাপ। প্রোডিউসার ও কনজিউমার একসাথে পুনর্লিখন না করে, দলগুলো সীমানা স্তরে XML পেলোড রূপান্তর করে এবং নিচের দিকে JSON পাঠায়। AWS API Gateway, Apache Camel এবং MuleSoft সবই এই প্যাটার্ন নেটিভভাবে সমর্থন করে।
<bookstore>
<book category="fiction">
<title lang="en">The Great Gatsby</title>
<author>F. Scott Fitzgerald</author>
<year>1925</year>
<price>10.99</price>
</book>
<book category="non-fiction">
<title lang="en">Sapiens</title>
<author>Yuval Noah Harari</author>
<year>2011</year>
<price>14.99</price>
</book>
</bookstore>{
"bookstore": {
"book": [
{
"@category": "fiction",
"title": {
"@lang": "en",
"#text": "The Great Gatsby"
},
"author": "F. Scott Fitzgerald",
"year": "1925",
"price": "10.99"
},
{
"@category": "non-fiction",
"title": {
"@lang": "en",
"#text": "Sapiens"
},
"author": "Yuval Noah Harari",
"year": "2011",
"price": "14.99"
}
]
}
}অনলাইন XML থেকে JSON কনভার্টার কেন ব্যবহার করবেন?
একটি এককালীন রূপান্তর স্ক্রিপ্ট লিখতে সময় লাগে, বিশেষত যখন XML-এ অ্যাট্রিবিউট, নেমস্পেস বা পুনরাবৃত্ত এলিমেন্ট থাকে যেগুলো JSON অ্যারে হওয়া দরকার। একটি ব্রাউজার-ভিত্তিক কনভার্টার কয়েক সেকেন্ডে JSON আউটপুট দেয় যাতে আপনি কাঠামো পরীক্ষা করে এগিয়ে যেতে পারেন।
XML থেকে JSON রূপান্তরের ব্যবহারের ক্ষেত্র
XML থেকে JSON ম্যাপিং রেফারেন্স
XML ও JSON-এর ডেটা মডেল আলাদা। নিচের টেবিলটি দেখায় কীভাবে প্রতিটি XML কাঠামো সবচেয়ে প্রচলিত রীতিতে (অ্যাট্রিবিউটের জন্য @, অ্যাট্রিবিউটের পাশাপাশি থাকা টেক্সটের জন্য #text) JSON সমতুল্যে ম্যাপ হয়। কিছু কাঠামো, যেমন মিশ্র কন্টেন্ট ও কমেন্ট, JSON-এ কোনো মানসম্মত উপস্থাপনা নেই।
| XML কাঠামো | XML উদাহরণ | JSON সমতুল্য |
|---|---|---|
| Element | <name>text</name> | "name": "text" |
| Nested elements | <a><b>1</b></a> | "a": { "b": "1" } |
| Attributes | <el attr="v"/> | "el": { "@attr": "v" } |
| Text + attributes | <el a="1">text</el> | "el": { "@a": "1", "#text": "text" } |
| Repeated elements | <r><i>1</i><i>2</i></r> | "r": { "i": ["1", "2"] } |
| Mixed content | <p>A <b>B</b> C</p> | Varies by convention |
| CDATA | <![CDATA[raw]]> | "#cdata": "raw" or flattened |
| Namespaces | xmlns:prefix="uri" | Prefix preserved or stripped |
| Empty element | <el/> | "el": null or "" |
| Comments | <!-- note --> | Discarded (no JSON equivalent) |
XML থেকে JSON রীতির তুলনা
XML থেকে JSON ম্যাপিং কীভাবে হবে তার কোনো একক মানদণ্ড নেই। তিনটি রীতি ব্যাপকভাবে ব্যবহৃত হয়, প্রতিটিতে অ্যাট্রিবিউট পরিচালনা, অ্যারে শনাক্তকরণ এবং টেক্সট সংরক্ষণের ক্ষেত্রে আলাদা আপোস আছে।
কোড উদাহরণ
নিচে JavaScript, Python, Go এবং কমান্ড লাইনে XML থেকে JSON রূপান্তরের কার্যকরী উদাহরণ দেওয়া হলো। প্রতিটি উদাহরণ নেস্টেড এলিমেন্ট ও পুনরাবৃত্ত ভাই ট্যাগ পরিচালনা করে।
// Using the DOMParser API to walk XML and build a JSON object
function xmlToJson(xml) {
const parser = new DOMParser()
const doc = parser.parseFromString(xml, 'application/xml')
function nodeToObj(node) {
const obj = {}
// Handle attributes
if (node.attributes) {
for (const attr of node.attributes) {
obj['@' + attr.name] = attr.value
}
}
// Handle child nodes
for (const child of node.childNodes) {
if (child.nodeType === 3) { // text
const text = child.textContent.trim()
if (text) obj['#text'] = text
} else if (child.nodeType === 1) { // element
const key = child.nodeName
const val = nodeToObj(child)
if (obj[key]) {
if (!Array.isArray(obj[key])) obj[key] = [obj[key]]
obj[key].push(val)
} else {
obj[key] = val
}
}
}
// Simplify text-only nodes
const keys = Object.keys(obj)
if (keys.length === 1 && keys[0] === '#text') return obj['#text']
return obj
}
return nodeToObj(doc.documentElement)
}
const xml = '<user><name>Alice</name><role>admin</role></user>'
console.log(JSON.stringify(xmlToJson(xml), null, 2))
// → { "name": "Alice", "role": "admin" }import xmltodict
import json
xml = """
<user>
<name>Alice</name>
<roles>
<role>admin</role>
<role>editor</role>
</roles>
</user>
"""
# xmltodict converts XML to an OrderedDict
result = xmltodict.parse(xml)
print(json.dumps(result, indent=2))
# → {
# → "user": {
# → "name": "Alice",
# → "roles": { "role": ["admin", "editor"] }
# → }
# → }
# With the standard library (xml.etree.ElementTree)
import xml.etree.ElementTree as ET
def etree_to_dict(elem):
d = {}
if elem.attrib:
d.update({f"@{k}": v for k, v in elem.attrib.items()})
for child in elem:
child_data = etree_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(child_data)
else:
d[child.tag] = child_data
if elem.text and elem.text.strip():
if d:
d["#text"] = elem.text.strip()
else:
return elem.text.strip()
return d
root = ET.fromstring(xml)
print(json.dumps(etree_to_dict(root), indent=2))package main
import (
"encoding/json"
"encoding/xml"
"fmt"
"strings"
)
// For simple, known schemas — define a struct
type User struct {
XMLName xml.Name `xml:"user"`
Name string `xml:"name"`
Roles []string `xml:"roles>role"`
}
func main() {
data := `<user><name>Alice</name><roles><role>admin</role><role>editor</role></roles></user>`
var user User
xml.NewDecoder(strings.NewReader(data)).Decode(&user)
out, _ := json.MarshalIndent(user, "", " ")
fmt.Println(string(out))
// → { "Name": "Alice", "Roles": ["admin", "editor"] }
}# Using xq (part of yq, a jq wrapper for XML)
# Install: pip install yq OR brew install yq
echo '<user><name>Alice</name></user>' | xq .
# → { "user": { "name": "Alice" } }
# Using xmlstarlet + jq
xmlstarlet sel -t -v '//name' input.xml | jq -R '{ name: . }'
# Node.js one-liner with xml2js
echo '<a><b>1</b></a>' | node -e "
const {parseString} = require('xml2js');
let d=''; process.stdin.on('data',c=>d+=c);
process.stdin.on('end',()=>parseString(d,(e,r)=>console.log(JSON.stringify(r,null,2))))
"