CSV'den XML'e Dönüşüm Nedir?
CSV'den XML'e dönüşüm, virgülle ayrılmış değerleri Genişletilebilir İşaretleme Dili (XML) belgelerine dönüştürür. CSV'nin her satırı bir XML öğesine, her sütun başlığı ise bir alt öğe etiketi adına dönüşür. Sonuç, sistemlerin bir şemaya (XSD veya DTD) karşı doğrulayabileceği ve XSLT, XPath ile SAX/DOM ayrıştırıcıları gibi standart XML araçlarıyla işleyebileceği hiyerarşik, kendini tanımlayan bir belgedir.
XML, W3C'nin 1998'de XML 1.0 belirtimini yayımlamasından bu yana bir veri alışveriş standardı olmuştur. JSON pek çok web API'sinde XML'in yerini almış olsa da XML; SOAP web servisleri, RSS/Atom beslemeleri, SVG grafikleri, Office Open XML belgeleri (.docx, .xlsx), Android kaynak dosyaları, Maven/Gradle yapı yapılandırmaları ve sağlık (HL7 CDA), finans (FpML, XBRL) ile kamu (NIEM) gibi düzenlenmiş sektörler için zorunlu biçim olmaya devam etmektedir. Kaynak verileriniz bir elektronik tablo veya veritabanı dışa aktarımıysa CSV'den XML'e dönüşüm bu sistemlere veri aktarmanın yoludur.
Doğru bir CSV'den XML'e dönüştürücü; tırnaklı alanlardaki virgülleri veya yeni satırları, kaçırılmış çift tırnakları ve değişen ayırıcıları kapsayan RFC 4180 uç durumlarını ele almalıdır. XML tarafında ise beş önceden tanımlanmış XML varlığını kaçırmalı (&, <, >, ", '), başlıklardan geçerli öğe adları üretmeli (boşlukları ve özel karakterleri değiştirerek) ve uygun bir XML bildirimi ile tutarlı kodlama içeren iyi biçimlendirilmiş çıktı oluşturmalıdır.
Neden CSV'den XML'e Dönüştürücü Kullanmalısınız?
Elektronik tablo verilerinden XML'i elle yazmak yavaş ve hataya açıktır. Bir kapanış etiketinin eksikliği veya bir & işaretinin kaçırılmaması, sonraki ayrıştırıcıları bozan geçersiz XML üretir. Bu dönüştürücü, ayrıştırmayı, kaçırmayı ve öğe oluşturmayı tek adımda gerçekleştirir.
CSV'den XML'e Kullanım Senaryoları
CSV'den XML'e Eşleme Başvurusu
Bir CSV dosyasının her bölümünün XML yapısıyla nasıl eşleştiğini anlamak, çıktı biçimini öngörmenize ve verilerinizi dönüşümden önce düzenlemenize yardımcı olur.
| CSV Kavramı | XML Karşılığı | Ayrıntılar |
|---|---|---|
| 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 ve XML Karşılaştırması
CSV, yerleşik şema veya veri türleri olmayan düz, ayırıcı tabanlı bir biçimdir. XML ise şemaları, ad alanlarını ve karmaşık iç içe yapıyı destekleyen hiyerarşik, kendini tanımlayan bir işaretleme dilidir. İkisi arasındaki seçim, kullandığınız sistemin gereksinimlerine bağlıdır.
Kod Örnekleri
Aşağıda farklı dillerde CSV'den XML'e dönüşümün çalışan örnekleri yer almaktadır. Her örnek, CSV başlık satırını öğe etiketi adları olarak ayrıştırır, her veri satırını bir kapsayıcı öğeye sarar ve hücre içeriğindeki XML varlıklarını kaçırır.
// 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