تبدیل CSV به XML چیست؟
تبدیل CSV به XML، مقادیر جداشده با کاما را به اسناد Extensible Markup Language (XML) تبدیل میکند. هر سطر CSV به یک عنصر XML تبدیل میشود و هر سرصفحه ستون به نام یک عنصر فرزند تبدیل میشود. نتیجه یک سند سلسلهمراتبی و خودگویا است که سیستمها میتوانند آن را در برابر یک اسکیما (XSD یا DTD) اعتبارسنجی کنند و با ابزارهای استاندارد XML مانند XSLT، XPath و تجزیهکنندههای SAX/DOM پردازش کنند.
XML از زمانی که W3C مشخصات XML 1.0 را در سال ۱۹۹۸ منتشر کرد، بهعنوان استاندارد تبادل داده شناخته میشود. اگرچه JSON در بسیاری از APIهای وب جای XML را گرفته است، XML همچنان فرمت موردنیاز برای سرویسهای وب SOAP، فیدهای RSS/Atom، گرافیکهای SVG، اسناد Office Open XML (مانند .docx و .xlsx)، فایلهای منبع Android، پیکربندیهای ساخت Maven/Gradle و صنایع تنظیمشدهای مانند بهداشت (HL7 CDA)، امور مالی (FpML، XBRL) و دولت (NIEM) است. وقتی داده منبع شما یک صفحهگسترده یا صادرات پایگاه داده باشد، تبدیل CSV به XML روش ورود آن به این سیستمهاست.
یک مبدل صحیح CSV به XML باید حالتهای خاص RFC 4180 را مدیریت کند: فیلدهای نقلقولدار حاوی کاما یا خط جدید، گیومههای دوتایی escapeشده و جداکنندههای متفاوت. در طرف XML نیز باید پنج موجودیت از پیشتعریفشده XML را escape کند (& < > " ')، نام عناصر معتبری از سرصفحهها تولید کند (با جایگزینی فاصلهها و کاراکترهای غیرمجاز) و خروجی خوشساخت با اعلان XML مناسب و کدگذاری یکنواخت تولید کند.
چرا از مبدل CSV به XML استفاده کنیم؟
نوشتن XML بهصورت دستی از دادههای صفحهگسترده کند و مستعد خطاست. یک تگ بستهشده فراموششده یا علامت & بدون escape، XML نامعتبری تولید میکند که تجزیهکنندههای پاییندست را خراب میکند. این مبدل تجزیه، escape کردن و تولید عنصر را در یک مرحله انجام میدهد.
موارد استفاده تبدیل 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 را در محتوای سلول escape میکند.
// 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