CSV থেকে XML রূপান্তর কী?
CSV থেকে XML রূপান্তর কমা-বিভাজিত মানগুলোকে Extensible Markup Language (XML) নথিতে পরিণত করে। CSV-এর প্রতিটি সারি একটি XML উপাদানে পরিণত হয় এবং প্রতিটি কলাম হেডার একটি চাইল্ড উপাদান ট্যাগ নামে রূপান্তরিত হয়। ফলাফল হিসেবে পাওয়া যায় একটি শ্রেণিবদ্ধ, স্বব্যাখ্যামূলক নথি — যা সিস্টেম স্কিমার (XSD বা DTD) বিপরীতে যাচাই করতে পারে এবং XSLT, XPath, SAX/DOM পার্সারের মতো মানক XML টুল দিয়ে প্রক্রিয়া করতে পারে।
W3C ১৯৯৮ সালে XML 1.0 স্পেসিফিকেশন প্রকাশ করার পর থেকে XML ডেটা বিনিময়ের একটি মানদণ্ড হয়ে আসছে। অনেক ওয়েব API-এ JSON এখন XML-কে প্রতিস্থাপন করেছে, তবে SOAP ওয়েব সার্ভিস, RSS/Atom ফিড, SVG গ্রাফিক্স, Office Open XML নথি (.docx, .xlsx), Android রিসোর্স ফাইল, Maven/Gradle বিল্ড কনফিগ, এবং স্বাস্থ্যসেবা (HL7 CDA), অর্থায়ন (FpML, XBRL) ও সরকারি (NIEM) খাতের মতো নিয়ন্ত্রিত শিল্পে XML এখনও আবশ্যক ফরম্যাট। যখন আপনার উৎস ডেটা স্প্রেডশিট বা ডেটাবেজ এক্সপোর্ট, তখন CSV থেকে XML রূপান্তরই এসব সিস্টেমে ডেটা পাঠানোর পথ।
একটি সঠিক CSV থেকে XML রূপান্তরকারীকে RFC 4180-এর প্রান্তিক ক্ষেত্রগুলো সামলাতে হয়: কমা বা নতুন লাইন সম্বলিত উদ্ধৃত ক্ষেত্র, এস্কেপ করা দ্বিগুণ উদ্ধৃতিচিহ্ন এবং ভিন্ন বিভাজক। XML পক্ষে, এটিকে পাঁচটি পূর্বনির্ধারিত XML এনটিটি এস্কেপ করতে হবে (& < > " '), হেডার থেকে বৈধ উপাদান নাম তৈরি করতে হবে (ফাঁকা জায়গা ও বিশেষ অক্ষর প্রতিস্থাপন করে), এবং সঠিক XML ঘোষণা ও সামঞ্জস্যপূর্ণ এনকোডিং সহ সুগঠিত আউটপুট তৈরি করতে হবে।
CSV থেকে XML কনভার্টার কেন ব্যবহার করবেন?
স্প্রেডশিট ডেটা থেকে হাতে XML লেখা ধীরগতির ও ত্রুটিপ্রবণ। একটি ক্লোজিং ট্যাগ বাদ দেওয়া বা অ্যাম্পার্স্যান্ড এস্কেপ করতে ভুলে যাওয়া অবৈধ XML তৈরি করে যা পরবর্তী পার্সারগুলোকে ভেঙে দেয়। এই কনভার্টার একটি ধাপেই পার্সিং, এস্কেপিং এবং উপাদান তৈরি সম্পন্ন করে।
CSV থেকে XML ব্যবহারের ক্ষেত্র
CSV থেকে XML ম্যাপিং রেফারেন্স
একটি CSV ফাইলের প্রতিটি অংশ XML কাঠামোতে কীভাবে ম্যাপ হয় তা বোঝা আউটপুট ফরম্যাট পূর্বানুমান করতে এবং রূপান্তরের আগে ডেটা সামঞ্জস্য করতে সাহায্য করে।
| CSV ধারণা | XML সমতুল্য | বিবরণ |
|---|---|---|
| CSV file | XML document | The entire file maps to a root element containing all records |
| Header row | Element tag names | Each column header becomes the tag name for child elements |
| Data row | <row> element | Each row becomes a repeating child element of the root |
| Cell value | Text node | Cell content becomes the text inside the corresponding tag |
| Empty cell | Empty element or omitted | Can be rendered as <field/> or excluded from output |
| Comma delimiter | XML structure | Delimiters are replaced by element nesting and closing tags |
CSV বনাম XML
CSV একটি সমতল, বিভাজক-ভিত্তিক ফরম্যাট যাতে কোনো অন্তর্নির্মিত স্কিমা বা ডেটা টাইপ নেই। XML একটি শ্রেণিবদ্ধ, স্বব্যাখ্যামূলক মার্কআপ ভাষা যা স্কিমা, নেমস্পেস এবং জটিল নেস্টিং সমর্থন করে। এদের মধ্যে পছন্দ আপনার ডাউনস্ট্রিম সিস্টেমের প্রয়োজনীয়তার উপর নির্ভর করে।
কোড উদাহরণ
নিচে বিভিন্ন ভাষায় CSV থেকে XML রূপান্তরের কার্যকরী উদাহরণ দেওয়া হলো। প্রতিটি উদাহরণ CSV হেডার সারিকে উপাদান ট্যাগ নাম হিসেবে পার্স করে, প্রতিটি ডেটা সারিকে একটি ধারক উপাদানে মোড়ায়, এবং কক্ষের কন্টেন্টে XML এনটিটি এস্কেপ করে।
// CSV string → XML with proper escaping
const csv = `name,age,city
Alice,30,Berlin
Bob,25,Tokyo`
function csvToXml(csv, rootTag = 'data', rowTag = 'row') {
const rows = csv.trim().split('\n').map(r => r.split(','))
const [headers, ...data] = rows
const xmlRows = data.map(row => {
const fields = headers.map((h, i) => {
const val = (row[i] || '').replace(/&/g, '&')
.replace(/</g, '<').replace(/>/g, '>')
return ` <${h}>${val}</${h}>`
}).join('\n')
return ` <${rowTag}>\n${fields}\n </${rowTag}>`
}).join('\n')
return `<?xml version="1.0" encoding="UTF-8"?>\n<${rootTag}>\n${xmlRows}\n</${rootTag}>`
}
console.log(csvToXml(csv))
// → <?xml version="1.0" encoding="UTF-8"?>
// → <data><row><name>Alice</name><age>30</age>...</row>...</data>import csv, io
from xml.etree.ElementTree import Element, SubElement, tostring
from xml.dom.minidom import parseString
csv_string = """name,age,city
Alice,30,Berlin
Bob,25,Tokyo"""
reader = csv.DictReader(io.StringIO(csv_string))
root = Element('data')
for row in reader:
row_el = SubElement(root, 'row')
for key, value in row.items():
child = SubElement(row_el, key)
child.text = value
# Pretty-print with declaration
raw = tostring(root, encoding='unicode')
pretty = parseString(raw).toprettyxml(indent=' ')
print(pretty)
# → <?xml version="1.0" ?>
# → <data>
# → <row>
# → <name>Alice</name>
# → <age>30</age>
# → <city>Berlin</city>
# → </row>
# → ...
# → </data>package main
import (
"encoding/csv"
"encoding/xml"
"fmt"
"os"
"strings"
)
type Field struct {
XMLName xml.Name
Value string `xml:",chardata"`
}
type Row struct {
XMLName xml.Name `xml:"row"`
Fields []Field
}
type Data struct {
XMLName xml.Name `xml:"data"`
Rows []Row
}
func main() {
input := "name,age,city\nAlice,30,Berlin\nBob,25,Tokyo"
r := csv.NewReader(strings.NewReader(input))
records, _ := r.ReadAll()
headers := records[0]
var data Data
for _, rec := range records[1:] {
row := Row{}
for i, h := range headers {
row.Fields = append(row.Fields, Field{
XMLName: xml.Name{Local: h},
Value: rec[i],
})
}
data.Rows = append(data.Rows, row)
}
out, _ := xml.MarshalIndent(data, "", " ")
fmt.Println(xml.Header + string(out))
// → <?xml version="1.0" encoding="UTF-8"?>
// → <data><row><name>Alice</name>...</row>...</data>
}# Using Python's csv and xml modules via one-liner
python3 -c "
import csv, sys
from xml.etree.ElementTree import Element, SubElement, tostring
from xml.dom.minidom import parseString
reader = csv.DictReader(sys.stdin)
root = Element('data')
for row in reader:
r = SubElement(root, 'row')
for k, v in row.items():
SubElement(r, k).text = v
print(parseString(tostring(root, encoding='unicode')).toprettyxml(indent=' '))
" < data.csv
# Using Miller (mlr) — a dedicated CSV/JSON/XML tool
mlr --icsv --oxml cat data.csv